k近傍法

k-nearest neighbor algorithm, k-NN

Posted by Whale Fall on November 26, 2019

KNN概要

From Wiki
あるオブジェクトの分類は、その近傍のオブジェクト群の投票によって決定される(すなわち、k 個の最近傍のオブジェクト群で最も一般的なクラスをそのオブジェクトに割り当てる)。k は正の整数で、一般に小さい。k = 1 なら、最近傍のオブジェクトと同じクラスに分類されるだけである。二項分類の場合、k を奇数にすると同票数で分類できなくなる問題を避けることができる。

アルゴリズム

訓練例は、多次元の特徴空間におけるベクトルである。空間は、訓練例のラベルと位置によって領域に分割されている。空間内のある点には、その k 個の最近傍の訓練例に最も多く付けられているクラスラベル c が割り当てられる。一般にユークリッド距離(欧几里得距离)が使われる。

import os
import numpy as np
from collections import Counter

def classify(inX, dataSet, labels, k):
    #ユークリッド距離
    dist = np.sum((inx - dataset)**2, axis=1)**0.5
    k_labels = [labels[index] for index in dist.argsort()[0 : k]]
    
    label = Counter(k_labels).most_common(1)[0][0]

    return label

def knn_test():
    group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    print(classify([0.1, 0.1], group, labels, 5))


if __name__ == '__main__':
    knn_test()