k が学習データ数に近づくと、どんなクエリも「全データの多数決」つまり最頻クラスを返すようになります。決定境界はほぼ消え、少数派クラスは決して予測されません。一方で k=1 は学習データに対する完全フィットになるため過学習しがちです。LOO 精度のカードを見ながら適切な k を選ぶのが現実的な解です。
実世界での応用
レコメンドシステム:映画や商品のレコメンドで、ユーザーや商品を多次元ベクトルとして表現し、「似ているユーザー」「似ている商品」を k-NN で探索します。Amazon の「この商品を買った人はこんな商品も…」や、Netflix の協調フィルタリングの基本にはこの考え方があります。本格的なシステムでは数億ベクトルから k 近傍を瞬時に取り出すため、近似最近傍探索ライブラリが裏で動いています。
異常検知(Anomaly Detection):製造ラインのセンサーデータやネットワークトラフィックで、「k 近傍までの平均距離」を異常スコアとして使う手法があります。正常データが密に分布する空間で、k 近傍がどれも遠ければ「孤立した点 = 異常」と判定できます。シミュレーターの「クエリから k 近傍までの平均距離」のカードがまさにこの指標です。
地理情報・空間検索:地図アプリで「現在地から最も近い 5 つのカフェ」を返すような処理は、本質的に k 近傍探索です。緯度経度を 2 次元座標、距離を球面距離として、k-NN を空間インデックス(R-tree 等)で高速化したものが多くのジオサービスの根幹を支えています。
よくある誤解と注意点
最も多い誤解は、「k-NN は学習が不要だから簡単」と考えてしまうことです。確かに学習フェーズは「データを保存するだけ」ですが、その代わり予測フェーズが重く、特徴量設計の良し悪しがすべてです。シミュレーターで「学習データの分散 σ」を 3.0 まで上げてみてください。クラスタが重なって、どんな k を選んでも LOO 精度が大幅に落ちます。これは「特徴量空間でクラスが分離されていない」ことを示しており、k-NN だけでは解決できません。学習が不要に見えても、特徴量を作る段階で人間が頭を使う必要があるわけです。
次に多いのが、「k は大きいほど精度が上がる」と思い込むことです。k=1 は確かに過学習しやすいですが、k を上げ続けると今度は「少数派クラスが多数派に飲まれる」逆の問題が起きます。本シミュレーターで k を 1 から 25 まで動かしながら LOO 精度を見てください。最適 k は中間にあり、データの分布によって変わります。k は「データに合わせて選ぶ」ハイパーパラメータであり、交差検証で系統的に決めるべきです。「とりあえず大きく」も「とりあえず 1」も間違いです。
最後に、「LOO 精度が高ければ実運用でも同じ精度が出る」と過信するのは危険です。LOO 交差検証は、学習データの分布が運用時のデータ分布と一致していることを暗黙に仮定しています。実際にはデータの収集時期やセンサーの違いで分布が変わる「ドメインシフト」が起こり、LOO で 90% だったのに本番で 70% に落ちる、ということが普通にあります。シミュレーターの LOO 精度は理想的な条件下の値であり、運用時はホールドアウト検証や時系列クロスバリデーションで追加検証することを忘れないでください。