• 基于opencv-KNN最邻近算法实现手写数字识别，使用Qt做UI实现手写板，可以实时测试，资源包含源代码和可执行程序（release文件夹下的exe文件可以直接运行）
• 使用kNN算法对0-9的手写数据集进行识别，包括python代码和数据，数据为txt格式。
• 伯克利人工智能先导课cs188作业，朴素贝叶斯模型和KNN算法实现手写数字识别，准确率都达到很高水平，有说明文件，有训练结果绘图，适合新手入门
• KNN算法使用MNIST数据集、0-1二值图集、自写的数字图片集，做手写数字识别的代码，文件夹分类明确。
• # 利用sklearn KNN实现手写数字识别 import numpy as np import pandas as pd from PIL import Image import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from sklearn....
# 利用sklearn KNN实现手写数字识别

import numpy as np

import pandas as pd

from PIL import Image

import matplotlib.pyplot as plt

from sklearn.preprocessing import MinMaxScaler

from sklearn.neighbors import KNeighborsClassifier

from sklearn.model_selection import train_test_split,GridSearchCV

def imgTovector(filename):

img_data=np.array(img)

#    Minmax=MinMaxScaler()

#    img_union=Minmax.fit_transform(img_data)

img_vector=img_data.reshape(1,-1)

return img_vector

from os import listdir

def collectFiledataset():

img_labels = list()

# 样本数据文件列表

FileList = listdir('knn_num_data')

f = len(FileList)

# 设置初始矩阵

c = 28 * 28

dataSet = np.zeros((5000, c))

for i in range(f):

path = 'knn_num_data/' + FileList[i]

trainingFilelist = listdir(path)

t = len(trainingFilelist)

for j in range(t):

fileNameStr = trainingFilelist[j]

fileStr = fileNameStr.split('.')[0]

classNum = int(fileStr.split('_')[0])

img_labels.append(classNum)

filename = './knn_num_data/' + FileList[i] + '/' + fileNameStr

img_vector = imgTovector(filename)

# 将样本数据存入矩阵

ins = i * (t - 1) + j

dataSet[ins, :] = img_vector[0]

dataSet = pd.DataFrame(dataSet)

dataSet['img_labels'] = img_labels

return dataSet

dataSet=collectFiledataset()

df=pd.DataFrame(dataSet)

df_r=df.iloc[:,:-1].std(axis=1) !=0

df_c=df.iloc[:,:-1].std(axis=0) !=0

l=df.img_labels

labels=l.loc[df_r.values]

img_df=df.loc[df_r.values,df_c.values]

img_ = img_df.loc[:,img_df.std()!=0]

#归一化

MM=MinMaxScaler()

img_union=MM.fit_transform(img_)

img_union.shape

X_train,X_test,y_train,y_test=train_test_split(feature,labels,test_size=.3)

kd_tree=KNeighborsClassifier(algorithm='kd_tree',n_neighbors=12,p=2,n_jobs=2)

# param_grid = dict(n_neighbors=np.arange(5,100))

# gc = GridSearchCV(kd_tree,param_grid,cv=4,n_jobs=2).fit(feature,labels)

kd_tree.fit(X_train,y_train)

kd_tree.score(X_train,y_train),kd_tree.score(X_test,y_test)


展开全文
• 机器学习入门KNN算法实现手写数字识别 基本上照搬了http://lib.csdn.net/article/opencv/30167的代码，只是改了一点bug和增加了一点功能 输入就是直接在一个512*512大小的白色画布上画黑线，然后转化为01矩阵，用...
• 通过最近邻域法（KNN实现手写数字识别，并且计算识别的准确率
• 图像识别：利用KNN实现手写数字识别（mnist数据集） 步骤： 1、数据的加载（trainSize和testSize不要设置的太大） 2、k值的设定（不宜过大） 3、KNN的核心：距离的计算 4、k个最近的图片-->根据下标寻找...
图像识别：利用KNN实现手写数字识别（mnist数据集）

步骤：
1、数据的加载（trainSize和testSize不要设置的太大）
2、k值的设定（不宜过大）
3、KNN的核心：距离的计算
4、k个最近的图片-->根据下标寻找对应的标签
5、根据标签转化成相应的数字
6、检测概率统计

