机器学习和python编程都刚开始学,从看代码开始,实践出真知
# -*- coding: utf-8 -*-
from numpy import *
import operator
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] #object.shape[0]= len(object)
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2 # 用矩阵计算欧氏距离,5,6两行,先拓展inX,与dataSet求差,再取平方
sqDistances = sqDiffMat.sum(axis=1) #求和
distances = sqDistances**0.5 #求欧氏距离
sortedDistIndicies = distances.argsort() #排序
classCount={} #定义一个空的dict
for i in range(k): #求最近的k个
voteIlabel = labels[sortedDistIndicies[i]] #投票,k个近邻中哪个类别最多,就把INX归为这一类
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #投票,原本票数+1,如果原本没出现过这个类别,就新建并投1票
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #对投票排序,看看哪个类别票数最高
return sortedClassCount[0][0]
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
group,lables = createDataSet()
print classify0([0,0],group,lables,3)
注释
dataSet.shape[0] :dataSet是一个array,array.shape含有两个元素,shape[0]表示array中的元素个数,shape[1]表示每个元素有几维,比如b=array([[1,2,1],[2,3,1]]),那么shape[0]=2,shape[1]=3
tile(A,reps):用来将一个array重复若干次,再组合成一个新的array,例如b=array([[1,2],[3,4]]) (numpy中的方法)
tile(b,2) [[1 2 1 2] tile(b,(2,1)) [[1,2],[3,4]
[3 4 3 4]] [1,2],[3,4]]
tile(b,(2,2)) [[1,2,1,2] [3,4,3,4]
[1,2,1,2] [3,4,3,4]]
array**2:将array中每个数字取平方
array.sum(axis=) :求和,有两种模式,axis=0求纵轴和,axis=1求横轴和
5,6,7,8几行代码,将输入的inX先拓展,再算和dataSet中所有点的欧氏距离,全都采用矩阵计算
array.argsort:排序,返回值是index序列,比如a=array([3],[2],[1]), a.argsort = [2,1,0]
dict.get(key,default=None) 例子:dict = {'Name':'Zara','Age':27} dict.get('Age')=27 dict.get('Sex',"Never")="Never"
dict=sorted(dic.iteritems(), key,reverse): dic.iteritems()取dic中的键:值;key=operator.itemgetter(1)取第index=1的值作为排序关键字,reverse=true则从大到小排序