一:KNN算法概念(K-Nearest Neighbor)
举个栗子:现在有10个点,突然我们又加了一个点,然后我们计算该点到其它点的距离从小到大排序,然后取前K个,查看该K个属于哪一部分的较多,那么我们就可以大概率的确定该点属于那一类。
图中蓝色点为我们新加的点,然后我们就是要确定这个蓝色的点属于哪一类的概率较大。
二:计算两点间的公式
欧式距离(常用):类似于亮点间的距离公式,但是我们的特征有可能多个,所以可以扩展到n维。
曼哈顿距离:就是表示两个点在标准坐标系上的绝对轴距之和。
三:案例分析
有10个病人,得了肿瘤,但是有良性的有恶性的,0代表良性的1代表恶性的,然后我们现在又来了一个病人,想要预测他是良性还是恶性。这时我们就可以采取KNN算法来判断他属于哪一种。
特征有两个,a和b,将其封装为向量。
raw_data_X = [[1.232422,1.22324],
[2.324232,1.3224],
[2.3435353,2.3232342],
[3.434353,3.434353],
[4.54546,3.54544],
[7.42422,6.764353],
[6.42224534,7.533232],
[8.435353,8.5433],
[9.423534,9.422224],
[8.544444,9.4564454]]
标记,0和1,同样封装为向量。
raw_data_y=[0,0,0,0,0,1,1,1,1,1]
被预测的病人,给出两个特征。x = np.array([5.4323213,6.433534454])
我们可以先看下10个样本的分布,红色是良性的,绿色是恶性的。
第一张图的蓝色的就是我们新加点,然后我们要计算蓝色点到其他点的距离用欧式距离计算。
x_train = np.array(raw_data_X)
y_train = np.array(raw_data_y)
distinces = [sqrt(np.sum(i-x)**2) for i in x_train]
distince列表就是我们计算出到每个点的距离。
然后我们取K个,K的大小先取5,后面讲解如何确定。
k = 5
near = np.argsort(distinces)
topK = [y_train[i] for i in near[:k]]
topK就是只包括0和1的列表。
再计算0和1的个数,
dic = Counter(topK)
取最多的也就是第一个,
final = dic.most_common(1)
取预测值
predict = final[0][0],结果不是1就是0,如果是1说明是恶性的,如果是0说明是良性的。
四:完整代码
import numpy as np import matplotlib.pyplot as plt from math import sqrt from collections import Counter raw_data_X = [[1.232422,1.22324], [2.324232,1.3224], [2.3435353,2.3232342], [3.434353,3.434353], [4.54546,3.54544], [7.42422,6.764353], [6.42224534,7.533232], [8.435353,8.5433], [9.423534,9.422224], [8.544444,9.4564454]] 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='red') plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='green') plt.show() x = np.array([5.4323213,6.433534454]) plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='red') plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='green') plt.scatter(x[0],x[1],color='blue') plt.show() distinces = [sqrt(np.sum(i-x)**2) for i in x_train] k = 5 near = np.argsort(distinces) topK = [y_train[i] for i in near[:k]] dic = Counter(topK) final = dic.most_common(1) predict = final[0][0] print(predict)