机器学习(二)-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手写数字识 ...
随机推荐
- Excel导出插件
前言 一个游戏通常需要10多个Excel表格或者更多来配置,一般会通过导出csv格式读取配置. 本文提供导出Excel直接生成c#文件,对应数据直接生成结构体和数组,方便开发排错和简化重复写每个表格的 ...
- Windows-universal-samples-master示例 XamlCommanding
Windows-universal-samples-master XamlCommanding 运行默认如果是 ARM会出现没有引用System,只要在调试选择CPU为PC的就好 默认 选择PC平台 ...
- Linux中创建Daemon进程的三种方法
什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx,ssh服务进程sshd等.注意,其英文拼写为 ...
- uva1629,Cake Slicing,记忆化搜索
同上个题一样,代码相似度极高,或者说可以直接用一个模板吧 dp[i,j,p,q]表示一块长为j-i+1,宽为q-p+1,左上角在位置(i,j)上的蛋糕,dp[]表示当前状态下的最优值,然后对该块蛋糕枚 ...
- js的解析顺序 作用域 严格模式
一.javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的.我们看一下下面的代码. 1 alert(a); 2 var a = 1; 如果执行顺序是从上到 ...
- 【转】C语言中动态分配数组
原文地址:http://blog.chinaunix.net/uid-11085590-id-2914577.html 如何动态的定义及使用数组呢?记得一般用数组的时候都是先指定大小的.当时问老师,老 ...
- Vector容器构造函数
No1 vector(); No2 vector( const vector& c ); No3 explicit vector( size_type num, const TYPE& ...
- 【Java学习笔记之三十四】超详解Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)
前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在 Python代码之中. 1 2 3 ...
- yii2之数据验证
一.场景 什么情况下需要使用场景呢?当一个模型需要在不同情境中使用时,若不同情境下需要的数据表字段和数据验证规则有所 不同,则需要定义多个场景来区分不同使用情境.例如,用户注册的时候需要填写email ...