因为自己想学着去写机器学习的源码,所以我最近在学习《机器学习实战》这本书。
《机器学习实战》是利用Python2完成的机器学习算法的源代码,并利用机器学习方法来对实际问题进行分析与处理。
(《机器学习实战》豆瓣读书网址:https://book.douban.com/subject/24703171/)
以下内容是我通过学习《机器学习实战》,以及我对k-近邻(kNN)分类算法的理解,所总结整理出的内容,其中kNN分类算法的源码为Python3的代码,希望大家多多批评指正。
kNN分类算法是一类有监督的学习算法,kNN分类算法首先计算出测试样本点与已知样本点之间的距离,选择距离测试样本点最近的k个已知样本点,根据k个已知样本点的类别,通过“投票法”得到测试样本点的最终分类。
kNN分类算法的优缺点:优点:精度高、对异常值不敏感、无数据输入假定;缺点:计算复杂度高、空间复杂度高;适用数据范围:数值型和标称型(标称型数据:变量的结果只在有限目标集中取值)。--摘自《机器学习实战》
kNN分类算法通常使用欧氏距离来计算测试样本点与已知样本点之间的距离。
已知两个点A=(x1, y1)、B=(x2, y2),则A和B的欧氏距离为:
Distance = sqrt( (x1-x2)^2 + (y1-y2)^2 )
kNN分类算法的伪代码如下:
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分类算法的理解以及源代码,欢迎大家多多批评指正。
后续如果有时间的话,我会增加 监督学习算法_k-近邻(kNN)分类算法_实战 这一部分的随笔整理。
祝好
希望可以和大家互相学习、共同进步。
Violet HE
2019.1.18 00:35
原文地址:https://www.cnblogs.com/violethjq/p/10285462.html