KNN算法小议

一、定义

     KNN可以看成,有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类,如下图所示:如果K=3,那么离绿色点最近的有2个红色的三角形和1个蓝色的正方形,这三个点进行投票,于是绿色的待分类点就属于红色的三角形。而如果K=5,那么离绿色点最近的有2个红色的三角形和3个蓝色的正方形,这五个点进行投票,于是绿色的待分类点就属于蓝色的正方形。 

                                                                                  图一、KNN算法小示例

从上面的例子可以抽象出KNN算法的流程图如下图所示

                                                                  图二、KNN算法流程图

定义既可以表述为:K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。

二、KNN算法的伪代码

Algorithm KNN(A[n], k)

{

    Input: A[n]为N个训练样本的分类特征;

            k为近邻个数;

 

     Initialize:

         选择A[1]至A[k]作为x的初始近邻;

         计算初始近邻与测试样本x间的欧氏距离d(x, A[i]), i=1,2,...k;

         按d(x, A[i])从小到大排序;

         计算最远样本与x间的距离D,即max{d(x, A[j]) | j=1,2...k};

 

     for(i=k+1; i<n+1; i++)

         计算A[i]与x间的距离d(x, A[i]);

 

         if  (d(x, A[i]) < D ) then

         用A[i]代替最远样本;

         按照d(x, A[i])从小到大排序;

         计算最远样本与x间的距离D,即max{d(x, A[j]) | j=1,...i};

         计算前k个样本A[i]所属类别的概率,i=1,2,...k;

         具有最大概率的类别即为样本x的类;

     end for

 

    Output: x所属的类别。

}

三、公式描述

 

四、python代码编制

#coding=utf-8
from numpy import *
import operator
  
def createDataSet():
      group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
      labels = ['A','A','B','B']
      return group,labels
  #inputX表示输入向量(也就是我们要判断它属于哪一类的)
  #dataSet表示训练样本
  #label表示训练样本的标签
  #k是最近邻的参数,选最近k个
def kNNclassify(inputX, dataSet, labels, k):
     dataSetSize = dataSet.shape[0]#计算有几个训练数据
     #开始计算欧几里得距离
     diffMat = tile(inputX, (dataSetSize,1)) - dataSet
     sqDiffMat = diffMat ** 2
     sqDistances = sqDiffMat.sum(axis=1)#矩阵每一行向量相加
     distances = sqDistances ** 0.5
     #欧几里得距离计算完毕
     sortedDistance = distances.argsort()
     classCount = {}
     for i in xrange(k):
         voteLabel = labels[sortedDistance[i]]
         classCount[voteLabel] = classCount.get(voteLabel,0) + 1
     res = max(classCount)
     return res
 
def main():
     group,labels = createDataSet()
     t = kNNclassify([1.0,1.0],group,labels,3)
     print t
     
if __name__=='__main__':
     main()

结果集 t = kNNclassify([1.0,1.0],group,labels,3) 对应的结果为

结果集t=kNNclassify([1.0,1.0],group,labels,2) 对应的结果为

参考资料:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值