1.k-近邻工作原理
简单地说,K近邻算法采用测量不同特征值之间的距离方法进行分类。该算法具有一下特点。
- 优点:精度高、对异常值不敏感、无数据输入假定。
- 缺点:计算复杂度高、空间复杂度高。
K近邻算法的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前 𝑘 个最相似的数据,这就是K近邻算法中 𝑘 的出处,通常 𝑘 是不大于20的整数。最后,选择 𝑘 个最相似数据中出现次数最多的分类,作为新数据的分类。
K近邻算法的一般流程
- 1.收集数据:可以使用任何方法。
- 2.准备数据:距离计算所需要的数值,最好是结构化的数据格式。
- 3.分析数据:可以使用任何方法。
- 4.训练算法:此步骤不只适用于K近邻算法。
- 5.测试算法:计算错误率。
- 6.使用算法:首先需要输入样本数据和结构化的输出结果,然后运行K近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
2.准备数据集
下载数据集:手写数字数据集

可以看到该数据集已经切分好了训练集和测试集。其目录结构如下:
digits 目录下有两个文件夹,分别是:
- trainingDigits:训练数据,1934个文件,每个数字大约200个文件。
- testDigits:测试数据,946个文件,每个数字大约100个文件。
打开jupyter,查看一下样本格式。
# 查看一下文件内容
!cat ./data/digits/trainingDigits/0_1.txt # 前面需要加上!,否则会报错

我们需要把一个32x32的二进制图像矩阵转换为1x1024的向量。
import numpy as np
def img2vector(filename):
# 创建向量
returnVect = np.zeros((1, 1024))
# 打开数据文件,读取每行内容
fr = open(filename)
for i in range(32):
# 读取每一行
lineStr = fr.readline()
# 将每行前 32 字符转成 int 存入向量
for j in range(32):
returnVect[0, 32*i+j] = int(lineStr[j])
return returnVect
接着测试一下该方法。
# 测试一下
vect = img2vector('./data/digits/trainingDigits/0_1.txt')
print(vect.shape)
print(vect)

3.计算距离
算法实现过程:
- 1.计算已知类别数据集中的点与当前点之间的距离;
- 2.按照距离递增次序排序;
- 3.选取与当前点距离最小的k个点;
- 4.确定前k个点所在类别的出现频率;
- 5.返回前k个点出现频率最高的类别作为当前点的预测分类。
本次k-近邻使用欧式距离作为计算公式。
import operator
#分类器采用欧式距离
def classify0(inX, dataSet, labels, k):
"""
参数:
- inX: 用于分类的输入向量
- dataSet: 输入的训练样本集
- labels: 样本数据的类标签向量
- k: 用于选择最近邻居的数目
"""
# 获取样本数据数量
dataSetSize = dataSet.shape

最低0.47元/天 解锁文章
2012

被折叠的 条评论
为什么被折叠?



