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]
  • 相关阅读:
    『转』 PreTranslateMessage作用和使用方法
    either...or...与 neither...nor...
    CSS五類常用選擇器(收藏)
    JQuery选择器(selectors 的xpath语法应用)
    我是怎么看friends练口语的(转贴)
    变量的命名方法【Hungarian】【camelCase】【PascalCase】
    JavaScript继承机制的实现(未完)
    JavaScript面向对象编程(1) 基础
    Javascript:Object.extend
    JavaScript面向对象编程(2) 类的定义
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/10461262.html
Copyright © 2011-2022 走看看