实战学习机器学习——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 ] #返回排列之后的元组的第一个元素中的第一个元素
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在《机器学习实战》书中附录处有简单清楚的介绍。