基于KNN的手写数字识别

1.KNN原理

机器学习的原理

是通过大量的数据,训练出一个能处理此类数据的模型。使得这个模型可以根据已知的数据,准确率很高的判断出未知的数据,从而使得人类能够采取正确的方法去处理某些事情。

传统机器学习算法主要包括以下五类:

回归:建立一个回归方程来预测目标值,用于连续型分布预测
分类:给定大量带标签的数据,计算出未知标签样本的标签取值
聚类:将不带标签的数据根据距离聚集成不同的簇,每一簇数据有共同的特征
关联分析:计算出数据之间的频繁项集合
降维:原高维空间中的数据点映射到低维度的空间中
基于KNN的手写数字识别_第1张图片

  1. 线性回归:找到一条直线预测目标值
  2. 逻辑回归:找到一条直线来分类数据
  3. KNN:用距离度量最相近邻的分类标签
  4. NB:选着后验概率最大的类为分类标签
  5. 决策树:构造一科熵值下降最快的分类树
    决策树是一种树型结构,其中每个内部结点表示在一个属性上的测试,每个分支代表一个测试输出,每个叶结点代表一种类别。采用的是自顶向下的递归方法,选择信息增益最大的特征作为当前的分裂特征。
  6. SVM:构造超平面,分类非线性数据
  7. k-means:计算质心,聚类无标签数据
  8. 关联分析: 在大规模数据集中寻找有趣的关系
  9. PCA降维:减少数据维度,降低数据复杂度

K-近邻算法(KNN)是通过测量不同特征值之间的距离进行分类。它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?
基于KNN的手写数字识别_第2张图片
如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:
在这里插入图片描述
同时,KNN通过依据k个对象中占优的类别进行决策,而不是单一的对象类别决策。这两点就是KNN算法的优势。

就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类。

1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

2.基于KNN的手写数字识别
基于KNN的手写数字识别_第3张图片
基于KNN的手写数字识别_第4张图片
基于KNN的手写数字识别_第5张图片
3.代码

import numpy as np
from PIL import Image
import random
from sklearn.neighbors import KNeighborsClassifier 

def img2vec(fname):
    '''将jpg等格式的图片转为向量'''
    im = Image.open(fname).convert('L')     #转为灰度图像
    tmp = np.array(im)                                #将灰度图像转化为数组
    vec = tmp.ravel()                               #将多维数组转换为一维数组
    return vec

def generate_data():     
    '''36张图片作为训练集'''
    X = []
    y = []
    name=[1,2,3,4,5,6]
    for i in range(1,len(name)):
        for j in range(1,7):
            y.append(name[i])
            X.append(img2vec('data'+'/'+str(name[i])+'-'+str(j)+'.jpg'))
    return X,y


x_test=[]
x_test.append(img2vec('data/myTest1.jpg'))           #将手写测试图像放入x_test列表

'''构建分类器'''
knn_classifier = KNeighborsClassifier(6)
X_train,y_label = generate_data()
knn_classifier.fit(X_train,y_label)                #训练模型
y_predict=knn_classifier.predict(x_test)     # 预测分类

print(y_predict)

结果:

在这里插入图片描述

预测出,myTest1.jpg为数字3

数据和代码:百度网盘
提取码:tian
–来自百度网盘超级会员V7的分享

如果这篇文章帮助到你了,那就点个赞,给个关注吧!

你可能感兴趣的:(TensorFlow,机器学习,KNN,K近邻,手写数字识别)