python3实现机器学习--KNN算法详解

  • 首先我们通过一个简单的数据集来了解一下KNN算法。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

data_x=
[[3.342342, 2.3231231],
 [3.12122, 1.782342],
 [1.343423, 3.362342],
 [3.5823423, 4.67342],
 [2.2834234, 2.866345],
 [7.42123123, 4.696345],
 [5.742434, 3.63234],
 [9.173423, 2.5152342],
 [7.7952342, 3.5212412],
 [7.9352342, 0.79523421]]
 data_y=[0,0,0,0,0,1,1,1,1,1]

data_x数据集是绘制图像需要的几个基本点,data_y是这些点所在的不同类别,分别是0,1。
接下来我们通过matplotlib来展示这些点的分布情况。

#这是实际操作的点
X_train=np.array(data_x)
Y_train=np.array(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.342342,3.353423])

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算法是根据相近的几个点的位置来判断该点是什么类别,所以我们可以知道,这个点是属于红色的类别。
* 思路:
1.计算出新的那个点和原来那些点的距离

from math import sqrt
dis=[]
for x_train in X_train:
    d=sqrt(np.sum((x_train-x)**2))
    dis.append(d)

 结果:
 dis:
 [5.105048274398589,
 5.452376587089798,
 6.998924682915369,
 4.939634523323471,
 6.078465232236668,
 1.6284607912670155,
 2.6148262468762624,
 1.1803626955332156,
 0.5722673265809259,
 2.5903796335870357]

或直接使用:

dis=[sqrt(np.sum((x_train-x)**2)) for x_train in X_train]

结果都是一样的,我们得到了新的点和原来点的距离
2.接下来我们要得到与新的点距离最近的几个点,我们要对生成的dis里面的数据进行排序,得到这些点的位置,我们可以得到最近的点的索引位置,使用numpy内置的argsort方法。
将排序结果存在short里面:

short=np.argsort(dis)

结果:
array([8, 7, 5, 9, 6, 3, 0, 1, 4, 2])

可以知道,最近的点是索引为8的点,其次是7.
3.我们还要得到这些距离最近的几个点属于哪些类别。我们设置k为6,看前六个点属于哪些类别,将y_train中的数据在short中遍历,看哪些符合条件。

topK_y=[y_train[i] for i in short[:k]]

结果:[1, 1, 1, 1, 1, 0]
所以,最近的五个点为类别1,还有一个类别0.
或者我们计算结果:

from collections import Counter
Counter(topK_y)#计算出现的频次

结果:Counter({1: 5, 0: 1})
votes=Counter(topK_y)#存放结果
votes.most_common(1)

结果:
[(1, 5)]#最多的为1,有五个

因为我们要获取的是类别,所以通过[0][0]获取。

pre=votes.most_common(1)[0][0]
结果:
1

因此我们就得到了最近的点的类别是1,这个点就是类别1.

代码截图:
这里写图片描述

这里写图片描述

扫描二维码关注公众号,回复: 2178628 查看本文章

这里写图片描述

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/ayangann915/article/details/80999394