机器学习实战(一)个人笔记

 1 from numpy import *
 2 import operator
 3 import math
 4 
 5 def createDataSet():
 6     group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
 7     labels = ['A','A','B','B']
 8     return group,labels
 9 def classify0(inX,dataSet,labels,k):
10     dataSetSize = dataSet.shape[0]
11     diffMat = tile(inX,(dataSetSize,1)) - dataSet
12     sqDiffMat = diffMat**2
13     print sqDiffMat
14     sqDistances = sqDiffMat.sum(axis = 1)
15     distances = sqDistances.argsort()
16     sortedDistIndicies = distances.argsort()
17     classCount={}
18     for i in range(k):
19         voteIlabel = labels[sortedDistIndicies[i]]
20         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
21     sortedClassCount = sorted(classCount.iteritems(),
22                               key = operator.itemgetter(1),reverse = True)
23     return sortedClassCount[0][0]
24 group,labels = createDataSet()
25 datax = input('x:\n')
26 datay = input('y:')
27 tesdata = [datax,datay]
28 print classify0(tesdata,group,labels,3)

简单的kNN算法,基本步骤:

1.对数据集进行设定

2.算出测试样本与给定数据集的距离

3.对各个距离进行排序

4.选取k个距离最小(即最接近数据集)的index

5.在k个距离中选取出现频率最多的标签,并把标签赋给测试样本

ps:程序思路简单,由于本人刚开始接触python,下面标出一些函数用作记忆:

1.numpy中的shape[x]:取给定矩阵的第x+1维长度,由于此程序中仅用2维矩阵,即dataSet.shape[0]取第1维长度,即列的长度(行的个数)= 4

                                其他用法如直接dataSet.shape则会输出矩阵规格,如(4,2)

2.numpy中的tile()方法:tile(A,reps),代码中A为输入的测试样本点坐标,为长度=2的向量,利用tile(A,(dataSIze,1))来把行向量A在本维(即长度上)上扩充

                                 到1倍,再扩充纬度并复制四次得到一个4*2的矩阵,形如:[A]    即后面参数reps为扩充到的维度矩阵

                                                                                                             [A]

                                                                                                             [A]

                                                                                                             [A]

3.python中的list,即使常用于构造矩阵,但是array乘法,依然是结果对应位置值=对应位置元素乘积,不遵循矩阵乘法规则

4.sum()方法:平常我们用的都是sum(...,..,...,)相当于sum(参数表,axis = 0),在0维上相加,当参数为array,就可以简易表示矩阵加法,如二维矩阵举例:

                    mat.sum(axis = 0):使之变为行向量,即列上元素相加(相当于在0维上作加法)

                    mat.sum(axis = 1):使之变为列向量,即行上元素相加(相当于在1维上作加法)

5.argsort()方法:返回一个递增的(从小到大排列)***index***索引的array

                        技巧:返回一个递减的index:argsort(-x)

6.range()方法:range(1,5) 返回一个从1到5的array :[1,2,3,4,5],

                     range(5) 返回一个从0到5的array

7.dictionary中的get方法:get(key,default = None),取字典中的键key,如果没有返回None

8.dictionary中的迭代器iteritems:类似c++中的迭代器,一次返回一个值,知道所有都返回过一次为止,效率很高

9.operator.itemgetter函数:例子:

 

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

2

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

特殊:sorted函数用来排序,sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1),reverse = True)即在第一维上进行排序

 

附加:本代码与书上略有不同,自己加了个可输入的操作,来输入测试样本。

 

posted @ 2017-11-12 14:17  半纸墨阳  阅读(258)  评论(0编辑  收藏  举报