机器学习(二)-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手写数字识 ...
随机推荐
- BAT级别分类
阿里的级别:P为技术岗,M为管理岗.P7是技术专家级别. 阿里级别对应薪资: 百度使用的T系列及对应薪资: 腾讯的T系列及对应薪资:
- Android Annotations(1)
特性: Android Annotations是一个开源的框架,用于加速 Android应用的开发,可以让你把重点放在功能的实现上,简化了代码,提升了可维护性. 特性: 依赖注入: inject ...
- win10 edge扩展
安装红石预览版 https://dev.windows.com/zh-cn/microsoft-edge/extensions/#available-extensions 微软翻译 鼠标手势
- 牛顿插值法及其C++实现
h1 { margin-bottom: 0.21cm } h1.western { font-family: "Liberation Sans", sans-serif; font ...
- UVW源码漫谈(四)
十一假期后就有点懒散,好长时间都没想起来写东西了.另外最近在打LOL的S赛.接触LOL时间不长,虽然平时玩的比较少,水平也相当菜,但是像这种大型的赛事有时间还是不会错过的.主要能够感受到选手们对竞技的 ...
- 【ASP.NET MVC 学习笔记】- 12 Filter
本文参考:http://www.cnblogs.com/willick/p/3331520.html 1.Filter(过滤器)是基于AOP(Aspect-Oriented Programming 面 ...
- Java的绝对路径和相对路径
Java的绝对路径和相对路径 参考:http://blog.csdn.net/u011225629/article/details/46872775 1. 绝对路径 以根部件开始的路径是绝对路径,比如 ...
- Java基础笔记5
方法(函数) 就是一块可以重复调用的代码块. 比如.100行代码. 在多处使用. 方法的格式 public static 返回类型 方法名称(参数列表){ } 返回类型:当方法被调用时,把返回内容 交 ...
- Java设计模式探讨之单例模式
单例模式是在平时的项目开发中比较常见的一种设计模式,使用比较普遍,网上的资料也是一抓一大把,小Alan也来凑凑热闹,为以后充实点设计模式相关的内容做个简单的开篇. 单例模式是一种创建对象的模式,用于产 ...
- Codeforces Round #383 (Div. 2)C. Arpa's loud Owf and Mehrdad's evil plan
C. Arpa's loud Owf and Mehrdad's evil plan time limit per test 1 second memory limit per test 256 me ...