Code & Func

k近邻算法

2018-02-13
机器学习
最后更新:2024-09-19
2分钟
338字

刚看了有关kNN的东西,总结一下:

kNN算法(k-近邻算法)是一种可用于分类和回归的非参数统计方法。

  • 分类算法:最近的k个邻居进行投票得到类别
  • 回归算法:最近的k个邻居的平均数

这里只讨论分类算法。

先给个直观的理解,比如现在我们要判断一个人是男生还是女生,我们只考虑身高、体重这两个特征。显然如何两个人的身高体重越相近,那么他们的性别就越相近。kNN就是基于这个直观的想法来做的,如果我们要判断x是什么类别,我们就在train data中找出与x最相邻的k个数据,然后通过投票机制来觉得最后的分类。

这里我们就需要定义距离了:

简单的就用欧几里得距离(即L2距离) $\sqrt((x_1 - y_1)^2 + … + (x_2 - y_2)^2)$

给出demo代码(参考机器学习实战):

1
def classify0(inX, dataSet, labels, k):
2
dataSetSize = dataSet.shape[0]
3
# 欧式距离计算
4
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
5
sqDiffMat = diffMat**2
6
sqDistance = sqDiffMat.sum(axis=1)
7
distances = sqDistance**0.5
8
#找出前k个距离最小的sample
9
sortedDistIndicies = distances.argsort() # 这里返回的是indicies
10
classCount = {}
11
for i in range(k):
12
voteIlabel = labels[sortedDistIndicies[i]]
13
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
14
sortedClassCount = sorted(classCount.items(),
15
key=operator.itemgetter(1), reverse=True)
1 collapsed line
16
return sortedClassCount[0][0]
本文标题:k近邻算法
文章作者:wuxiaobai24
发布时间:2018-02-13