ML-KNN

来源:互联网 发布:一键配置java环境 编辑:程序博客网 时间:2024/05/17 03:50

KNN-k 近邻算法

KNN属于分类算法,原理比较简单,简单概括就是对测试数据和所哟样本点进行距离的测算,最后选取K个最近的点的集合, 在其中选取类别出现最多的点的分类作为测试数据的分类。
       
以图说明,这里存在矩阵
trainMat = array([[1.,1.1],[1.,1.],[0.,0.],[0.,0.1]])
作图:
         
       当我们的测试点(x1,y1)分别计算和这些店的距离之后,选出k个最小距离点之后,统计这k个点哪个类别的点最多就选这个类别, 很简单吧。


       KNN代码实现:
def  KNN_classify(testmat,dataset,labels,k):dataSetSize = dataset.shape[0]#求两点间的距离公式diffMat = tile(testmat,(dataSetSize,1)) - datasetsqdiffMat = diffMat ** 2sqdistance = sqdiffMat.sum(axis=1)distance = sqdistance ** 0.5sortdistance = distance.argsort()  #排序print sortdistanceclasscount = {}#统计前k个数据的类别出现次数for i in range(k):votelabel = labels[sortdistance[i]]classcount[votelabel] = classcount.get(votelabel,0) + 1sortedclass = sorted(classcount.iteritems(),key = operator.itemgetter(1),reverse=True)return sortedclass[0][0]

使用上面的训练数据进行新数据的分类测试
    
xData = array([[ 1., 1.1], [ 1.,1. ], [ 0.,0. ], [ 0.,  0.1], [ 1., 2. ], [ 3.,  2. ], [ 0.5, 0.8]])yLabel = array([1,1,-1,-1,1,1,-1])
  分别测试两个数据点 
xinx1 = array([[0.,0.2]])xinx2 = array([[5,2]])print KNN_classify(xinx1,xData,yLabel,4)print KNN_classify(xinx2,xData,yLabel,4)
得到结果
-1
1

总结: KNN算法是分类算法中最简单有效的算法,kNN 基于实例学习,所以每次进行分类的时候都需要将所有的训练数据一起进行学习,这样就带了内存和效率上的损失,属于非参数行分类学习。KNN对于严重大数值型数据比较敏感,如果上一例中训练数据中有比较大的坐标位置,这样在计算距离的时候就容易产生偏差,所以要用到归一化的工具来同意训练数据(归一化的问题在以后的博文中会介绍)