k近傍法 — 「ご近所に聞く」だけの分類器

新しい点のラベルを知りたければ、いちばん近い k 個のデータに聞いて多数決すればいい。数式もパラメータ学習も要らないシンプルなアルゴリズムが、k の選び方ひとつで過学習にも単純化しすぎにも化ける — その様子を境界マップと精度カーブで確かめます。

1. 訓練しない機械学習 — 怠惰学習

ロジスティック回帰は訓練でパラメータ w, b を求め、データ本体は捨てました。k近傍法(k-Nearest Neighbors, kNN)は正反対です。訓練段階ではデータを丸ごと覚えるだけで何も計算しません。予測を頼まれた瞬間に初めて、全データとの距離を測って近い順に k 個を選び、多数決します。

このスタイルを怠惰学習(lazy learning)と呼びます。「勉強は一切せず、テスト中に教科書を全部めくる」タイプです。

POINT — 怠惰学習の損益計算書 訓練コストはほぼゼロ(覚えるだけ)。その代わり予測のたびに全データとの距離計算 O(N) が必要で、データが増えるほど予測が遅くなる。モデルに圧縮する学習器(ロジスティック回帰など)とちょうどトレードオフの関係にある。

2. ご近所投票のしくみ

下のデモでマウスを動かすと、「?」の点(分類したい新しい点)の周りから k 本の線が最も近いご近所さんに伸び、破線の円が「k 番目に近い点までの距離」を示します。円の中の色を数えて多数決 — それが予測です。

k を変えると同じ場所でも予測がひっくり返ることがあります。境界付近で試してみてください。

ご近所投票 — k 個の最近傍に聞いてみる
キャンバス上でマウス(タッチ)を動かすと「?」点を自由に置けます。線と白いリング=選ばれた k 個の最近傍、破線の円=k 番目までの距離、「?」の色=多数決の結果。票が同数のときは最も近い1点に従います。

3. 「近い」をどう測るか — 距離の定義

kNN の心臓部は距離関数です。標準は直線距離(ユークリッド距離)ですが、格子状の移動を数えるマンハッタン距離、ベクトルの向きだけを比べるコサイン類似度など、データの意味に合わせて選びます。

d(a, b) = √( Σj (aj − bj)² ) ユークリッド距離。j は特徴の番号 — 各特徴の差を2乗して足し、平方根を取る
注意 — スケーリングしないと距離が壊れる 身長 [cm](150〜190)と年収 [万円](300〜1200)をそのまま混ぜると、距離はほぼ年収だけで決まってしまう。数値の大きい特徴が距離を独占するからだ。kNN では各特徴を平均0・分散1にそろえる標準化が事実上必須。距離ベースの手法(k-means、SVM など)すべてに共通する落とし穴。

4. k が決める境界のかたち

平面のすべての場所について「ここに新しい点が来たら何色か」を塗り分けたのが決定境界マップです。k = 1 では最寄りの1点がそのまま領土を主張するため境界はギザギザで、外れ値のまわりに「飛び地」ができます。k を増やすと多数決が効いて境界はなめらかになり、飛び地は消えていきます。

決定境界マップ — k のなめらかさ調整つまみ
背景の色=その場所に来た新しい点の予測(濃さは票の一致度)。「外れ値を追加」で相手陣地に紛れ込んだ点(赤リング)を混ぜると、k=1 では飛び地だらけに境界が乱れ、k を上げると多数決に埋もれて消えるのが分かります。

5. k の選び方 — 過学習と単純化のあいだ

では k はいくつが正解でしょうか。訓練データとは別に取っておいたテストデータで正解率を測りながら、k を 1 から増やしていくとこうなります。

k を 1 から増やしながら精度を測る — ちょうどいい k はどこか
緑=訓練データの正解率、オレンジ=テストデータの正解率。左端(k=1)は訓練100%なのにテストが低い過学習ゾーン、右端は両方下がる単純化ゾーン。★がテスト正解率が最大になる「ちょうどいい k」です。実務ではこの実験を交差検証としてもう少し丁寧に行います。
POINT — k は奇数にしておく 2クラス分類なら k を奇数にすれば同数票が起きない。また k の探索は「テストデータを何度も使い回す」とテストへの過学習になるため、実務では訓練データ内で分割を繰り返す交差検証で選ぶのが定石。

6. まとめ

一歩先へ — 次元の呪いと近似最近傍 特徴が数百次元を超えると「どの点までの距離もほぼ同じ」になり、素朴な kNN は壊れる(次元の呪い)。それでも「近いものを探す」需要は現代 AI の中心にあり、kd-tree や近似最近傍探索(ANN)で数十億点から瞬時に検索する技術が発達した。文書をベクトル化して近いものを引くベクトル検索(RAG の心臓部)は、まさに kNN の直系の子孫だ。