7.2一个简单分类的程序

def classify0(inX, dataSet, labels, k):

    dataSetSize = dataSet.shape[0]                              计算行数
    diffMat = tile(inX, (dataSetSize,1)) - dataSet            计算测试点与所选样本的距离
    sqDiffMat = diffMat**2                                             矩阵单项的平方
    sqDistances = sqDiffMat.sum(axis=1)                     矩阵单行的求和
    distances = sqDistances**0.5                                  求距离
    sortedDistIndicies = distances.argsort()                  距离的从小到大的排序
    classCount={}          
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]              
顺序取距离由小变大的前k位,取对应标签
        print(i)                    
        print(sortedDistIndicies[i])
        print(voteIlabel)
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1   每个标签出现的次数
        print(classCount[voteIlabel])
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)                                                                              排序
    print(sortedClassCount)
    myset={'dataSetSize':dataSetSize,'diffMat':diffMat,'sqDiffMat':sqDiffMat,'sqDistances':sqDistances,'distances':distances,'sortedDistIndicies':sortedDistIndicies,'classCount':classCount}
    return sortedClassCount[0][0],myset,classCount


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


#####说明:sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)

函数参数解释:sorted(iterable[, cmp[, key[, reverse]]])

sorted第一个参数为list(即[]序列)或者迭代器(本例)。

         cmp参数:指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如:

                                    cmp接受一个函数,拿整形举例,形式为:

                                   def f(a,b):

                                   return a-b

                                 如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数;a逻辑等于b,函数返回0;a逻辑大于b,                                  函数返回正数就行了

            key参数:指定序列中排序的元素,这里调用opertor.itemgetter(1),就是取classcount序列的每个元素第2个值排序。                          再如: students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)],其中key=operator.itemgetter(1,2),就是表示取                                      students的每个元素的第2个值

             reverse参数:接受False 或者True 表示是否逆序

=======================================

调用

import os
os.chdir('C:\\Users\\admin\\Desktop')
import kNN


group,label=kNN.createDataSet()
t,myset,sort=kNN.classify0([0,0],group,label,3)


for key in myset:
  print(key+':')
  print(myset[key])



==================================================================

需要了解的背景知识

==============================================================

Python中的sorted函数以及operator.itemgetter函数

operator.itemgetter函数
operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子。

a = [1,2,3] 
>>> b=operator.itemgetter(1)      //定义函数b,获取对象的第1个域的值
>>> b(a) 

>>> b=operator.itemgetter(1,0)  //定义函数b,获取对象的第1个域和第0个的值
>>> b(a) 
(2, 1)

要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。

sorted函数
Python内置的排序函数sorted可以对list或者iterator进行排序,官网文档见:http://docs.python.org/2/library/functions.html?highlight=sorted#sorted,该函数原型为:

sorted(iterable[, cmp[, key[, reverse]]])

参数解释:

(1)iterable指定要排序的list或者iterable,不用多说;

(2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如:

      students为类对象的list,没个成员有三个域,用sorted进行比较时可以自己定cmp函数,例如这里要通过比较第三个数据成员来排序,代码可以这样写:
      students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
      sorted(students, key=lambda student : student[2])
(3)key为函数,指定取待排序元素的哪一项进行排序,函数用上面的例子来说明,代码如下:
      sorted(students, key=lambda student : student[2])

      key指定的lambda函数功能是去元素student的第三个域(即:student[2]),因此sorted排序时,会以students所有元素的第三个域来进行排序。

有了上面的operator.itemgetter函数,也可以用该函数来实现,例如要通过student的第三个域排序,可以这么写:
sorted(students, key=operator.itemgetter(2)) 
sorted函数也可以进行多级排序,例如要根据第二个域和第三个域进行排序,可以这么写:
sorted(students, key=operator.itemgetter(1,2))

即先跟句第二个域排序,再根据第三个域排序。
(4)reverse参数就不用多说了,是一个bool变量,表示升序还是降序排列,默认为false(升序排列),定义为True时将按降序排列。

sorted函数更多的例子可以参考官网文档:https://wiki.python.org/moin/HowTo/Sorting/。

                                            第一章 K-neans算法
1,pip list 查看安装的包
2,os.chdir(‘’)设置工作目录
==========================================================
3.from import 与import的区别
导入modules,import与from...import的不同之处在于,简单说:
# 如果你想在程序中用argv代表sys.argv,
# 则可使用:from sys import argv
# 一般说来,应该避免使用from..import而使用import语句,
# 因为这样可以使你的程序更加易读,也可以避免名称的冲突
==============================================================
4.numpy.tile(A,reps)函数的使用,即数组A的重复次数reps
(1)A的类型众多,几乎所有类型都可以:array, list, tuple, dict, matrix以及基本数据类型int, string, float以及bool类型。
reps的类型也很多,可以是tuple,list, dict, array, int,bool.但不可以是float, string, matrix类型。
假定A的维度为d,reps的长度为len
(2)函数操作示例
首先给几个示例:
>>> tile(1.3,2)
array([ 1.3,  1.3])
array([1, 2, 1, 2, 1, 2])
>>> tile((1,2,3),2)
array([1, 2, 3, 1, 2, 3])
>>> a=[[1,2,3],[4,5,5]]
>>> tile(a,2)
array([[1, 2, 3, 1, 2, 3],
       [4, 5, 5, 4, 5, 5]])
>>> tile([1,2,3],[2,2,2,2])
array([   
                 [  [[1, 2, 3, 1, 2, 3],[1, 2, 3, 1, 2, 3]], [[1, 2, 3, 1, 2, 3],[1, 2, 3, 1, 2, 3]]   ],




                 [  [[1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3]],[[1, 2, 3, 1, 2, 3],[1, 2, 3, 1, 2, 3]]  ]
         ])
===========================================================================
5,数组项目的求和,比如数组A
A.sum(axis=(0或者1)),其中axis=0,表示列求和;axis=1,表示行求和   
===============================================================
6.数组的大小索引函数argsort()
举例:  a=numpy.array([1,3,2])        a.argsort()
           输出结果为[0,2,1]就是每个向量的值大小的索引
举例:   x = numpy.array([[0, 3], [2, 2]])   x.argsort()
           [[0,1],[0,0]]
   





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章