kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。
K近邻是一种基本分类与回归的方法
可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居。为何要找邻居?
打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙。
或者,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出了。
其实这两个例子就是运用了KNN的思想。KNN方法既可以做分类,也可以做回归,这点和决策树算法相同。
用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
算法思想:简单的说就是,找到最“近”的k个邻居,然后按照他们的多数作为分类标签,或者按照他们的均值作为回归预测结果(“投票法“和“平均法”),一些情况会考虑结合距离进行加权投票和加权平均,距离越近的权重越大。
目标函数: 没有,没有显示学习过程,所以也不需要优化,只需要验证K值是否合理(交叉验证)
算法缺点:所有的计算都在预测的时候进行,属于”急切学习“会比较耗内存,由于算法假设采样密度足够大,所以当维度比较多时,样本量需求会比较大,计算距离都会比较困难,当然这属于所有机器学习方法的共同问题,被称为”维度灾难“,但是由于KNN把所有的计算都放到了一起,所以问题可能会更为突出。解决方向——降维。
算法优点:原理简单易懂;天然可处理多分类问题
相关代码:
form numpy import *
import operator
def createDataSet():
# 创建训练集
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = [‘A’,‘A’,‘B’,‘B’]
return group, labels
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
# 根据欧式距离计算训练集中每个样本到测试点的距离
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances0.5
# 计算完所有点的距离后,对数据按照从小到大的次序排序
sortedDistIndicies = distances.argsort()
# 确定前k个距离最小的元素所在的主要分类,最后返回发生频率最高的元素类别
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]