在我看来，KNN算法最大的优点是简单，准确率较高；
最大的缺点是：当数据量较大时，计算量成倍增长，测试集与训练集之间的任意两个元素之间都要计算距离。
注意1：trainSize和testSize不要设置的太大，如果过大，数据处理中产生更加庞大的数据，内存溢出，导致程序崩溃。
注意2：k值的设定太大会提高计算机的计算量，而且会一定程度上降低准确率。
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('D:/MNIST_data', one_hot=True)
trainNum = 55000
testNum = 10000
trainSize = 500
testSize = 5
k = 4

# data 分解
trainIndex = np.random.choice(trainNum, trainSize, replace=False)
testIndex = np.random.choice(testNum, testSize, replace=False)
trainData = mnist.train.images[trainIndex]  # 训练图片
trainLabel = mnist.train.labels[trainIndex]  # 训练标签
testData = mnist.test.images[testIndex]  # 测试图片
testLabel = mnist.test.labels[testIndex]  # 测试标签

# 利用placeholder来完成数据的加载
trainDataInput = tf.placeholder(shape=[None, 784], dtype=tf.float32)
trainLabelInput = tf.placeholder(shape=[None, 10], dtype=tf.float32)
testDataInput = tf.placeholder(shape=[None, 784], dtype=tf.float32)
testLabelInput = tf.placeholder(shape=[None, 10], dtype=tf.float32)

# KNN的距离
f1 = tf.expand_dims(testDataInput, 1)  # 维度扩展
f2 = tf.subtract(trainDataInput, f1)  # 二者之差
f3 = tf.reduce_sum(tf.abs(f2), reduction_indices=2)
f4 = tf.negative(f3)  # 取反
f5, f6 = tf.nn.top_k(f4, k=k)  # 最大的四个值 f5表示的是数据 f6表示的该数据所处的下标
f7 = tf.gather(trainLabelInput, f6)  # 根据f6下标去寻找trainLabelInput中对应的标签
f8 = tf.reduce_sum(f7, reduction_indices=1)
f9 = tf.argmax(f8, dimension=1)

with tf.Session() as sess:
p9 = sess.run(f9, feed_dict={trainDataInput: trainData, testDataInput: testData, trainLabelInput: trainLabel})
p10 = np.argmax(testLabel, axis=1)
print('预测值:', p9)
print('真实值:', p10)

j = 0
for i in range(0, testSize):
if p10[i] == p9[i]:
j += 1
print('accuracy:', j*100/testSize)

作死设置了一回，电脑是游戏本，屏幕出现卡顿，加速球爆满，还好运行出来了

设置的过高，直接报错，资源耗尽。

训练集数量和K值该如何确定

从上图可以看出，trainSize不是设置的越高越好，在满足较高准确率的同时，又不能使计算量过于庞大，需要把握训练数据集的大小。

从上图可以看出，K值的设置过大反而会在一定程度上降低预测的准确率 ，所以设置k值时，需要对数据集有一定的了解，并且在一定的范围内取值。
展开全文
• KNN实现手写数字识别，包含图片数据，已经实现图片数据与文本数据的转换
• 本文章总结了KNN算法字手写数字识别的应用，比较系统的对传统KNN和各种改进的KNN算法进行实现，由于完整的代码量较大（部分代码参考了机器学习实战），不适合全部贴出，但是博主乐于分享，有需要的话可以直接联系我...
本文章总结了KNN算法字手写数字识别的应用，比较系统的对传统KNN和各种改进的KNN算法进行实现，由于完整的代码量较大（部分代码参考了机器学习实战），不适合全部贴出，但是博主乐于分享，有需要的话可以直接联系我，我会很乐意共享的，一希望大家能帮我校准文章的错误啦~~~

KNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别，则该样本也属于这个类别，并具有这个类别上样本的特性。算法步骤如下：
输入：训练数据集T={(x1,y1),(x2,y2),…,（xn,yn）}
输出：实例x所属的类y
(1)根据给定距离度量，在训练集T中找出与x最近邻的k个点，涵盖这k个点的x的领域记作Nk(x)
(2)在Nk(x)中根据分类决策规则（多数表决）决定x的类别y

4.12 核心代码
首先构造一个分类起，该分类器接收训练数据集合待测实例，返回待测实例的分类。

然后从分别从数据文本中获取训练数据集和测试数据集，并调用classifyEU方法，输出结果

结果如下：

二、改进距离
欧氏距离虽然很有用，但也有明显的缺点。它将样品的不同属性（即各指标或各变量）之间的差别等同看待，这一点有时不能满足实际要求。例如，在教育研究中，经常遇到对人的分析和判别，个体的不同属性对于区分个体有着不同的重要性。因此，有时需要采用不同的距离函数。这里采用马氏距离。
结果如下：

