mirror of
https://github.com/apachecn/ailearning.git
synced 2026-05-10 00:02:09 +08:00
更新 2.k-近邻算法 的项目文档
This commit is contained in:
@@ -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()
|
||||
|
||||

|
||||
|
||||
> 准备数据: 归一化数据
|
||||
* 归一化数据 (归一化是一个让权重变为统一的过程,更多细节请参考: 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 个测试数据。
|
||||
|
||||

|
||||
|
||||
> 准备数据: 编写函数 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)
|
||||
|
||||
@@ -242,6 +242,6 @@ def handwritingClassTest():
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test1()
|
||||
# test1()
|
||||
# datingClassTest()
|
||||
# handwritingClassTest()
|
||||
handwritingClassTest()
|
||||
|
||||
Reference in New Issue
Block a user