机器学习(二)-kNN手写数字识别
一、kNN算法
1、kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别。
2,距离可以是欧式距离,夹角余弦距离等等。
3,k值不能选择太大或太小,k值含义,是最后选取距离最近的前k个参照点的类标,统计次数最多的记为待测点类标。
4,欧式距离公式:

二、关于kNN实现手写数字识别
1,手写数字训练集测试集的数据格式,本篇文章说明的是《机器学习实战》书提供的文件,将所有数字已经转化成32*32灰度矩阵。
三、代码结构构成
1,data_Prepare.py :在这个文件放数据处理的函数,最终返回合适格式的数据集
2,kNN_Algorithm.py :在这个文件中存放kNN分类算法的核心函数,即执行决策的分类函数
3,testknn_Test.py :这个文件用于测试一波数据,计算函数的错误率
四、代码如下
1,data_Prepare.py
import numpy as np
def img2_vector(filename):
return_vect = np.zeros((1,1024))
fr = open(filename)
for i in range(32):
linestr = fr.readline()
for j in range(32):
return_vect[0,32*i+j] = int(linestr[j])
return return_vect
解释:可以看出返回一个1行1024列的向量,这是把一个图像的32*32展开表示成一行,为后面计算欧式距离做准备。
2,kNN_Algorithm.py
#导入kNN算法所需的两个模块,(1)numpy科学计算包(2)operator运算符模块
import numpy as np
import operator #定义k近邻算法函数classify0,[参数说明:inX待预测的对象,dataset训练数据,labels训练数据对应的标签,选取的前k相近]
def classidy0(inX,dataset,labels,k): #1,计算距离
dataset_size = dataset.shape[0]
diff_mat = np.tile(inX,(dataset_size,1))-dataset
sqdiff_mat = diff_mat**2
sq_distances = sqdiff_mat.sum(axis=1)
distances = sq_distances**0.5 #2,按递增排序
sorted_distances_index = distances.argsort() #3,选择距离最近的前k个点,并且计算它们类别的次数排序
class_count = {}
for i in range(k):
vote_label = labels[sorted_distances_index[i]]
class_count[vote_label] = class_count.get(vote_label,0) + 1
sorted_class_count = sorted(class_count.items(),key=operator.itemgetter(1),reverse=True) #4,返回前k个里面统计的最高次类别作为预测类别
return sorted_class_count[0][0]
解释:此函数是分类函数,四个参数,定义k近邻算法函数classify0,[参数说明:inX待预测的对象,dataset训练数据,labels训练数据对应的标签,选取的前k相近]。最后会返回分类的类别。
3,testknn_Test.py
from os import listdir #列出给定目录的文件名#
import kNN_Algorithm
import numpy as np
import data_Prepare
def class_test(): #获取训练集目录下的所有文件#
labels = []
train_file_list = listdir('trainingDigits')
m_train = len(train_file_list)
train_mat = np.zeros((m_train,1024))
for i in range(m_train):
file_str = train_file_list[i]
#filename1 = 'trainingDigits/'+file_str#
file_name = file_str.split('.')[0]
class_num = file_name.split('_')[0]
labels.append(class_num) #训练集所有文件对应的分类label#
train_mat[i,:]=data_Prepare.img2_vector('trainingDigits/%s' %file_str) #每个训练集特征# test_file_list = listdir('testDigits')
error_count = 0.0
m_test = len(test_file_list) for i in range(m_test):
file_str = test_file_list[i]
#filename2 = 'testDigits/'+file_str
file_name = file_str.split('.')[0]
class_num = file_name.split('_')[0]
vector_under_test = data_Prepare.img2_vector('testDigits/%s' %file_str)
classifier_result = kNN_Algorithm.classidy0(vector_under_test,train_mat,labels,3) #进行一次测试#
print("the classifier came back with:%d, the real answer is : %d" %(int(classifier_result),int(class_num)))
if (classifier_result!=class_num):error_count+=1 print('\n the total number of errors is : %d' %error_count)
print('\n the total error rate is : %f'%(error_count/float(m_test)))
解释:可以看出这个代码是一个测试函数,写的略显复杂,真实的意思就是循环调用第二个函数,计算错误率。
五、其余说明
限制:本代码手写数字识别,图片格式有局限性,所以若自己做相关项目,应该处理图片数据。
建议:建议仅参考第二个文件,即分类文件,这是整个算法的核心。然后可以用自己的方法用自己的数据,对算法稍作更改即可使用。
机器学习(二)-kNN手写数字识别的更多相关文章
- SVM学习笔记(二)----手写数字识别
引言 上一篇博客整理了一下SVM分类算法的基本理论问题,它分类的基本思想是利用最大间隔进行分类,处理非线性问题是通过核函数将特征向量映射到高维空间,从而变成线性可分的,但是运算却是在低维空间运行的.考 ...
- 机器学习初探(手写数字识别)matlab读取数据集
手写数字识别是机器学习里面的一个经典问题,今天就这一段时间学习的机器学习,花一个下午茶的时间,试试机器学习. 首先数据库是在MNIST(http://yann.lecun.com/exdb/mnist ...
- kaggle 实战 (1): PCA + KNN 手写数字识别
文章目录 加载package read data PCA 降维探索 选择50维度, 拆分数据为训练集,测试机 KNN PCA降维和K值筛选 分析k & 维度 vs 精度 预测 生成提交文件 本 ...
- 机器学习初探(手写数字识别)HOG图片
这里我们讲一下使用HOG的方法进行手写数字识别: 首先把 代码分享出来: hog1.m function B = hog1(A) %A是28*28的 B=[]; [x,y] = size(A); %外 ...
- 10,knn手写数字识别
# 导包 import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsClas ...
- KNN手写数字识别
import numpy as np import matplotlib .pyplot as plt from sklearn.neighbors import KNeighborsClassifi ...
- 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...
- Kaggle竞赛丨入门手写数字识别之KNN、CNN、降维
引言 这段时间来,看了西瓜书.蓝皮书,各种机器学习算法都有所了解,但在实践方面却缺乏相应的锻炼.于是我决定通过Kaggle这个平台来提升一下自己的应用能力,培养自己的数据分析能力. 我个人的计划是先从 ...
- 基于tensorflow的MNIST手写数字识别(二)--入门篇
http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...
随机推荐
- 【转载】jQuery全屏滚动插件fullPage.js
文章转载自dowebok http://www.dowebok.com/ 原文链接:http://www.dowebok.com/77.html 简介 如今我们经常能见到全屏网站,尤其是国外网站.这些 ...
- 初学者易上手的SSH-hibernate01环境搭建
这里我们继续学习SSH框架中的另一框架-hibernate.那么hibernate是什么?Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序 ...
- [机房练习赛7.26] YYR字符串
1 无尽的矩阵(matrix.c/cpp/pas) 1.1 题目描述 从前有一个的小矩阵,矩阵的每个元素是一个字母(区分大小写),突然有一天它发生了变异,覆盖了整个二维空间,即不停自我复制产生相同 ...
- CMake必知必会
CMake 文档 https://cmake.org/cmake/help/v3.7/index.html 需要阅读的文档 item note link cmake-buildsystem(7) cm ...
- Centos 7.3 编译 & 安装 & 测试 facebook faiss
许多 AI 系统训练完毕,正式上线时的基本操作往往可以抽象为:在高维向量空间中,给定一个向量,寻找与之最相近的 k 个向量.当向量数目异常巨大时,如何快速地执行这一基本操作,便成为 AI 系统在工程应 ...
- 关于Java和JavaScript对字符串截取处理的总结
在JavaWeb开发中,经常需要对字符串进行处理,包括Java语言和JS语言,总是容易弄混淆,这里简单对比一下两种语言对于字符串截取方法. 一.先看Java public class StringDe ...
- LINUX 笔记-文件名的匹配
特殊的匹配符号: * 匹配文件名中的任何字符串,包括空字符串 ? 匹配文件名中的任何单个字符串 [...] 匹配[]中包含的任何字符 [!...] 匹配[]中非感吧号!之后的字符
- LeetCode 55. Jump Game (跳跃游戏)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- python 文件相关知识
字符编码相关 什么是字符编码 字符编码的类型 字符编码的使用 python2和python里字符编码的区别 文件的相关 文件的基础操作 打开文件的模式 字符编码 什么是字符编码在计算机里只识别二进制, ...
- 基于HTML5 Canvas的3D动态Chart图表
发现现在工业SCADA上或者电信网管方面用图表的特别多,虽然绝大部分人在图表制作方面用的是echarts,他确实好用,但是有些时候我们不能调用别的插件,这个时候就得自己写这些美丽的图表了,然而图表轻易 ...