一、kNN算法介绍
首先先介绍下kNN算法,有这么一个场景给定了肿瘤块的大小和时间的一组数据,其中每一组数据对应一个结果数据,即恶性还是良性。这么一组数据:
raw_data_x = [[3.39,2.33], #特征
[3.11,1.78],
[1.34,3.37],
[3.58,4.68],
[2.28,2.87],
[7.42,4.7],
[5.75,3.53],
[9.17,2.51],
[7.79,3.42],
[7.94,0.79]
]
raw_data_y=[0,0,0,0,0,1,1,1,1,1] #0良性 1恶性
我们将肿瘤快大小作为横轴,时间作为纵轴,其中绿色代表良性,红色代表恶性,蓝色为给定[8.09,3.37] 需要我们判断是恶性还是良性。
import numpy as np import matplotlib.pyplot as plt raw_data_x = [[3.39,2.33], # 特征 [3.11,1.78], [1.34,3.37], [3.58,4.68], [2.28,2.87], [7.42,4.7], [5.75,3.53], [9.17,2.51], [7.79,3.42], [7.94,0.79] ] raw_data_y=[0,0,0,0,0,1,1,1,1,1] #0良性 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.09,3.37]) #来了新点,预测属于红色 还是绿色??
kNN的思想是:我算出这个蓝色球距离每一个球的距离,distances=[]
然后按照从近到远进行排序(按照索引),将最近的k个点的y坐标求出来(即这几个点都是0还是1),然后进行对1和0的频次统计。如果1多则恶性可能性大,0多则良性可能性大。
二、kNN过程
求出x点距离其他点的距离 存入到distances数组中
from math import sqrt distances=[] for x_train in x_train:#对于每一个x_train 都求出距离 d =sqrt(np.sum((x_train - x)**2)) #欧拉距离 注意x_train x都是矩阵,是对每一个元素的操作 distances.append(d)
求出离这点新点最近的点的索引排序
nearest=np.argsort(distances) #求出离新点最近的点的索引排序
假设k=6 求出最近的6个点相应的y的值
topK_y = [y_train[i] for i in nearest[:k]] #将最近的6个点的相应的y坐标显示
求出topK_y最终为
[1, 1, 1, 1, 1, 0] 对其统计
from collections import Counter votes=Counter(topK_y)
结果:Counter({1: 5, 0: 1}) votes.most_common(1)#找出票数最多的元素,即频次最大
结果:[(1, 5)]
votes.most_common(1)[0] #取出频次最大的一组的第一个元素 ,即1 恶性
结果:(1, 5)
三、使用sklearn中的kNN