KNN (K近邻算法) - 识别手写数字

KNN项目实战——手写数字识别

1、 介绍

k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

2、数据集介绍

32X32 文本格式数据.

3、代码实现

3.1、导包

import numpy as np
import pandas as pd
import matplotlib.pylab as plt
%matplotlib inline
import os

3.2、读取训练数据

# 获取数据文件
fileList = os.listdir(‘./data/trainingDigits/‘)

# 定义数据标签列表
trainingIndex = []
# 添加数据标签
for filename in fileList:
    trainingIndex.append(int(filename.split(‘_‘)[0]))

# 定义矩阵数据格式
trainingData = np.zeros((len(trainingIndex),1024))
trainingData.shape#(3868, 1024)
# 获取矩阵数据
index = 0
for filename in fileList:
    with open(‘./data/trainingDigits/%s‘%filename, ‘rb‘) as f:

        # 定义一个空矩阵
        vect = np.zeros((1,1024))

        # 循环32行
        for i in range(32):
            # 读取每一行数据
            line = f.readline()

            # 遍历每行数据索引  line[j] 即为数据
            for j in range(32):
                vect[0,32*i+j] = int(line[j])

        trainingData[index,:] = vect
        index+=1

3.3、读取测试数据

fileList2 = os.listdir(‘./data/testDigits/‘)

# 定义数据标签列表
testIndex = []
# 获取数据标签
for filename2 in fileList2:
    testIndex.append(int(filename2.split(‘_‘)[0]))

#读取测试数据 

# 定义矩阵数据格式
testData = np.zeros((len(testIndex),1024))
testData.shape
#(946, 1024)

# 获取矩阵数据
index = 0
for filename2 in fileList2:
    with open(‘./data/testDigits/%s‘%filename2, ‘rb‘) as f:

        # 定义一个空矩阵
        vect = np.zeros((1,1024))

        # 循环32行
        for i in range(32):
            # 读取每一行数据
            line = f.readline()

            # 遍历每行数据索引  line[j] 即为数据
            for j in range(32):
                vect[0,32*i+j] = int(line[j])

        testData[index,:] = vect
        index+=1

3.5、数据建模

from sklearn.neighbors import KNeighborsClassifier

# 定义 k 为5个, 即 寻找最近的3个邻居
knn = KNeighborsClassifier(n_neighbors=3)

# 训练数据
knn.fit(trainingData,trainingIndex)

3.6、分析数据

%%time
# 预测数据 

predict_data = knn.predict(testData)

# Wall time: 7.8 s

res = 0
for i in range(len(testIndex)):
    if testIndex[i] == predict_data[i]:
        res+=1

print("识别正确率: "+‘%0.3f‘%(res/len(testIndex)*100)+"%")
# 识别正确率: 98.626%

原文地址:https://www.cnblogs.com/blogscc/p/11518697.html

时间: 2024-11-05 13:48:23

KNN (K近邻算法) - 识别手写数字的相关文章

K 近邻算法识别手写数字(Numpy写法)

在 Kaggle 上面的 Notebook 给可爱的学弟学妹们用于参考... 代码这个东西一定要自己多写,我一边听着林宥嘉的<想自由>,一边写出了大致的实现. 关于数据集的读入 MNIST 数据集可以在这里获取:THE MNIST DATABASE of handwritten digits . 你一定很好奇?为什么 原文地址:https://www.cnblogs.com/accepteddoge/p/mnist-knn-with-numpy.html

机器学习实战笔记-K近邻算法3(手写识别系统)

1 准备数据:将图像转换为测试向量 这次数据集还是有两种,训练数据集和测试数据集,分别有2000个,900个. 我们将把一个32*32的二进制图像矩阵转换为1 x 1024的向量,这样前两节使用的分类器就可以处理数字图像信息了. 代码: def img2vector(filename): returnVect = zeros((1,1024)) file = open(filename) for i in range(32): line = file.readline() for j in ra

基于python Knn 算法识别手写数字,计算准确率 ——第二弹

大家好~ 可爱的我又来了~ 今天我会分享一个简单的Knn算法实例,是小白的必备实例! 开始喽~ 首先我是用Jupyter新建的一个python文件 并且在相同文件夹中放了一个‘data’的图片文件夹里面从0-9个有5000张图片. 接下来是代码部分: 这是需要引用的部分数据包 建立X,y两个集合 digit =  cv2.imread('./data/%d/%d_%d.bmp'%(i,i,j)) #读取图片的位置 下面代码是转换数据类型 下面是输出结果 就这些啦!虽然还点粗糙但是我会努力哒~ 原

Python 学习笔记(Machine Learning In Action)K-近邻算法识别手写数字

1 from numpy import * 2 import matplotlib 3 from os import listdir 4 import kNN 5 def img2vector(filename): 6 returnVect = zeros((1,1024)) 7 fr = open(filename) 8 for i in range(32): 9 lineStr = fr.readline() 10 for j in range(32): 11 returnVect[0,32

python实现KNN,识别手写数字

写了识别手写数字的KNN算法,如下图所示.参考链接http://blog.csdn.net/april_newnew/article/details/44176059. # -*- coding: utf-8 -*- import numpy as np import pandas as pd import os def readtxt(filename): text=[] f = open(filename,'r',encoding='utf-8') for line in f.readlin

C#中调用Matlab人工神经网络算法实现手写数字识别

手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化  投影  矩阵  目标定位  Matlab 手写数字图像识别简介: 手写阿拉伯数字识别是图像内容识别中较为简单的一个应用领域,原因有被识别的模式数较少(只有0到9,10个阿拉伯数字).阿拉伯数字笔画少并且简单等.手写阿拉伯数字的识别采用的方法相对于人脸识别.汉字识别等应用领域来说可以采用更为灵活的方法,例如基于规则的方法.基于有限状态自动机的方法.基于统计的方法和基于神

BP神经网络识别手写数字项目解析及代码

这两天在学习人工神经网络,用传统神经网络结构做了一个识别手写数字的小项目作为练手.点滴收获与思考,想跟大家分享一下,欢迎指教,共同进步. 平常说的BP神经网络指传统的人工神经网络,相比于卷积神经网络(CNN)来说要简单些. 人工神经网络具有复杂模式和进行联想.推理记忆的功能, 它是解决某些传统方法所无法解决的问题的有力工具.目前, 它日益受到重视, 同时其他学科的发展, 为其提供了更大的机会.1986 年, Romelhart 和Mcclelland提出了误差反向传播算法(Error Back

用BP人工神经网络识别手写数字

http://wenku.baidu.com/link?url=HQ-5tZCXBQ3uwPZQECHkMCtursKIpglboBHq416N-q2WZupkNNH3Gv4vtEHyPULezDb50ZcKor41PEikwv5TfTqwrsQ4-9wmH06L7bYD04u 用BP人工神经网络识别手写数字 yzw20091201上传于2013-01-31|暂无评价|356人阅读|13次下载|暂无简介|举报文档 在手机打开 赖勇浩( http://laiyonghao.com ) 这是我读工

学习笔记TF024:TensorFlow实现Softmax Regression(回归)识别手写数字

TensorFlow实现Softmax Regression(回归)识别手写数字.MNIST(Mixed National Institute of Standards and Technology database),简单机器视觉数据集,28X28像素手写数字,只有灰度值信息,空白部分为0,笔迹根据颜色深浅取[0, 1], 784维,丢弃二维空间信息,目标分0~9共10类.数据加载,data.read_data_sets, 55000个样本,测试集10000样本,验证集5000样本.样本标注信