一、概述
1. 原理:
- 工作机制:给定测试样本,基于某种距离度量找出训练集中的与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测.
- 通常k是不大于20的整数
2. 优缺点
- 优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高,占用存储空间。无法给出数据的内在含义
适用数据范围:数值型和标称型
3. 懒惰算法:
二、算法流程
- 收集数据
- 准备数据
- 分析数据
- 训练算法(不适合KNN算法,因为K是“懒惰算法”的著名代表)
- 测试算法
- 使用算法
三、算法框架
1. classify0()函数的4个输入参数:
- inX:用于分类的输入向量
- dataSet:用于输入的训练样本集
- labels:标签向量
- k:参数k用于选择最佳邻居的数目
4. 数据的归一化
- 由于每个属性的取值数量级相差过大,会造成每个属性的权重不同,这显然是海伦不希望的。所以我们还要写一个函数实现数据归一化,公式如下:
- newValue=(oldValue-min)/(max-min)
- 这个公式可以将特征值转化为0~1之间的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14#归一化特征值
def autoNorm(dataSet):
#每列的最小值
minVals=dataSet.min(0)
#每列的最大值
maxVals=dataSet.max(0)
#最大值与最小值的差值
ranges=maxVals-minVals
normDataSet=zeros(shape(dataSet))
m=dataSet.shape[0]
#minVals是1*3的矩阵,使用tile函数复制成和dataSet同样大小的矩阵,方便计算
normDataSet=dataSet-tile(minVals,(m,1))
normDataSet=normDataSet/tile(ranges,(m,1))
return normDataSet,ranges,minVals
1 | >reload(kNN) |
5. 原始分类器
1 | #原始测试分类器 |
6. 接口
1 | # 约会网站预测函数 |
7. 识别手写数字
1 |
|
1 | def handwritingClassTest(): |