图1 上图横轴表示患者肿瘤大小,竖轴表示发现肿瘤的时间,图中红色点代表良性肿瘤,蓝色点代表恶心肿瘤。
如果现在新来了一个病人,这个病人在特征空间中的位置如上图中绿色点的位置,那么我们如何通过K近邻算法判断出这位患者是恶性肿瘤还是良性肿瘤,看图是很容易知道的,但是怎么用代码和算法实现呢?
我们的方法是这样的,给定一个K=6,这个K值你可以把他想像成是机器学习的使用者根据经验取得了一个经验上的最好值,这个K就是6。
对于新来的数据点,用K近邻算法,算出这个新来的数据点离它最近的6个点的距离,然后看这6个点在红点和蓝点的比例,比如算出的最近的6个点的距离中,其中红点:蓝点=5:1,也就是红点数量大于蓝点数量,则新来的患者判断为良性肿瘤,反之,红点数小于蓝点数,则判断为恶性肿瘤。
具体实现代码和算法如下;
下面展示一些 内联代码片。
以下代码是通过在Jupyter Notebook中测试通过。
import numpy as np
import matplotlib.pyplot as plt
raw_data_x =[[3.393533211, 2.331273381], //各个数据点在特征空间中的坐标
[3.110073483, 1.781539638],
[1.343808831, 3.368360954],
[3.582294042, 4.67917911],
[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] //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.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()`
//KNN过程
from math import sqrt
distances = []
for xi in x_train:
d = sqrt(np.sum((xi - x)**2))
distances.append(d)
// 或者直接用python的方法 distances = [ sqrt(np.sum( ( x_train - x)**2 ) ) for x_train in x_train]
np.argsort(distances)
nearest = np.argsort(distances)
k = 6
topk_y = [y_train[i] for i in nearest[:k]]
from collections import Counter
Counter(topk_y)
votes = Counter(topk_y)
votes.most_common(1)
votes.most_common(1)[0][0]
predict_y = votes.most_common(1)[0][0]
predict_y //这里执行后输出为1,代表为恶性肿瘤。如果输出为0,则代表为良性。



