PYTHON机器学习——KNN(k近邻算法)
代码实现
首先,导入需要用到的包
import numpy as np
import matplotlib.pyplot as plt
初始化模拟数据集和对应的分类
data_x=[[1.15,2.34],
[1.55,2.47],
[3.78,4.98],
[3.34,4.56],
[2.22,2.34]]
data_y=[1,1,0,0,1]
X_train=np.array(data_x)
Y_train=np.array(data_y)
画图看一下两类数据在图上的分布情况
plt.scatter(X_train[Y_train==1,0],X_train[Y_train==1,1],color='r')
plt.scatter(X_train[Y_train==0,0],X_train[Y_train==0,1],color='y')
KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。现在我们模拟要看一下,如果出现一个新的数据点,根据欧式距离计算。
要度量空间中点距离的话,有好几种度量方式,比如常见的曼哈顿距离计算,欧式距离计算等等。不过通常KNN算法中使用的是欧式距离,这里只是简单说一下,拿二维平面为例,,二维空间两个点的欧式距离计算公式如下:
二维空间欧式距离
其实就是计算(x1,y1)和(x2,y2)的距离:
# 欧式计算距离
distance=[]
x=np.array([1.2,3.2])
for i in X_train:
d=np.sqrt(np.sum((x-i)**2))
distance.append(d)
distance
[0.8614522621712712,
0.8095677859203638,
3.1344537004077764,
2.5355867171130226,
1.3341664064126337]
dd=np.argsort(distance)#找到排序由小到大的索引索引
array([1, 0, 2], dtype=int64)
top_k=[Y_train[i] for i in dd[:2]] #找到排序小的前两个通过索引 找对应的y
[1, 1]
from collections import Counter
votes=Counter(top_k)#统计
votes.most_common(1)#找到票数最多的数据
[(1, 2)]
predict=votes.most_common(1)[0][0]#最终预测结果
1
最终预测的分类结果为1。