k近傍法(k-NN)

k近傍法(k-Nearest Neighbors, k-NN)は、機械学習における教師あり学習の代表的な分類(Classification)アルゴリズムの一つです。非常にシンプルながら、直感的で効果的な手法として広く使われています。


基本的な考え方

k-NNの核心は、「あるデータ点を分類する際に、そのデータ点に最も近いk個の既知のデータ点(近傍)を参照し、多数決でクラスを決める」という方法です。


アルゴリズムの流れ

  1. 訓練データを準備する
    各データ点には特徴ベクトルと正解ラベルが付いています。

  2. 分類対象の新しいデータ点が与えられる

  3. 距離を計算する
    新しいデータ点と訓練データの各点との**距離(通常はユークリッド距離)**を計算します。

  4. 距離が最も近いk個のデータ点を選ぶ

  5. 多数決をとる
    k個の近傍の中で最も多いクラス(ラベル)を、新しいデータ点のクラスとする。


重要なパラメータ

  • k(近傍の数)
    小さすぎるとノイズに影響されやすくなり、大きすぎると分類の精度が下がることがあります。一般に、奇数が好まれます(クラス数が2の場合、同数票を避けるため)。

  • 距離関数
    ユークリッド距離が最も一般的ですが、マンハッタン距離、ミンコフスキー距離なども利用されます。

  • 重み付け(任意)
    近いデータ点により大きな重みを与える方法もあります(例:距離の逆数で重みをつける)。


k-NNの特徴

特徴 内容
学習コスト 非常に低い(実質的に学習を行わない「遅延学習」)
推論コスト 高い(全データとの距離を毎回計算)
汎化性能 データの分布がよく表現されていれば良好
ノイズへの感度 高い(外れ値に影響されやすい)

メリットとデメリット

メリット:

  • 実装が簡単で理論も直感的。

  • 学習フェーズが不要。

デメリット:

  • データ量が多いと予測時の計算コストが高い。

  • 特徴量のスケールに敏感(正規化や標準化が必要)。

  • 次元の呪い(高次元データでは距離の意味が希薄になる)。


応用例

  • 手書き文字認識(例:MNIST)

  • 異常検知

  • レコメンドシステム(類似ユーザーの分析)

  • 医療診断(症状が似ている患者を基に診断)


実装例(Python + scikit-learn)

python
from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # データ読み込み iris = load_iris() X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target) # k-NN モデルの作成(k=3) model = KNeighborsClassifier(n_neighbors=3) model.fit(X_train, y_train) # 精度の評価 accuracy = model.score(X_test, y_test) print(f"精度: {accuracy:.2f}")

まとめ

k-NNは、**「近くのデータは似たクラスに属する」**という前提に基づいた非常に基本的かつ効果的な分類手法です。ただし、高次元や大規模データに対しては注意が必要です。前処理(正規化)や距離関数の選択も重要です。

生成日:2025/06/01