更新 2.k-近邻算法 的项目文档

This commit is contained in:
jiangzhonglian
2017-08-19 00:21:40 +08:00
parent f21ab992ec
commit f349ea20a0
2 changed files with 38 additions and 16 deletions

View File

@@ -92,9 +92,18 @@ knn 算法按照距离最近的三部电影的类型,决定未知电影的类
* 玩视频游戏所耗时间百分比
* 每周消费的冰淇淋公升数
文本文件数据格式如下:
```
40920 8.326976 0.953952 3
14488 7.153469 1.673904 2
26052 1.441871 0.805124 1
75136 13.147394 0.428964 1
38344 1.669788 0.134296 1
```
> 准备数据:使用 Python 解析文本文件
将文本记录转换为 NumPy 的解析程序
```Python
def file2matrix(filename):
"""
@@ -143,14 +152,25 @@ plt.show()
![Matplotlib 散点图](/images/2.KNN/knn_matplotlib_2.png)
> 准备数据: 归一化数据
* 归一化数据 (归一化是一个让权重变为统一的过程,更多细节请参考: https://www.zhihu.com/question/19951858
| 序号 | 玩视频游戏所耗时间百分比 | 每年获得的飞行常客里程数 | 每周消费的冰淇淋公升数 | 样本分类 |
| ------------- |:-------------:| -----:| -----:| -----:|
| 1 | 0.8 | 400 | 0.5 | 1 |
| 2 | 12 | 134 000 | 0.9 | 3 |
| 3 | 0 | 20 000 | 1.1 | 2 |
| 4 | 67 | 32 000 | 0.1 | 2 |
样本3和样本4的距离
$$\sqrt{(0-67)^2 + (20000-32000)^2 + (1.1-0.1)^2 }$$
归一化特征值,消除特征之间量级不同导致的影响
归一化特征值,消除属性之间量级不同导致的影响
```Python
def autoNorm(dataSet):
"""
Desc:
归一化特征值,消除属性之间量级不同导致的影响
归一化特征值,消除特征之间量级不同导致的影响
parameter:
dataSet: 数据集
return:
@@ -176,9 +196,12 @@ def autoNorm(dataSet):
> 训练算法:此步骤不适用于 k-近邻算法
> 测试算法:使用海伦提供的部分数据作为测试样本。测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误
因为测试数据每一次都要与全量的训练数据进行比较,所以这个过程是没有必要的
> 测试算法:使用海伦提供的部分数据作为测试样本。如果预测分类与实际类别不同,则标记为一个错误。
kNN 分类器针对约会网站的测试代码
```Python
def datingClassTest():
"""
@@ -213,6 +236,7 @@ def datingClassTest():
> 使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否为自己喜欢的类型。
约会网站预测函数
```Python
def clasdifyPerson():
resultList = ['not at all', 'in small doses', 'in large doses']
@@ -238,15 +262,11 @@ You will probably like this person: in small doses
[完整代码地址](https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py): <https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py>
#### 要点补充
归一化是一个让权重变为统一的过程,更多细节请参考: https://www.zhihu.com/question/19951858
### 项目案例2: 手写数字识别系统
#### 项目概述
构造一个能识别数字 0 到 9 的基于 KNN 分类器的手写识别系统。
构造一个能识别数字 0 到 9 的基于 KNN 分类器的手写数字识别系统。
需要识别的数字是存储在文本文件中的具有相同的色彩和大小:宽高是 32 像素 * 32 像素的黑白图像。
@@ -266,13 +286,13 @@ You will probably like this person: in small doses
> 收集数据: 提供文本文件
目录 trainingDigits 中包含了大约 2000 个例子,每个例子内容如下图所示,每个数字大约有 200 个样本;目录 testDigits 中包含了大约 900 个测试数据。
目录 [trainingDigits](https://github.com/apachecn/MachineLearning/tree/master/input/2.KNN/trainingDigits) 中包含了大约 2000 个例子,每个例子内容如下图所示,每个数字大约有 200 个样本;目录 [testDigits](https://github.com/apachecn/MachineLearning/tree/master/input/2.KNN/testDigits) 中包含了大约 900 个测试数据。
![手写数字数据集的例子](/images/2.KNN/knn_2_handWriting.png)
> 准备数据: 编写函数 img2vector(), 将图像格式转换为分类器使用的向量格式
> 准备数据: 编写函数 img2vector(), 将图像文本数据转换为分类器使用的向量
将图像转换为向量
将图像文本数据转换为向量
```Python
def img2vector(filename):
@@ -299,11 +319,13 @@ array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1
> 训练算法:此步骤不适用于 KNN
> 测试算法:编写函数使用提供的部分数据集作为测试样本,测试样本与非测试样本的区别在于测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误
因为测试数据每一次都要与全量的训练数据进行比较,所以这个过程是没有必要的。
> 测试算法:编写函数使用提供的部分数据集作为测试样本,如果预测分类与实际类别不同,则标记为一个错误
```Python
def handwritingClassTest():
# 1. 导入数据
# 1. 导入训练数据
hwLabels = []
trainingFileList = listdir('input/2.KNN/trainingDigits') # load the training set
m = len(trainingFileList)

View File

@@ -242,6 +242,6 @@ def handwritingClassTest():
if __name__ == '__main__':
test1()
# test1()
# datingClassTest()
# handwritingClassTest()
handwritingClassTest()