机器学习入门:K-近邻算法

, 1.67390400e+00], [ 2.60520000e+04, 1.44187100e+00, 8.05124000e-01], ..., [ 2.65750000e+04, 1.06501020e+01, 8.66627000e-01], [ 4.81110000e+04, 9.13452800e+00, 7.28045000e-01], [ 4.37570000e+04, 7.88260100e+00, 1.33244600e+00]])>>> vecTraceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'vec' is not defined>>> vector[3 ... 2]

现在我们已经从文文件中导入了数据,并将其格式化为想要的格式,接着我们需要了解数据的真是含义,我们可以直观的浏览文本文件,但是这种方法非常不友好,一般来说,我们会采用图形化的方式直观的展示数据。下面我们就用Python图形化工具来图形化展示数据内容,以便辨识出一些数据模式。

  • 分析数据,使用Matplotlib创建散点图
pip install matplotlib

接下来打开python命令行,我们对刚才读入的内容进行测试的展示

>>> from matplotlib import *>>> import matplotlib.pyplot as plt>>> import kNN>>> import numpy as np>>> mat, vec = kNN.file2matrix('datingTestSet2.txt')>>> fig = plt.figure()>>> ax = fig.add_subplot(111)>>> ax.scatter(mat[:, 1], mat[:, 2], 15.0*np.array(vec), 15.0*np.array(vec))<matplotlib.collections.PathCollection object at 0x1087cf0d0>>>> plt.show()

这个时候,我们展示的是数据集的第一列与第二列所绘制的图,这里我们很难看出来什么端倪,所以我们尝试使用第一列和第二列作为特征来绘图,重新书写上边代码:

ax.scatter(mat[:, 0], mat[:, 1], 15.0*np.array(vec), 15.0*np.array(vec))

然后我们得到了以下数据图:

这次,我们可以看到,图中清晰的标识了3个不同的样本分类区域。

  • 准备数据,归一化数值

我们随便的抽取了4组差异比较大的数据

 玩游戏所消耗时间里程数冰激凌公升数样本分类10.84000.51212134000.9330200001.12467320000.12

我们很容易发现,如果我们计算样本3和样本4之间的距离,可以使用下边的方法

$\sqrt{(0-67)^2 + (20000 + 32000)^2 + (1.1-0.1)^2}$

但是这些大的值堆结果的影响比较大,因此,作为比较重要的特征属性,不应该如此的影响计算结果,所以在处理数据的时候,我们对数据进行归一化处理,将取值的范围处理到0 - 1或者-1 ~ -1之间,下面的公事,可以将任意范围内的特征值转换为0-1区间内的值: