《机器学习实战》第二章KNN算法,Python实现过程中出现的问题及解决方案记录(1)
最终运行代码:
import operator
import numpy as np
import pandas as pd
import os
os.getcwd()
import KNN as knn
group,labels=knn.createDataSet()
knn.classify0([0,-3],group,labels,k=3)
1. 写一个kNN.py保存后,导入kNN。报错:no module named knn
Solution:设置好路径:
import os
os.getcwd() #将kNN.py放在当前显示的路径下
import KNN as knn
2. 输入命令:knn.createDataSet()。报错:name 'array' is not defined
Solution:kNN.py 需要修改为np.array
def createDataSet():
group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group, labels
3. 输入命令:knn.classify0([0,0],group,labels,k=3)。报错:name 'operator' is not defined
Solution:kNN.py 需要import operator
import numpy as np
import pandas as pd
import operator
kNN.py 的最终代码:
import numpy as np
import pandas as pd
import operator
def createDataSet():
group = np.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 分类的输入向量,[x, y]样式
dataset 训练样本集
labels 训练样本标签
k 用于选择最近邻的数目
"""
#计算距离
dataSetSize = dataSet.shape[0] #shape返回矩阵的[行数,列数],shape[0]=行数=样本数量
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet #将inX在dataSet第一维度方向进行同大小复制(输入的测试样本扩展为和dataset的shape一样),并作差(矩阵减法)
sqDiffMat = diffMat**2 #每个元素平方
sqDistances = sqDiffMat.sum(axis=1) #按行求和
distances = sqDistances**0.5 #开方
sortedDistIndicies = distances.argsort() #升序排序的索引值
classCount={} #建立一个dict,用来储存不同标签出现的次数
#选择距离最小的k个点
for i in range(k):
# index = sortedDistIndicies[i] #第i个最相近的样本下标
# voteIlabel = labels[index] #样本index对应的分类结果('A' or 'B')
voteIlabel = labels[sortedDistIndicies[i]]
# 依次查询cclassCount中是否有该key,有则将取出value再+1
# 没有则返回添加该key并置value为0,再+1
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #按照对象的第1域位置(voteIlabel)的值进行降序排序
return sortedClassCount[0][0] # 获得得票最高的标签
最终运行结果
>>> knn.classify0([0,-3],group,labels,k=3)
'B'