您的位置:首页 > 编程语言 > Python开发

K近邻相关概念及其Python实现

2016-09-15 12:29 330 查看

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树,详见以下博客,讲的很清楚:

http://www.cnblogs.com/eyeszjwang/articles/2429382.html

代码实现

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


距离用了简单的二范数来检测。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  K近邻