监督学习算法_k-近邻(kNN)分类算法_源代码

由于本身想学着去写机器学习的源码,因此我最近在学习《机器学习实战》这本书。算法

《机器学习实战》是利用Python2完成的机器学习算法的源代码,并利用机器学习方法来对实际问题进行分析与处理。机器学习

(《机器学习实战》豆瓣读书网址:https://book.douban.com/subject/24703171/)学习

如下内容是我经过学习《机器学习实战》,以及我对k-近邻(kNN)分类算法的理解,所总结整理出的内容,其中kNN分类算法的源码为Python3的代码,但愿你们多多批评指正。测试

 

kNN分类算法是一类有监督的学习算法,kNN分类算法首先计算出测试样本点与已知样本点之间的距离,选择距离测试样本点最近的k个已知样本点,根据k个已知样本点的类别,经过“投票法”获得测试样本点的最终分类。spa

kNN分类算法的优缺点:优势:精度高、对异常值不敏感、无数据输入假定;缺点:计算复杂度高、空间复杂度高;适用数据范围:数值型和标称型(标称型数据:变量的结果只在有限目标集中取值)。--摘自《机器学习实战》排序

kNN分类算法一般使用欧氏距离来计算测试样本点与已知样本点之间的距离。get

已知两个点A=(x1, y1)、B=(x2, y2),则A和B的欧氏距离为:源码

Distance = sqrt( (x1-x2)^2 + (y1-y2)^2 )it

kNN分类算法的伪代码以下:io

Step1:计算出测试样本点与已知样本点之间的距离;

Step2:将距离按照升序排序;

Step3:选择距离测试样本点最近的k个已知样本点;

Step4:计算k个最近的已知样本点所在类别出现的频率;

Step5:k个最近的已知样本点出现频率最高的类别,即为测试样本点的最终分类。

 

kNN分类算法的源码:

 def classify(test, samples, labels, k):

  import numpy as np
  import operator

  # 改变测试样本的格式
  samplesize = samples.shape[0]
  testnew = np.tile(test, (samplesize, 1))

  # 计算测试样本与已知样本之间的距离
  distances2 = (testnew - samples) ** 2
  distances = (distances2.sum(axis = 1)) ** 0.5

  # 对距离进行升序排序,并返回距离的下标
  sortdistances = distances.argsort()

  #计算k个最近的已知样本点所在类别出现的次数
  classcount = {}

  for i in range(k):
    sortedlabels = labels[sortdistances[i]]
    classcount[sortedlabels] = classcount.get(sortedlabels, 0) + 1

  #将k个最近的已知样本点所在类别出现的次数降序排列
  sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1), reverse = True)

  #返回k个最近的已知样本点出现频率最高的类别,即为测试样本点的最终分类
  return sortedclasscount[0][0]

对 kNN分类算法的源码进行测试:

import numpy as np

import operator
test = [0, 1]
samples = np.array([[1, 1], [1, 3], [0, 0], [0., .1]])
labels = ['A', 'A', 'B', 'B']
k = 3
print(classify(test, samples, labels, k))

测试代码的输出结果为 'B',即测试样本点[0, 1]的所属类别为:B。 

 

以上是我对kNN分类算法的理解以及kNN分类算法的源代码,欢迎你们多多批评指正。

后续若是有时间的话,我会增长 监督学习算法_k-近邻(kNN)分类算法_实战 这一部分的随笔整理。

 

祝好

但愿能够和你们互相学习、共同进步

Violet HE

2019.1.18  00:35

相关文章
相关标签/搜索