机器学习实战学习——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
def classify0(inX, dataSet, labels, k):
#四个输入参数,inX是用于分类的输入向量;输入的训练样本集;标签向量;k值。其中标签向量的元素数目与矩阵dataSet的行数相同
#array都点运算,matrix才是矩阵运算
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]]#得到每一个的标签值
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#记录标签值出现了几次,存在字典里
"""
classCount.get(voteIlabel,0)返回字典classCount中voteIlabel元素对应的值,若无,则进行初始化,因为开始是空字典,
#得到的第一个键没有值,所以得到的是默认值0,然后加一将其重新赋给这个键。接着查看第二个出现的标签值,如果跟上一个一样,那么
get的值就是1,此时再加一变成2;如果不一样,则重新得到一个键,并赋值为1.这样就达到了统计次数的目的
"""
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
"""
sorted(对象,排序值,reverse=True/False),将字典classCount分解为元组列表
若classCount = {‘A’:1,‘B’:2,‘C’:3},则分为
[‘A’,’B’,’C’] 与 [1, 2, 3]两组,items=([‘A’,’B’,’C’] ,[1, 2, 3])
operator.itemgetter(1)作用是读取元组items内的第2列(索引值为1),reverse=True降序排列
sorted返回值是对象按照要求重新排列之后的相同的类型,只是改了个数据
"""
return sortedClassCount[0][0]#返回排列之后的元组的第一个元素中的第一个元素
shape()函数的用法
import numpy as np
k = np.matrix([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print(np.shape(k)) # 输出(3,4)表示矩阵为3行4列
print(k.shape[0]) # shape[0]输出3,为矩阵的行数
print(k.shape[1]) # 同理shape[1]输出列数
- tile函数
tile(inx, (datasetsize, 1)):将矩阵inx纵向复制datasetsize份(成了datasetsize行),再横向复制一份。
#title(对象矩阵,([m,] k )):title函数是个复制函数,作用是将对象矩阵作为一个单元进行横向和纵向复制,形成一个m*k的矩阵。注意的是,当()只有一个数值时,只会横向复制。
2.sum函数
sqdiffmat.sum(axis=1):矩阵sqdiffmat的各行相加
sum(对象,axis=0/1)或者对象.sum(axis=0/1):
axis=0代表对象的所有元素进行相加返回一个结果值;axis=1表示同行的元素相加,每行返回一个值,通常默认的,且不用写出来。
- argsort函数
distances.argsort():对distances进行从小到大排序,返回的是每个值在distances中的索引位置。如排序后得到[3,2,0,1],最小的是排序对象的索引号为3的元素。
- 关于数组numpy中的array和matrix在《机器学习实战》书中附录处有简单清楚的介绍。