写在前面
第一次来到CSDN大家庭,以学习笔记为开篇。《机器学习实战》一书基于Python2为基础编写,在Python3盛行的时代想必是要有所变动。故写此文,记录学习。
为什么没有第一章?
第一章以及后续所有章节准备用思维导图呈现。后续在我学完整本书后放出。
什么是kNN?
kNN是k-近邻算法,理论性意思书上、百度上有。帮助理解意思我比喻下,一个羊圈有一群羊,且分多种类别的羊,比如西部羊、东部羊、太平羊和北冰羊等。每种羊有很多种特征(比如羊角长度,羊毛颜色等。),知道每只羊属于哪种羊。然后来了一只羊,观察他的特征和羊圈里哪些羊像,找出最像的几只(具体几只,就是设定的k值),然后看看这几只羊里哪种羊最多,那么新的羊就是这个种类。
2.1
先新建一个kNN.py文件
#导入科学计算包numpy和运算符模块operator
from numpy import *
import operator as op
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
在IPython下输入以下代码
>>>import kNN # 导入kNN.py
>>>group,label = kNN.createDataSet() # 引用createDataSet()
>>>group # 查看group
Out[1]:
array([[1. , 1.1],
[1. , 1. ],
[0. , 0. ],
[0. , 0.1]])
>>>labels # 查看labels
Out[2]: ['A', 'A', 'B', 'B']
继续在kNN.py中编辑,实现kNN算法
def classify0(inX, dataSet, labels, k):
# 得到dataSet的行数
dataSetSize = dataSet.shape[0]
# 二维特征相减
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
# 平方
sqDiffMat = diffMat**2
# sum()求和
# axis=1跨列
sqDistances = sqDiffMat.sum(axis=1)
# 开方,得到距离
distances = sqDistances**0.5
# 将distances中的元素从小到大排列,提取其对应的index(索引),然后输出到sortedDistIndices
sortedDistIndices = distances.argsort()
# 定义记录类别次数的一个字典
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndices[i]]
# 得到类别次数
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
# 注意!!!!
# python3中用items()替换python2中的iteritems(),书上这里还是iteritems()
# key=operator.itemgetter(1)根据字典的值进行排序
sortedClassCount = sorted(classCount.items(),key=op.itemgetter(1),reverse=True)
# 返回次数最多的类别
return sortedClassCount[0][0]