k-近邻算法怕是最简单的机器学习的分类算法了。简单的说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。
源码+实验数据地址:https://github.com/MoonTreee/machine_learning
- 其优点:精度高、对异常值不敏感、无数据输入假定;
- 缺点:计算复杂度高、空间复杂度高;and 需要大量的标注数据
- 适用数据范围:数值型和标称型。
本文基于k-近邻算法完成一个对字符的识别(本质是一个分类问题),为了简单起见,构造的系统只能识别阿拉伯数字0-9(相关的测试集和训练集数据见github)。源数据已经使用图像处理软件处理成32像素x32像素的黑白图像。为方便处理,以文本格式进行保存。
算法本身也不是很复杂,下面直接上代码。需要注意的地方已经在代码块中标注。
import numpy as np
from os import listdir
import operator
# 图像矩阵转换为二进制向量
# 本例中读取文本文件的前32行和前32列,即32x32的矩阵,转换为1x1024的向量
def img2vector(filename):
return_vector = np.zeros((1, 1024))
fr = open(filename)
for i in range(32):
line =