一、准备:使用Python导入数据
1.首先,创建名为KN.py的Python模块,在文件中编写一些基本的通用函数,导入两个模块:一个是科学计算包Numpy,一个是运算符模块。代码如下:
from numpy import *
import operator
from os import listdir
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
2.为方便使用createDataSet()函数,执行以下步骤:保存kNN.py文件,改变当前路径到存储kNN.py文件的位置,打开python环境。(这是书上原话,其实我没看懂这是什么意思,我只能乱来了…经过检验,真实可靠)
3.在vscode里创建一个kNN.py文件并导入模块;然后找到存储kNN.py文件的位置并复制kNN.py文件;再找到安装Anaconda的文件夹找到Python应用程序,将kNN.py文件粘贴至与python应用程序同一个文件目录下。如图:
4.Win + R在运行框输入cmd进入命令行,输入python进入python交互式开发环境;之后输入import kNN导入已编辑好的程序模块;为确保输入相同的数据集,kNN模块中定义了函数createDataSet,在python命令提示符下输入:group,labels = kNN.createDataSet();此命令创建了变量group和labels,然后在python命令提示符下输入变量的名字检验是否正确定义变量;如图:
5.这里有四组数据,每组数据有两个已知属性或特征值,上面的group矩阵每行包含一个不同的数据,可以把它想象为某个日志文件中不同的测量点或者入口,向量labels包含了每个数据点的标签信息,labels包含的元素个数等于group矩阵行数。这里把数据点(1,1.1)定义为类A,数据点(0,0.1)定义为类B。
二、从文本文件中解析数据
1.在kNN.py文件中添加以下代码,添加后需要重新启动python交互式开发环境,否则可能出错;
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
sortedDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
2.classify0()函数有4个输入参数:用于分类的输入向量是inX,输入的训练样本集为dataSet,标签向量为labels,最后的参数k表示用于选择最近邻居的数目,其中标签向量的元素数目和矩阵dataSet的行数相同。程序使用欧氏距离公式计算两个向量点xA和xB之间的距离,计算完所有点之间的距离之后可以对数据按照从小到大的次序排序;然后确定前k个距离最小的元素所在的主要分类,输入k总是整数;最后将classCount字典分解为元组列表,然后使用程序第二行导入运算符模块的itemgetter方法,按照第二个元素的次序对元组进行排序(从大到小排序),最后返回发生频率最高的元素标签。
3.为了预测数据所在分类,在python提示符中输入命令:kNN.classify0([0,0],group,labels,3);然后。。。。。出错了。。。
4.问了一下度娘,原来是现在的python版本已经没有iteritems属性了,要换成
items,没办法,换了之后还得重新进入python环境;
5.重新进入python后再一步一步执行,最后输入命令:kNN.classify0([0,0],group,labels,3);输出结果应该是B,也可以输入其他值,测试程序运行的结果。



