Python KNN最近邻分类算法

KNN最近邻算法:利用向量之间的距离来分类。
步骤:
第一步:计算新样本与已知分类样本之间的距离。
第二步:将所求距离按从小到大排列。
第三步:选取距离最近的k个样本。
第四步:将新样本归为以上k个样本大多数中的一类。
以下为KNN最近邻分类算法的python代码:
第一部分:KNN分类代码

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 22 13:21:22 2016
K-NearestNeighbor
"""

import  numpy  as  np
import  operator

class  KNNClassifier ( ):
      """Thisis a Nearest Neighbor classifier. """

      #定义k的值
      def  __init__ ( self ,  k = 3 ):
          self._k  =  k

      #计算新样本与已知分类样本的距离并从小到大排列   
      def  _calEDistance ( self ,  inSample ,  dataset ):
        =  dataset. shape [ 0 ]
        diffMat  =  np. tile (inSample ,  (m , 1 ) )  -dataset
        sqDiffMat  =  diffMat** 2  #每个元素平方
        sqDistances  =  sqDiffMat. sum (axis  =  1 )    #求和
        distances  =  sqDistances**  0.5  #开根号
          return  distances. argsort ( )    #按距离的从小到达排列的下标值

     
      def  _classify0 ( self ,  inX ,  dataSet ,  labels ):
        =  self._k
        dataSetSize  =  dataSet. shape [ 0 ]                   
        diffMat  =  np. tile (inX ,  (dataSetSize , 1 ) )  -dataSet      
        sqDiffMat  =  diffMat** 2
        sqDistances  =  sqDiffMat. sum (axis = 1 )                   
        distances  =  sqDistances** 0.5
        sortedDistIndicies  =  distances. argsort ( )             
        classCount = { }                                       
          for  in  range (k ):
            voteIlabel  =  labels [sortedDistIndicies [i ] ]
            classCount [voteIlabel ]  =  classCount. get (voteIlabel , 0 )  1
        sortedClassCount  =  sorted (classCount. iteritems ( ) ,  key = operator. itemgetter ( 1 ) ,  reverse = True )
          return  sortedClassCount [ 0 ] [ 0 ]
         
      #对一个样本进行分类
      def  _classify ( self ,  sample ,  train_X ,  train_y ):
          #数据类型检测
          if  isinstance (sample ,  np. ndarray )  and  isinstance (train_X ,  np. ndarray )  \
                  and  isinstance (train_y ,  np. ndarray ):
              pass
          else:
              try:
                sample  =  np. array (sample )
                train_X  =  np. array (train_X )
                train_y  =  np. array (train_y )
              except:
                  raise  TypeError ( "numpy.ndarrayrequired for train_X and .." )
        sortedDistances  =  self._calEDistance (sample ,  train_X )
        classCount  =  { }
          for  in  range ( self._k ):
            oneVote  =  train_y [sortedDistances [i ] ]  #获取最近的第i个点的类别
            classCount [oneVote ]  =  classCount. get (oneVote ,  0 )  1
        sortedClassCount  =  sorted (classCount. iteritems ( ) ,\
                                    key = operator. itemgetter ( 1 ) ,  reverse = True )
          #print"the sample :", sample, "is classified as",sortedClassCount[0][0]   
          return  sortedClassCount [ 0 ] [ 0 ]
     
     
      def  classify ( self ,  test_X ,  train_X ,  train_y ):
        results  =  [ ] 
          #数据类型检测
          if  isinstance (test_X ,  np. ndarray )  and  isinstance (train_X ,  np. ndarray )  \
                  and  isinstance (train_y ,  np. ndarray ):
              pass
          else:
              try:
                test_X  =  np. array (test_X )
                train_X  =  np. array (train_X )
                train_y  =  np. array (train_y )
              except:
                  raise  TypeError ( "numpy.ndarrayrequired for train_X and .." )
        =  len (np. shape (test_X ) )
          if  ==  1:
            sample  =  test_X
            result  =  self._classify (sample ,  train_X ,  train_y )
            results. append (result )
          else:
              for  in  range ( len (test_X ) ):
                sample  =  test_X [i ]
                result  =  self._classify (sample ,  train_X ,  train_y )
                results. append (result )
          return  results
         
         
if  __name__ == "__main__":
    train_X  =  [ [ 1 ,  2 ,  0 ,  1 ,  0 ] ,
                [ 0 ,  1 ,  1 ,  0 ,  1 ] ,
                [ 1 ,  0 ,  0 ,  0 ,  1 ] ,
                [ 2 ,  1 ,  1 ,  0 ,  1 ] ,
                [ 1 ,  1 ,  0 ,  1 ,  1 ] ]
    train_y  =  [ 1 ,  1 ,  0 ,  0 ,  0 ]
    clf  =  KNNClassifier ( =  3 )
    sample  =  [ [ 1 , 2 , 0 , 1 , 0 ] , [ 1 , 2 , 0 , 1 , 1 ] ]
    result  =  clf. classify (sample ,  train_X ,  train_y )

第二部分:KNN测试代码

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 22 13:21:22 2016
K-NearestNeighbor
"""

