K近邻
它是一种基本分类与回归的方法。在分类时,根据其K个最近邻的训练实例的类别,通过多数表决等方式进行预测。K近邻不具有显式的学习过程。
模型
K近邻法,实际上对应特征空间的划分。以最近邻法为例,子空间的划分,是相邻点之间做垂直平分线/面,然后相交集后,划分出的各个子空间。当实例点处在某一特征子空间中,那么它的类别就对应于特征子空间所对应的类别。
要找出最近的K个点,对于“最近”这个概念,首先就要定义实例点之间的距离问题。
对于特征空间是n维实数向量空间,一般使用Lp距离来度量:
p=2时,就是常用的欧式距离。
p=1时,叫做曼哈顿距离。求的是各坐标距离绝对值之和。
特例是,当p=∞时,我们是取各个坐标距离的最大值,即 max|Xi-Xj| 。
K值取值的大小对结果会产生重大影响。
- K取小,那么预测结果会对近邻的实例点非常敏感。此意味着整体模型变得复杂,容易过拟合。
- K取大,这时与输入实例较远的训练实例也会起作用。模型虽然变简单了,但是训练集的信息没有被完全利用。
策略
K近邻策略很容易理解,就是在K个近邻里,进行多数投票机制。
对于最近邻的k个训练实例点构成一个集合Nk(x),设这一区域点的真实类别是Cj,那么,误分类率可以表示为:
- 此区域内不是Cj类别的点的个数 / 此区域总的点个数K。欲使误分类率最小,就要使此区域内本身属于Cj点的个数达到最多。所以,我们采用多数表决规则就等价于误分类率最小化。
算法:kd树
对于kd树,详见以下博客,讲的很清楚:
代码实现
from numpy import *
def KnnClasssify(testing,trainning,lables,k):
numPots = len(trainning)
temp1 = tile(testing,[numPots,1]) - trainning
sqrtemp1 = temp1 ** 2
temp2 = sqrtemp1.sum(axis=1)
distances = temp2 ** 0.5
sortedDistance = distances.argsort()
classLable={}
for i in xrange(k):
tmplable = lables[ sortedDistance[i] ]
classLable[tmplable] = classLable.get(tmplable,0) + 1
return max(classLable)
if __name__ == '__main__':
trainning = [1.0,0.9],[1.0,1.0],[0.1,0.2],[0.0,0.1]
lables = ['A','A','B','B']
testing = [1.2,1.0]
lable = KnnClasssify(testing,trainning,lables,3)
print lable
距离用了简单的二范数来检测。