kNNを実行する際には、1つのことを覚えておく必要があります。つまり、厳密に数学的に導出されたアルゴリズムではなく、1つの直感に基づく単純な分類子/リグレッサーです-引数が変化しない場合、基になる関数はあまり変化しませんずっと。または言い換えれば、基礎となる関数は局所的にほぼ一定です。この仮定により、最も近いkポイントの値の(おそらく重み付けされた)平均により、任意のポイントの基になる関数の値を推定できます。
これを念頭に置いておくと、多数決で明確な勝者がいない場合に何をすべきかについて明確な必須事項がないことに気付くことができます。常に奇数のkを使用するか、単射の重み付けを使用できます。
隣接する3〜5が関心のあるポイントから同じ距離にある場合、2つだけを使用するか、5つすべてを使用できます。繰り返しますが、kNNは複雑な数学的分析から派生したアルゴリズムではなく、シンプルな直感。これらの特殊なケースにどう対処するかは、あなた次第です。
1| | x−y| |2、または距離が小さい場合は比較的大きく、ポイント間の距離が大きい場合は比較的小さい(おそらく、連続したメトリック関数の逆)。
今年のNIPSでSamory KpotufeとAbdeslam Boulariasが適切な重みを見つける問題に触れた素晴らしい論文もありました。それらの一般的な直観は、基礎となる関数が異なる方向で異なるように変化することです(つまり、その異なる偏導関数は異なる大きさです)。したがって、この直観に従ってメトリック/重み付けを何らかの意味で変更するのが賢明です。彼らはこのトリックが一般的にkNNとカーネル回帰のパフォーマンスを改善すると主張し、彼らはこの主張を裏付けるいくつかの理論的結果さえ持っていると思う(それらの理論的結果が実際に主張するものがわからないが、私は行く時間がなかったまだ全体の紙を通して)。論文は、彼らのサイトから無料でダウンロードするか、グーグル「グラディエントウェイトがノンパラメトリックリグレッサーを助ける」後にダウンロードできます。
ここで、適切なk、メトリック、重み付け、ドローがあるときに実行するアクションなどを見つける方法を知りたいと思うでしょう。悲しいことは、いくつかの深い思考の後に正しいハイパーパラメーターに到達するのは基本的に難しいことです。おそらく、ハイパーパラメーターの異なる束をテストし、どの検証セットでうまく機能するかを確認する必要があります。いくつかの計算リソースがあり、適切なパラメーターを適切なハイパーパラメーターセットに自動的に到達させたい場合は、その設定で微分フリー最適化のためにGaussianプロセスを使用するという最近のアイデアがあります(非常に気に入っています)。
詳細に説明します-ハイパーパラメーターのセット(つまり、検証データのエラーを最小化する)を見つけることは、最適化の問題と見なすことができます。残念ながら、この設定では、最適化しようとする関数の勾配を取得できません(これは、通常、勾配降下またはいくつかの高度な方法を実行するために行いたいことです)。この設定では、ガウス過程を使用して、大きな可能性を秘めたハイパーパラメーターのセットを見つけて、それまでに見つけた最高のものよりも優れたパフォーマンスを発揮することができます。したがって、いくつかのハイパーパラメーターのセットを使用してアルゴリズムを繰り返し実行してから、次に試行するのに最適なアルゴリズムをGaussianプロセスに要求し、それらを試行することができます。
詳細については、Jasper Snoek、Hugo Larochelle、およびRyan P Adamsによる論文「Practical Bayesian Optimization of Machine Learning Algorithms」をご覧ください(WebサイトまたはGoogleからも入手できます)。