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

Love The Way You Lie 2022-05-20 02:53 367阅读 0赞
  • 首先我们通过一个简单的数据集来了解一下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来展示这些点的分布情况。

  1. #这是实际操作的点
  2. X_train=np.array(data_x)
  3. Y_train=np.array(data_y)
  4. plt.scatter(X_train[Y_train==0,0],X_train[Y_train==0,1],color="g")
  5. plt.scatter(X_train[Y_train==1,0],X_train[Y_train==1,1],color="r")
  6. plt.show()

结果显示如下图:
这里写图片描述
我们可以清楚的看到,红色和绿色的两个不同类别分布情况,接下来我们又得到了另一个点,但是我们不知道他是属于哪一个类别,这时我们就需要将它也在图上表示出来,代码如下:

  1. x=np.array([8.342342,3.353423])
  2. plt.scatter(X_train[Y_train==0,0],X_train[Y_train==0,1],color="g")
  3. plt.scatter(X_train[Y_train==1,0],X_train[Y_train==1,1],color="r")
  4. plt.scatter(x[0],x[1],color="b")
  5. plt.show()

我们将新增的这个点用蓝色表示,结果如下:
这里写图片描述
我们可以清楚的再图上看到他的位置,和红色部分靠近。
* 因为KNN算法是根据相近的几个点的位置来判断该点是什么类别,所以我们可以知道,这个点是属于红色的类别。
* 思路:
1.计算出新的那个点和原来那些点的距离

  1. from math import sqrt
  2. dis=[]
  3. for x_train in X_train:
  4. d=sqrt(np.sum((x_train-x)**2))
  5. dis.append(d)
  6. 结果:
  7. dis
  8. [5.105048274398589,
  9. 5.452376587089798,
  10. 6.998924682915369,
  11. 4.939634523323471,
  12. 6.078465232236668,
  13. 1.6284607912670155,
  14. 2.6148262468762624,
  15. 1.1803626955332156,
  16. 0.5722673265809259,
  17. 2.5903796335870357]

或直接使用:

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

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

  1. short=np.argsort(dis)
  2. 结果:
  3. array([8, 7, 5, 9, 6, 3, 0, 1, 4, 2])

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

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

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

  1. from collections import Counter
  2. Counter(topK_y)#计算出现的频次
  3. 结果:Counter({
  4. 1: 5, 0: 1})
  5. votes=Counter(topK_y)#存放结果
  6. votes.most_common(1)
  7. 结果:
  8. [(1, 5)]#最多的为1,有五个

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

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

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

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

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,367人围观)

还没有评论,来说两句吧...

相关阅读

    相关 机器学习算法KNN

    原理 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 KNN算法不仅可以用于分类,还可以用于回归。

    相关 机器学习----KNN算法

    KNN算法应该是机器学习中最简单的算法,其算法核心步骤如下: 对未知类别属性的数据集中的每个样本执行: 1.计算已知类别数据集中的点与当前点之间的距离 2.按照距离递