• 《机实战》第2章 K近邻算法实战(KNN)


    1.准备:使用Python导入数据

    1.创建kNN.py文件,并在其中增加下面的代码:

    from numpy import * #导入科学计算包
    import operator #运算符模块,k近邻算法执行排序操作时将使用这个模块提供的函数
    
    def createDataSet():
        group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
        labels=['A','A','B','B']
        return group,labels
    ##print(createDataSet())

    2.在knn.py保存处,shift+右键——‘在此处打开命令窗口’,输入:python,再输入:import knn,导入刚编辑的knn.py模块:

    >>> python
    >>> import knn

    3.为了确保输入相同的数据集,knn模块中定义了函数createDataSet,在Python命令提示符下输入下属命令:

    >>> group,labels = knn.createDataSet()

     4.再输入group,labels查看是否正确赋值:

    >>> group
    
    '''
    显示:
    array([[1. , 1.1],
    [1. , 1. ],
    [0. , 0. ],
    [0. , 0.1]])
    '''
    >>> labels
    
     #显示:['A', 'A', 'B', 'B']

    5.上代码解析的数据如下图,array表示数据的定位,labels表示数据的对应分类

     

      

     2.实施kNN分类算法

    A.2-1函数伪代码:
    对未知类别属性的数据集中的每个点依次执行以下操作:
      1. 计算已知类别数据集中的点与当前点之间的距离;【测距】
      2. 按照距离递增次序排序;【距离排序】
      3. 选取与当前点距离最小的k个点;【选最小K个点】
      4. 确定前k个点所在类别的出现频率;【k个点所在类别】
      5. 返回前k个点出现频率最高的类别作为当前点的预测分类。【返回类别】

    B.函数真正代码:

    from numpy import * #导入科学计算包
    import operator #运算符模块,k近邻算法执行排序操作时将使用这个模块提供的函数
    def classify0(inX, dataSet, labels, k):
        dataSetSize = dataSet.shape[0] #得到数据集行数
        #print(dataSetSize) #结果:4
        #❶(以下三行)距离计算
        diffMat = tile(inX, (dataSetSize,1)) - dataSet #把待求值转为 (datasetsize列,1行)-训练集
        #print(tile(inX, (dataSetSize,1))) #结果:[[2 1][2 1][2 1][2 1]]
        #print(diffMat)  #结果:[[ 1.  -0.1] [ 1.   0. ] [ 2.   1. ] [ 2.   0.9]]
        
        sqDiffMat = diffMat**2 #求上式结果的平方
        #print(sqDiffMat) #结果:[[1.   0.01] [1.   0.  ] [4.   1.  ] [4.   0.81]]
        
        sqDistances = sqDiffMat.sum(axis=1) #axis=0是按照行求和,axis=1是按照列进行求和
        #print(sqDistances) #结果:[1.01 1.   5.   4.81]
        
        distances = sqDistances**0.5 #开根号
        #print(distances) #结果[1.00498756 1.         2.23606798 2.19317122]
        
        sortedDistIndicies = distances.argsort()#把向量中每个元素进行排序,而它的结果是元素的索引形成的向量
        #print(sortedDistIndicies)#结果:[1 0 3 2]
        
        classCount={}
        #❷ (以下两行)选择距离最小的k个点
        for i in range(k):
            voteIlabel = labels[sortedDistIndicies[i]]
            #print(voteIlabel) #结果:两次A
            
            classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
            #print(classCount[voteIlabel]) #结果:计数1,2
            
        #❸ 排序。此处的排序为逆序,即按照从最大到最小次序排序 (注意,python3.5以上版本,原classCount.iteritems()变为classCount.items())
        sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
        #print(sortedClassCount) #结果:[('A', 2)]
        
        print(sortedClassCount[0][0]) #结果:A.返回发生频率最高的元素标签
        return sortedClassCount[0][0]
        
    classify0((2,1),array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]),['A','A','B','B'],3)
    解释:函数参数:
    • inX:待分类数据
    • dataSet:训练集
    • labels:与训练集一一对应的标签
    • k:要选取的 前k个值

    解释❶

    ♥tile函数:

    我们知道inX是个向量,而dataset是个矩阵,两者之间要进行相减的运算,需要把这个向量也补成一个和dataset有相同行数列数的矩阵,怎么个补法呢。这就要看tile()的第二个参数了,也就是上面的(datasetsize,1),这个参数的意思就是把inX补成有datasetsize行数的矩阵。然后和dataset相减就是根据矩阵的减法进行的

    例:假如 inX是(1,2) datasetsize =3 那么经过 tile()转换后产生了一个这样的矩阵([1,2],[1,2],[1,2])

    ♠计算距离:

    用【欧氏距离公式】,计算两个向量点xA和xB之间的距离:(xB0,xB1)和(xA0,xA1

     例1.如点(0, 0)与(1, 2)之间的距离计算为:

     例2.如果数据集存在4个特征值,则点(1, 0, 0, 1)与(7, 6, 9, 4)之间的距离计算为:

    ♠ sqdiffMat.sum(axis = 1)函数

    假如sqdiffMat是([1,2],[0,1],[3,4])关注下axis这个参数,它影响了你对矩阵求和时候的顺序,axis=0是按照行求和,axis=1是按照列进行求和,因此这样的求和结果就是([4,7])

    ♠ argsort()函数

    这个函数的作用很简单,就是把向量中每个元素进行排序,而它的结果是元素的索引形成的向量。sorted()函数返回的是一个list。

    例如:

    distance是这么个东西------([1,4,3])

    经过distance.argsort()之后的结果是([0,2,1])


    整合,并运行一下:

    from numpy import * #导入科学计算包
    import operator #运算符模块,k近邻算法执行排序操作时将使用这个模块提供的函数
    
    def createDataSet():
        group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
        labels=['A','A','B','B']
        return group,labels
    ##print(createDataSet())
    
    def classify0(inX, dataSet, labels, k):
        dataSetSize = dataSet.shape[0] #得到数据集行数
        #print(dataSetSize) #结果:4
        #❶(以下三行)距离计算
        diffMat = tile(inX, (dataSetSize,1)) - dataSet #把待求值转为 (datasetsize列,1行)-训练集
        #print(tile(inX, (dataSetSize,1))) #结果:[[2 1][2 1][2 1][2 1]]
        #print(diffMat)  #结果:[[ 1.  -0.1] [ 1.   0. ] [ 2.   1. ] [ 2.   0.9]]
        
        sqDiffMat = diffMat**2 #求上式结果的平方
        #print(sqDiffMat) #结果:[[1.   0.01] [1.   0.  ] [4.   1.  ] [4.   0.81]]
        
        sqDistances = sqDiffMat.sum(axis=1) #axis=0是按照行求和,axis=1是按照列进行求和
        #print(sqDistances) #结果:[1.01 1.   5.   4.81]
        
        distances = sqDistances**0.5 #开根号
        #print(distances) #结果[1.00498756 1.         2.23606798 2.19317122]
        
        sortedDistIndicies = distances.argsort()#把向量中每个元素进行排序,而它的结果是元素的索引形成的向量
        #print(sortedDistIndicies)#结果:[1 0 3 2]
        
        classCount={}
        #❷ (以下两行)选择距离最小的k个点
        for i in range(k):
            voteIlabel = labels[sortedDistIndicies[i]]
            #print(voteIlabel) #结果:两次A
            
            classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
            #print(classCount[voteIlabel]) #结果:计数1,2
            
        #❸ 排序。 3.5以上版本,原classCount.iteritems()变为classCount.items()
        sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
        #print(sortedClassCount) #结果:[('A', 2)]
        
        #print(sortedClassCount[0][0]) #结果:A
        return sortedClassCount[0][0]

    运行:进入文件所在目录:knn.py保存处,shift+右键——‘在此处打开命令窗口’,输入:python,然后输入:

    C:UsersAdministratorDesktop机学-pdf机器学习实战>python
    Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD6
    4)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    
    >>> import knn #导入文件
    >>> knn.createDataSet() #调用数据集创建函数,创建数据
    (array([[1. , 1.1],
           [1. , 1. ],
           [0. , 0. ],
           [0. , 0.1]]), ['A', 'A', 'B', 'B'])
    
    >>> group,labels=knn.createDataSet() #把返回的值分别赋值给group,labels
    
    >>> knn.classify0((0,0), group, labels, 3) #运行分类函数,返回预测分类B
    'B'
    >>>

     

  • 相关阅读:
    法院
    Spring Cloud常用组件
    PowerShell使用教程
    浅谈3DES加密解密
    SC win consul
    SB-Token-Jwt
    前端MVC Vue2学习总结
    spring-session-data-redis
    SpringBoot WS
    SpringBoot之使用Spring Session集群-redis
  • 原文地址:https://www.cnblogs.com/chenxi188/p/11629651.html
Copyright © 2020-2023  润新知