KMN算法初学

阅读更多
KMN算法,其实就是"人以类聚,物有群分“,可以参考下图:



在这个图中,比如蓝色,红色两个分类,来一个新的点,如何判断它是属于蓝色还是
红色分类呢,比如新来的点是绿色,则可以用如下方法判断:

1) 比K=3,则选3个离绿色的点最近的,看这个绿色的点和这些点的距离,这里是2个红色点,1个蓝色点

2) 很明显,2:1的票数,2个红色点,少数服从多数,因此是属于红色分类

   PYTHON例子:

import numpy as np
import matplotlib.pyplot as plt

比如有了10个数,已知道这10个数的是否癌症,比如1是,0:否,则

raw_data_X = [[3.393533211, 2.331273381],
              [3.110073483, 1.781539638],
              [1.343808831, 3.368360954],
              [3.582294042, 4.679179110],
              [2.280362439, 2.866990263],
              [7.423436942, 4.696522875],
              [5.745051997, 3.533989803],
              [9.172168622, 2.511101045],
              [7.792783481, 3.424088941],
              [7.939820817, 0.791637231]
             ]
raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

转成矩阵:
X_train = np.array(raw_data_X)
y_train = np.array(raw_data_y)

画散点图:
plt.scatter(X_train[y_train==0,0], X_train[y_train==0,1], color='g')
plt.scatter(X_train[y_train==1,0], X_train[y_train==1,1], color='r')
plt.show()



假设新来一个点,要预测:
x = np.array([8.093607318, 3.365731514])

plt.scatter(X_train[y_train==0,0], X_train[y_train==0,1], color='g')
plt.scatter(X_train[y_train==1,0], X_train[y_train==1,1], color='r')
plt.scatter(x[0], x[1], color='b')
plt.show()

新来的点用蓝色表示,具体算法:

from math import sqrt
distances = []
for x_train in X_train:
    d = sqrt(np.sum((x_train - x)**2))
    distances.append(d)

这里是通过计算欧氏距离,求出每个点和新来的点的距离

[4.812566907609877,
 5.229270827235305,
 6.749798999160064,
 4.6986266144110695,
 5.83460014556857,
 1.4900114024329525,
 2.354574897431513,
 1.3761132675144652,
 0.3064319992975,
 2.5786840957478887]

然后排序:
np.argsort(distances)

array([8, 7, 5, 6, 9, 3, 0, 1, 4, 2])
得出最小的数,在原来矩阵的位置是8.。。。。

比如K=6,则
nearest = np.argsort(distances)

topK_y = [y_train[neighbor] for neighbor in nearest[:k]]

这里求出6个数,对应在Y特征矩阵中的值
[1, 1, 1, 1, 1, 0]
from collections import Counter
votes = Counter(topK_y)

这里求出这个数组中,0的个数多少个,1的个数多少个:
Counter({0: 1, 1: 5})
则肯定新来的值的特殊属于1分类

你可能感兴趣的:(KMN算法初学)