按照机器学习实战这本书学习的,本人小白。
之前没有接触过python,所以会穿插自己对于python语法的学习。
所用ide为Pycharm社区版,win,python3.6
如书:首先在KNN.py中增加如下代码
from numpy import*
import operator
def creatDataSet():
group =array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1],[0,0.1]])
labels=['A','A','B','B']
return group,labels
保存好脚本文件就在python控制台输入
import KNN
bug1:报错没有numpy库。解决办法是File->Settings->Project Inerpreter->+然后输入numpy,Install Package
(PS:这里一定要保证网络通畅,我智障地没连网然后一直和我提示pip not installed。。。然后我一直在看我pip是不是有问题。。。
接着跟着书做就没问题了
bug2:line4 少外面那个中括号。(好多别的也有讲的,囧
保存了修改正确的脚本依然报错。解决办法是退出整个ide然后重新import KNN 等等命令就对了。
继续如书往KNN.py里面堆代码
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet
sqDiffMat =diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortedDisIndicies=distances.argsort()
classCount={}
for i in range(k):
voteIlabel=labels[sortedDisIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
bug3:'dict' object has no attribute 'iteritems'解决办法,是由于python的版本导致的,在python3.5以后这里面iteritems改成items即可
由于对python不熟,
笔记1:shape()
https://blog.csdn.net/Mr_Cat123/article/details/78841747?utm_source=blogxgwz0
这里shape[0]意味着只读第一维的数目,比如这里如果是要读刚group的第一维度数目就应该是4。
笔记2:tile()
这里做一点笔记: https://blog.csdn.net/Alis_xt/article/details/53117965
和http://blog.sina.com.cn/s/blog_6bd0612b0101cr3u.html
比较形象的是这个帖子:https://www.jianshu.com/p/9519f1984c70
参考楼上这些前辈的帖子,这里tile(inX,(dataSetSize,1))是将inX这个矩阵在纵向复制dataSetSize个,
笔记3: diffMat=tile(inX,(dataSetSize,1))-dataSet这一句表示将输入向量inX按照训练样本集的第一维度扩展成与dataSet完全维度一样,然后求平方
https://blog.csdn.net/dake13/article/details/80917932
笔记4:sum(),没有参数时,所有全加;axis=0,按列加;axis=1,按行加
笔记5:argsort()返回的是数组从小到大的索引值
笔记6:python中的字典
https://www.cnblogs.com/scios/p/8108243.html
笔记7:get()
get()返回指定键的值,如果值不在字典中返回默认值。dict.get(key,default)
https://blog.csdn.net/weixin_38705903/article/details/79231551
笔记8:sorted()
sorted(iterable[, cmp[, key[, reverse]]])
iterable -- 可迭代对象。
cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回是排序后的列表。
这里补充一点由于原书中是python2,用的是iteritems(),在python3中需要将其改成items()否则会报错。