import  numpy  as  np
import  operator

class  KNNClassifier ( ):
      """Thisis a Nearest Neighbor classifier. """

      #定义k的值
      def  __init__ ( self ,  k = 3 ):
          self._k  =  k

      #计算新样本与已知分类样本的距离并从小到大排列   
      def  _calEDistance ( self ,  inSample ,  dataset ):
        =  dataset. shape [ 0 ]
        diffMat  =  np. tile (inSample ,  (m , 1 ) )  -dataset
        sqDiffMat  =  diffMat** 2  #每个元素平方
        sqDistances  =  sqDiffMat. sum (axis  =  1 )    #求和
        distances  =  sqDistances**  0.5  #开根号
          return  distances. argsort ( )    #按距离的从小到达排列的下标值

     
      def  _classify0 ( self ,  inX ,  dataSet ,  labels ):
        =  self._k
        dataSetSize  =  dataSet. shape [ 0 ]                   
        diffMat  =  np. tile (inX ,  (dataSetSize , 1 ) )  -dataSet      
        sqDiffMat  =  diffMat** 2
        sqDistances  =  sqDiffMat. sum (axis = 1 )                   
        distances  =  sqDistances** 0.5
        sortedDistIndicies  =  distances. argsort ( )             
        classCount = { }                                       
          for  in  range (k ):
            voteIlabel  =  labels [sortedDistIndicies [i ] ]
            classCount [voteIlabel ]  =  classCount. get (voteIlabel , 0 )  1
        sortedClassCount  =  sorted (classCount. iteritems ( ) ,  key = operator. itemgetter ( 1 ) ,  reverse = True )
          return  sortedClassCount [ 0 ] [ 0 ]
         
      #对一个样本进行分类
      def  _classify ( self ,  sample ,  train_X ,  train_y ):
          #数据类型检测
          if  isinstance (sample ,  np. ndarray )  and  isinstance (train_X ,  np. ndarray )  \
                  and  isinstance (train_y ,  np. ndarray ):
              pass
          else:
              try:
                sample  =  np. array (sample )
                train_X  =  np. array (train_X )
                train_y  =  np. array (train_y )
              except:
                  raise  TypeError ( "numpy.ndarrayrequired for train_X and .." )
        sortedDistances  =  self._calEDistance (sample ,  train_X )
        classCount  =  { }
          for  in  range ( self._k ):
            oneVote  =  train_y [sortedDistances [i ] ]  #获取最近的第i个点的类别
            classCount [oneVote ]  =  classCount. get (oneVote ,  0 )  1
        sortedClassCount  =  sorted (classCount. iteritems ( ) ,\
                                    key = operator. itemgetter ( 1 ) ,  reverse = True )
          #print"the sample :", sample, "is classified as",sortedClassCount[0][0]   
          return  sortedClassCount [ 0 ] [ 0 ]
     
     
      def  classify ( self ,  test_X ,  train_X ,  train_y ):
        results  =  [ ] 
          #数据类型检测
          if  isinstance (test_X ,  np. ndarray )  and  isinstance (train_X ,  np. ndarray )  \
                  and  isinstance (train_y ,  np. ndarray ):
              pass
          else:
              try:
                test_X  =  np. array (test_X )
                train_X  =  np. array (train_X )
                train_y  =  np. array (train_y )
              except:
                  raise  TypeError ( "numpy.ndarrayrequired for train_X and .." )
        =  len (np. shape (test_X ) )
          if  ==  1:
            sample  =  test_X
            result  =  self._classify (sample ,  train_X ,  train_y )
            results. append (result )
          else:
              for  in  range ( len (test_X ) ):
                sample  =  test_X [i ]
                result  =  self._classify (sample ,  train_X ,  train_y )
                results. append (result )
          return  results
         
         
if  __name__ == "__main__":
    train_X  =  [ [ 1 ,  2 ,  0 ,  1 ,  0 ] ,
                [ 0 ,  1 ,  1 ,  0 ,  1 ] ,
                [ 1 ,  0 ,  0 ,  0 ,  1 ] ,
                [ 2 ,  1 ,  1 ,  0 ,  1 ] ,
                [ 1 ,  1 ,  0 ,  1 ,  1 ] ]
    train_y  =  [ 1 ,  1 ,  0 ,  0 ,  0 ]
    clf  =  KNNClassifier ( =  3 )
    sample  =  [ [ 1 , 2 , 0 , 1 , 0 ] , [ 1 , 2 , 0 , 1 , 1 ] ]
    result  =  clf. classify (sample ,  train_X ,  train_y )


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding的叶子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值