机器学习实战之KNN
创造数据集
from numpy import *
import operator
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
创造一个4*2的array,数值可理解为坐标,label就是对应分类
python时间
tile
tile的作用是把一个矩阵复制出一个新的矩阵,如A是一个矩阵
tile(A,1) = A
tile(A,2,3)就是把A作为一个元素,复制成新的2*3的矩阵,每一个元素就是一个A
shape
shape是获取矩阵的size的函数
A = [1,2,3;4,5,6;7,8,9]
A.shape = (3,3)
A.shape[0] = A.shape[1] = A.shape[2] = 3
argsort
argsort是一个排序后获取下标的函数
A = [5,4,3,1,2]
B = A.argsort() = [3,4,2,1,0]
itemgetter
itemgetter是operator的一个函数
b=operator.itemgetter(n-1)
b成为获取对象第n个元素的函数
A = [1,2,3]
b(A) = 2
axis
axis是表示矩阵的行列的
a = [1,2,3; 4,5,6]
axis默认为0,表示列
a.sum() = 21
a.sum(axis=0) = [5,7,9] 列求和
a.sum(axis=1) = [6,15] 行求和
dict.get
python中的字典dict,获取对应值有两种方式
1. key2 = dict[key1] ,但是假如字典不存在key1会发生错误
2. key2 = dict.get(key1,default) 当不存在key1,返回默认值default
完整代码及注释
py import *
import operator
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
#上面函数是根据已有的数据,创造数据集
def classify0(inX,dataSet,labels,k):
#inX是待分类的数据,dataSet是已知的数据集,labels是已知数据集的分类,k是算法抽取的最相邻点的数量
dataSetSize = dataSet.shape[0]
#获取dataSet的点的个数
diffMat = tile(inX,(dataSetSize,1)) - dataSet
#tile函数把待分类点组成一个n维向量,再和原有数据集每个点作差
#相当于,得到(x-x1),(x-x2),(x-x3)···
sqDiffMat = diffMat ** 2
#(x-x1)^2 ···
sqDistances = sqDiffMat.sum(axis=1)
#各个维度的差的平方求和
distances = sqDistances ** 0.5
#和开方最终得到欧式距离
sortedDistIndicies = distances.argsort()
#根据求得的距离进行排序,并得到对应的数据集的下标
classCount = {}
#新建字典,放置距离小的数据的标签及其对应数量
for i in range(k):
#放置距离小的前K个点
voteIlabel = labels[sortedDistIndicies[i]]
#根据下标得到当前这个数据点的label
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#字典中label对应值+1
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
#根据字典的key2进行排序
sorted classCount
return sortedClassCount[0][0]
#排序产生的是一个列表,列表的元素是一个tuple
#返回出现最多的标签,也就是最终分类结果