大家好,欢迎来到IT知识分享网。KMN算法,其实就是”人以类聚,物有群分“,可以参考下图:
[img]https://thumbnail0.baidupcs.com/thumbnail/d6196b12ace7f67dacc2fe0?fid=–6265&time=&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-o41vmy7stm4PrzULHNBbF%2FfNV1s%3D&expires=8h&chkv=0&chkbd=0&chkpc=&dp-logid=&dp-callid=0&size=c710_u400&quality=100&vuk=-&ft=video[/img]
在这个图中,比如蓝色,红色两个分类,来一个新的点,如何判断它是属于蓝色还是
红色分类呢,比如新来的点是绿色,则可以用如下方法判断:
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., 2.],
[3., 1.],
[1., 3.],
[3., 4.],
[2., 2.],
[7., 4.],
[5., 3.],
[9., 2.],
[7., 3.],
[7., 0.]
]
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.0, 3.])
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.9877,
5.5305,
6.0064,
4.10695,
5.857,
1.29525,
2.1513,
1.44652,
0.75,
2.78887]
然后排序:
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分类
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/134927.html