zoukankan      html  css  js  c++  java
  • KNN手写实践:Python基于数据集整体计算以及排序

    1. 距离计算,不要通过遍历每个样本来计算和指定样本距离,而是通过对于指定样本进行广播(复制)成为一个shape和全局一致后,再进行整体计算,这里的广播 / 复制采用的是tile函数来实现的:
    2. numpy的排序函数argsort,这个函数可以默认按照冒泡排序进行排序;对于一维数组,正序排列正常传入数组即可返回np.argsort(x);如果是逆序则是np.argsort(-x);类似的对于二维数组,需要指定一下axis,如果0代表按照列进行排序,axis=1代表按照行进行排序;
    3. 对于字典的排序,可以使用sorted函数,来进行排序;这里牵涉到python常见的排序函数:
    1)python内置的sort函数,这个函数特点就是没有返回值,原始数组将会被改变;
    a = [2,5,1,3,0,1,8]
    a.sort()
    a
    2)sorted函数,也是python内置函数,他不会改变原始数组内容;而是返回一个新的对象;其中有一个key参数,这个参数代表的是一个处理函数,一种是lamba,通过lamba匿名函数的模式来指定排序列:
    s = [('a', 'zhangsan', 17), ('b', 'lisi', 23), ('c', 'lisi', 10)]
    sorted(s, key=lambda x: x[2])
    sorted(s, key=lambda x: x[0])
    另外一个强大的排序模式就是operator,需要import operator之后才可以使用,在指定单列排序上其实和lambda是类似的,但是强大在于可以进行多级排序,类似于sql中groupby可以针对多个字段进行排序;
    print(sorted(s, key=operator.itemgetter(2)))
    print(sorted(s, key=operator.itemgetter(1,2)))
    3)numpy.argsort,参见上一条介绍。
    4. 对于tile函数,注意是numpy里面的函数,其第一个参数也是np.array;在手写体的判断实现中,我错误的传入了python原生的List类型,导致内存错误(MemoryError),开始的时候我以为是因为内存溢出,但是通过sys.getsizeof来查看发现python原生的List对象其实占用的空间更小;于是排查了一下,发现tile的函数接收的是“array_like",即numpy里面的数组类型。
     
    def knnClassifier2(sample, dataset, labels, knum):
    rowsCount = len(dataset)
    diff = tile(sample, (rowsCount, 1)) - dataset
    diffSq = diff **2
    diffSqSum = diffSq.sum(axis=1)
    distance = diffSqSum ** 0.5
    cls2count={}
    sortedIndics=distance.argsort()
    '''
    for index in sortedIndics:
    cls =labels[index]
    cls2count[cls] = cls2count.get(cls, 0) + 1
    '''
    for index in range(knum):
    cls = labels[sortedIndics[index]]
    cls2count[cls] = cls2count.get(cls, 0) + 1
    sortedCls2count = sorted(cls2count.items(), key=lambda x:x[1], reverse=True)
     
    return sortedCls2count[0][0]
  • 相关阅读:
    ggplot2|theme主题设置,详解绘图优化-“精雕细琢”-
    ggplot2|theme主题设置,详解绘图优化-“精雕细琢”
    阻抗设计01
    Geber文件,装配图,BOM表的输出
    c语言里面你不知道的break与switch,contiune的用法
    数据结构之链表学习01
    数据结构概念及连续存储数组的算法演示
    使用malloc和free函数进行内存动态分配
    浅谈结构体
    浅谈指针01
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/10461262.html
Copyright © 2011-2022 走看看