本系列代码托管于:https://github.com/chintsan-code/machine-learning-tutorials

本篇使用的项目为:knnHandwrite

在本例中,为了简化问题,将手写字符图片转换为32*32的0、1矩阵。大约2000个训练样本和1000个左右测试样本,训练样本所在的文件夹是trainingDigits,测试样本所在的文件夹是testDigits

流程:
1. 将32×32的矩阵转换成1×1024的向量;

def img2vector(filename):
    returnVect = zeros((1, 1024)) # 创建一个1*1024的全零向量
    fr = open(filename)
    for i in range(32):
        lineStr = fr.readline()
        for j in range(32):
            returnVect[0, 32 * i + j] = int(lineStr[j]) # 将32x32的矩阵转换成1x1024的向量
    return returnVect

2. 计算输入的测试数据向量和所有的训练集向量的欧几里得距离;

classfierResult = knn.classify0(vectorUnderTest, trainingMat, hwLabels, 3) # vectorUnderTest是一个测试字符向量(1*1024),trainingMat是训练样本集(m * 1024,m为训练样本总数),hwLabels是训练样本标签,k取3

3. 按照欧几里得距离排序,选前K近的,选择出现次数最多的数字作为分类结果;

4. 计算错误数和错误率。

总结:
KNN算法的优点在于简单、易于理解,对异常值不敏感,不需要参数估计,也不需要预先训练;缺点是计算量大,需要遍历所有训练集,且训练数据必须存储在本地,内存开销大