学习的第一个机器学习算法为KNN算法
当然KNN算法可以通过sklearn库直接调用
但还是希望可以通过操作一边记住原理,以及顺便复习一些python的基础函数
本代码并非原创,摘选自《机器学习实战》的代码部分
但由于该书调用了部分python的自带函数
故并非可以一眼看懂,故做此读书笔记,用注释帮助自己理解。
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为需要分类的数据点,dataSet为用于训练的数据集,labels为用于分类的训练集的标签,K为KNN算法中邻居数
dataSetSize = dataSet.shape[0]#shape[0]返回矩阵的行数,在本场景为返回数具集内的4个数据
diffMat = tile(inX, (dataSetSize,1))-dataSet#tile在此处的作用为,构建一个每个数据点都与inX相同,且点数与dataSet相同的数据集,相减后用于存放该点与各点不同维度上的距离差
sqDiffMat = diffMat**2#计算各维度距离的平方
sqDistances =sqDiffMat.sum(axis=1)#横向加总,即计算平方和,则每一个和代表待分类点到该点的距离
distances = sqDistances**0.5#开方得到距离
sortedDistIndicies = distances.argsort()#此函数将distances距离从小到大排列,并且返回的为原来的索引值
classCount={} #生成字典
for i in range(k): #得到距离从小打到排名前K个的点的索引
voteIlabel = labels[sortedDistIndicies[i]] #将排名第i的点的标签放入voteIlabel中
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #get为返回字典中key所对应的值,当不存在时,返回默认值,此处为0. 此部为计算排名前K某一Label的出现个数
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True) #通过items将字典变为list,可做list输出,operator.itemgetter(1)指用位于1位置的数值。
return sortedClassCount[0][0]#返回排名第一的0号位值,即排名第一的标签,作为分类结果
group,labels = createDataSet()
classify0([0.7,0.8],group,labels,3)
函数复习
tile
a = [3,2] # 使用tile将a做复制,变成对应shape的矩阵形式
tile (a,(2,2)) # 得到 [[3,2,3,2],[3,2,3,2]]
argsort() #排序并返回索引
get(key, b)# 返回字典对应表key的值,不存在则返回b
dict.item #将字典对象的各键和值对应,返回成一系列 list
总结,KNN算法的思想为
1.计算距离
2.排序
3.取前K名
4.计算前K名各类别的数量
5.按数量将各类别排序
6.选择数量最多的类别
K在0,1分类时取奇数,在多分类时可能会出现排名并列。
本学习笔记纯自用,没有任何参考价值以及正确性保证。