出乎意料，使用马氏距离后，分类器的效果奇差，错误率达到56%,这显然是不能令人满意的。可能原因是由于马氏距离是把各个特征维度的相关性考虑进去，但是手写数字系统各个维度并没有很大的相关性，并且由于各个维度的取值都只是0和1两种，因此效果非常差，这也说明各个距离都有自己的适用场合，我们需要根据数据的实际意义和特征，选取恰当的距离度量，才能去得良好地效果。

三、SAHIBSINGH A. DUDANI 等在The Distance-Weighted k-Nearest-Neighbor Rule 中提出一种改进权重的KNN方        法，这里用Python实现看看效果是不是真有那么好，哈哈。
论文大家可以自己下载：核心思想是距离测试点更近的点应该赋予更大的权值，二距离远的点应该赋予更小的权值。权值公式为

核心代码：

运行结果：

可以看到WKNN算法的错误个数是10，错误率约1.06%，准确率约98.94%，所用时间约49.408秒，准确率相对KNN有所提高，SAHIBSINGH A. DUDANI诚不欺我也~~~

另外P. Viswanath and T. Hitendra Sarma等在An Improvement to k-Nearest Neighbor Classifier中提出另一种改进KNN方法，经博主实验证明改算法在手写数字识别数据集的准确率可以达到99%+，几乎可以赶上神经网络的正确率了，看来经过捣鼓捣鼓得KNN果然是良心算法呀，简单实用，哈哈。但是该改进算法运算量相对比较大，因为需要对每一个类求K个近邻。

四、kd-Tree
实现k近邻法时，主要考虑的问题是如何对训练数据进行快速k近邻搜索，这点在特征空间的维数大以及训练数据容量大时尤其重要。为了提高k近邻搜索的效率，考虑使用特殊的结构存储训练数据，以减少计算距离的次数。通过构造kd_Tree来实现。

Kd-Tree是一个二叉树，每个节点表示的是一个空间范围。下表表示的是Kd-树中每个节点中主要包含的数据结构。Range域表示的是节点包含的空间范围。Node-data域就是数据集中的某一个n维数据点。分割超面是通过数据点Node-Data并垂直于轴split的平面，分割超面将整个空间分割成两个子空间。令split域的值为i，如果空间Range中某个数据点的第i维数据小于Node-Data[i]，那么，它就属于该节点空间的左子空间，否则就属于右子空间。Left，Right域分别表示由左子空间和右子空间空的数据点构成的Kd-Tree。
核心代码：
首先创建一个树节点

运行结果：

看到这个结果博主心里是蓝瘦香菇的，这哪里改进了运行效率嘛，运行时间分明比不用KD-Tree还长很多，不过博主还是耐心的分析了原因，果然还是有所发现，在运行效率方面，根据经验，kd-Tree只在:特征维数远小于样本数的情况下才是比较平衡的，而该训练数据集特征维数为1024和训练样本数接近，并且每一个维度都只有0和1两个值，因此构造出来的是一个极度不平衡的树，当树完全不平衡的时候其效率和逐个遍历没有什么区别，因此并没有使运行时间效率提升，反而因为需要构造kd-Tree、比较等操作使得运行效率相对较低，由此得到的教训是并不是一个好的算法思路就能拿来用呀，关键还得看场景！场景！场景！


展开全文
• kNN实现手写数字识别系统-数据加代码


文章目录
前言一、数据二、步骤1.引入库2.图片向量化2.重中之重
总结

前言
上一节对kNN算法进行了讲解以及代码演示，相必大家对kNN算法已经有了很深入的理解，下面通过手写识别系统实例来测试一下自己学的怎么样吧~

一、数据
数据链接放在百度云盘上，想学习的同学可以下载（永久有效） 链接：https://pan.baidu.com/s/1i5627_TYrmS5KWUQt3sNBw 提取码：w5mr
二、步骤
1.引入库

from numpy import *
import operator
from os import listdir
import numpy as np


2.图片向量化

#图片向量化，对每个32*32的数字向量化为1*1024
def img2vector(filename):
returnVect = zeros((1,1024))#numpy矩阵，1*1024
fr = open(filename)#使用open函数打开一个文本文件
for i in range(32):#循环读取文件内容
for j in range(32):
returnVect[0,32*i+j] = int(lineStr[j])#循环放入1*1024矩阵中
return returnVect

