• KNN-简单电影测试程序debug


    import numpy as np
    import operator
    
    """
    Parameters:
       无
    returns:
       group  -数据集
       labels -分类标签
    """
    #函数说明:创建数据集
    def createDataSet():
        #6组二维特征
        group = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])
        #6组特征的标签
        labels = ['爱情片','爱情片','爱情片','动作片','动作片','动作片']
        return group,labels
    
    """
    Parameters:
     inX  -用于分类的数据(测试集)
     dataSet - 用于训练的数据(训练集)
     labels  -分类标签
     k  - KNN算法参数,选择距离最小的k个点
    Returns:
      sortedClassCount[0][0]  -分类结果
    """
    #函数说明:KNN算法,分类器
    def classfy0(inX,dataSet,labels,k):
        
        dataSetSize = dataSet.shape[0]#np函数shape[0]返回dataSet的行数,读取的是矩阵第一维度的长度
        #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
        diffMat = np.tile(inX,(dataSetSize,1)) - dataSet
        sqDiffMat = diffMat ** 2#二维特征相减后平方
        sqDistances = sqDiffMat.sum(axis=1)#sum()所有元素相加,sum(0)列相加,sum(1)行相加
        distances = sqDistances ** 0.5#开方,计算出距离
        #返回distances中元素从小到大排序后的索引值
        sortedDistIndices = distances.argsort()
        
        classCount = {}#定一个记录类别次数的字典
        #选择k个最近邻
        for i in range(k):
            voteIlabel = labels[sortedDistIndices[i]]#取出前k个元素的类别
            #dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值
            classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
            #python3中用items()替换python2中的iteritems()
            #key=operator.itemgetter(1)根据字典的值进行排序
            #key=operator.itemgetter(0)根据字典的键进行排序
            #reverse降序排序字典
        sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
            #返回次数最多的类别,即所要分类的类别
        return sortedClassCount[0][0]
    
    
    if __name__ == '__main__':
        #创建数据集
        group,labels = createDataSet()
        test = [101,20]#测试集
        #KNN分类
        test_class = classfy0(test,group,labels,3)
        #打印分类结果
        print(test_class)

    对未知类别属性的数据集中的每个点依次执行以下操作:

    (1)计算已知类别数据集中的点与当前点之间的距离;

    (2)按照距离递增次序排序

    (3)选取与当前点距离最小的k个点

    (4)确定前k个点所在类别的出现频率

    (5)返回前k个点出现频率最高的类别作为当前点的预测分类。

    """
    tile 的用法

    b = [1,3,5]
    import numpy as np
    np.tile(b,[2,3])

    #>>>array([[1, 3, 5, 1, 3, 5, 1, 3, 5],
    [1, 3, 5, 1, 3, 5, 1, 3, 5]])

    argsort返回的是数组值从小到大的索引值

    x = np.array([3,1,2])
    np.argsort(x)

    #>>>array([1, 2, 0], dtype=int64)

    """

  • 相关阅读:
    传球接力
    业务办理
    P2077 红绿灯
    【UR #4】元旦激光炮
    P1939 【模板】矩阵加速(数列)
    #82. 【UR #7】水题生成器
    Visible Trees HDU
    创始人的领导力和合伙人选择
    面向对象笔试题练习一
    MicroPython+北斗+GPS+GPRS:TPYBoardv702短信功能使用说明
  • 原文地址:https://www.cnblogs.com/wex1022/p/14827537.html
Copyright © 2020-2023  润新知