K近邻算法-KNN

一: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)

 

posted @ 2019-04-03 16:33  Coding_Now  阅读(206)  评论(0编辑  收藏  举报