[机器学习]k-邻近算法

最近开始入门机器学习,使用的是图灵程序设计丛书《机器学习实战》。

k-邻近算法 即是KNN算法,是用来做归类的,也就是说,有一个样本空间里的样本分成很几个类型,然后,给定一个待分类的数据,通过计算接近自己最近的K个样本来判断这个待分类数据属于哪个分类。你可以简单的理解为由那离自己最近的K个点来投票决定待分类数据归为哪一类。计算最近k样本的指标是距离,用的是欧式距离公式;

欧几里得空间中,点x =(x1,...,xn)和 y =(y1,...,yn)之间的欧氏距离为

d(x,y):={\sqrt  {(x_{1}-y_{1})^{2}+(x_{2}-y_{2})^{2}+\cdots +(x_{n}-y_{n})^{2}}}={\sqrt  {\sum _{​{i=1}}^{n}(x_{i}-y_{i})^{2}}}

然后对求得距离进行升序排序,选择k个最小的距离(通常k是小于20),观察这k个最小距离的样本是在什么类型里面的,如果大部分的样本都是属于同一个类型,那么我们就有把握推测这个测试的样本是属于这个类型的。

下面是最简单的一个实现:

from numpy import *
import operator
def createDataSet():
    group = array([[0,0],[100,0],[100,100],[0,100]])
    labels = ['A', 'B', ' C', 'D']
    return group, labels

def classify(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX,(dataSetSize,1))-dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

def main():
    dataSet, labels = createDataSet()
    print(classify([90, 0.9], dataSet, labels, 1))


if __name__ == '__main__':
    main()
得出的结果是B,其实这就是在一个平面里面随机设置一个点,观察这个点距离哪一个顶点最接近就属于哪一类,然而维度是可以增加的。

你可能疑惑numpy.tile()这个函数什么意思。

>>> import numpy  
>>> numpy.tile([1,0],5)#在列方向上重复[0,0]5次,默认行1次  
array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0])  
>>> numpy.tile([2,2],(1,1))#在列方向上重复[0,0]1次,行1次  
array([[2, 2]])  
>>> numpy.tile([3,4],(3,1))  
array([[3, 4],  
       [3, 4],  
       [3, 4]])  
>>> numpy.tile([0,0],(1,3))#在列方向上重复[0,0]3次,行1次  
array([[0, 0, 0, 0, 0, 0]])  

对于sum函数里的(axis=1)

加入axis=1以后就是将一个矩阵的每一行向量相加


例如:

import numpy as np

np.sum([[0,1,2],[2,1,3],axis=1)的结果就是:array([3,6])

另外还有一个提醒:

use dict.items() instead of dict.iteritems()

iteritems() was removed in python3, so you can't use this method anymore.

也就是说dict.items() 代替了 dict.iteritems()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值