测试代码如下
#>>> import KNN
#>>> testVector = KNN.img2vector('testDigits/0_13.txt')
#>>> testVector[0,0:31]
#>>> testVector[0,32:63]

自行测试~

2.重中之重
def handwritingClassTest():
hwLabels = []#定义一个list，用于记录分类
trainingFileList = listdir('trainingDigits')#获取训练数据集的目录
#os.listdir可以列出dir里面的所有文件和目录，但不包括子目录中的内容
#os.walk可以遍历下面的所有目录，包括子目录
m = len(trainingFileList)#求出文件的长度
trainingMat = zeros((m,1024))#训练矩阵，生成m*1024的array，每个文件分配1024个0
for i in range(m):#循环，对每个file
fileNameStr = trainingFileList[i]#当前文件
#9_45.txt，9代表分类，45表示第45个
fileStr = fileNameStr.split('.')[0]#首先去掉txt
classNumStr = int(fileStr.split('_')[0])#然后去掉_，得到分类
hwLabels.append(classNumStr)#把分类添加到标签上
trainingMat[i,:] = img2vector('trainingDigits/%s'%fileNameStr)#进行向量化
testFileList = listdir('testDigits')#处理测试文件
errorCount = 0.0#计算误差个数
mTest = len(testFileList)#取得测试文件个数

for k in range(1,20):#遍历不同k对错误率的影响
errorCount = 0.0
for i in range(mTest):#遍历测试文件
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('trainingDigits/%s'%fileNameStr)
#注意下面用到的classify0即是在上一节讲解kNN的时候所写的方法，学习的时候记得放进来
classifierResult = classify0(vectorUnderTest,trainingMat,hwLabels,k)
#print('the classifier came back with:%d,the real answer is:%d'%(classifierResult,classNumStr))
if(classifierResult != classNumStr):errorCount+=1.0
print('\nthe total number of errors is:%d'%errorCount)
print('\nthe total rate is:%f'%(errorCount/float(mTest)))
print('k is {} and the correct rate is{}%'.format(k,(mTest-errorCount)*100/mTest))


测试代码如下
#测试
#>>> import KNN
#>>> KNN.handwritingClassTest()

自行测试~
总结
这一节通过手写数字识别系统的练习，可以看出k-近邻算法虽然是分类数据最简单最有效的算法，但是如果数据集很大时，实际非常耗时，而且模型不需要训练，也就是说我们不知道实例到底具有什么特征，无法知道数据的基础结构信息。 欢迎交流~
展开全文
• 基于KNN实现手写数字识别C++代码，输出结果有混淆矩阵、召回率、训练准确率、预测数据输出等。
• 需要下载MNIST数据集，将路径修改为本地MNIST数据集的地址。需要OpenCV与Tensorflow环境
• ↑ 点击上方【计算机视觉联盟】关注我们本节使用KNN算法实现手写数字识别KNN算法基本原理前边文章已经详细叙述，盟友们可以参考哦！数据集介绍有两个文件：（1）trainingDigit...
• 基于KNN数字识别 源代码及数据的github地址： https://github.com/w1449550206/KNN-Handwritten-digit-recognition-based-on-KNN 点此可直达 import numpy as np # 图片后缀为bmp import matplotlib.pyplot as plt...
• 电脑通过串口传给单片机，单片机用KNN算法给出手写数字的预测结果，并且在液晶上显示
• 所谓KNN就是对那个你要预测的点，找出其k个邻居，也就是距离他最近的k个点，这k个样本中出现频率最高的类别即作为测试样本的类别。 那么，这个距离一般用什么来计算呢？ 一般有欧式距离、标准化欧式距离、马氏距离、...
• ## KNN算法实现手写数字识别

万次阅读 多人点赞 2019-03-24 01:58:35
KNN 最邻近分类算法： （近邻取样） 邻近算法，或者说K最近邻(kNN，k-NearestNeighbor)分类算法是机器学习分类技术中最简单的方法之一。 所谓K最近邻，就是k个最近的邻居的意思，说的是每个样本都可以用它最接近的k...
• 数据和程序下载地址：手写数字识别 调用SVM库实现数字识别# Standard scientific Python imports import matplotlib.pyplot as plt import numpy as np # Import datasets, classifiers and performance metrics ...
• 在前面已经学习过怎么让kNN训练识别数字，并且进行了测试，如果你想不起的话，可以参考下文： 《在OpenCV里用kNN实现MNIST》 https://blog.csdn.net/caimouse/article/details/104227344 有很多人问我，怎么样...

...