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

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

距离用了简单的二范数来检测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值