机器学习实战(一)个人笔记
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)即在第一维上进行排序
附加:本代码与书上略有不同,自己加了个可输入的操作,来输入测试样本。