机器学习(二)-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

1 import numpy as np
2 def img2_vector(filename):
3     return_vect = np.zeros((1,1024))
4     fr = open(filename)
5     for i in range(32):
6         linestr = fr.readline()
7         for j in range(32):
8             return_vect[0,32*i+j] = int(linestr[j])
9     return return_vect

解释:可以看出返回一个1行1024列的向量,这是把一个图像的32*32展开表示成一行,为后面计算欧式距离做准备。

2,kNN_Algorithm.py

 1 #导入kNN算法所需的两个模块,(1)numpy科学计算包(2)operator运算符模块
 2 import numpy as np
 3 import operator
 4
 5 #定义k近邻算法函数classify0,[参数说明:inX待预测的对象,dataset训练数据,labels训练数据对应的标签,选取的前k相近]
 6 def classidy0(inX,dataset,labels,k):
 7
 8     #1,计算距离
 9     dataset_size = dataset.shape[0]
10     diff_mat = np.tile(inX,(dataset_size,1))-dataset
11     sqdiff_mat = diff_mat**2
12     sq_distances = sqdiff_mat.sum(axis=1)
13     distances = sq_distances**0.5
14
15     #2,按递增排序
16     sorted_distances_index = distances.argsort()
17
18     #3,选择距离最近的前k个点,并且计算它们类别的次数排序
19     class_count = {}
20     for i in range(k):
21         vote_label = labels[sorted_distances_index[i]]
22         class_count[vote_label] = class_count.get(vote_label,0) + 1
23     sorted_class_count = sorted(class_count.items(),key=operator.itemgetter(1),reverse=True)
24
25     #4,返回前k个里面统计的最高次类别作为预测类别
26     return sorted_class_count[0][0]

解释:此函数是分类函数,四个参数,定义k近邻算法函数classify0,[参数说明:inX待预测的对象,dataset训练数据,labels训练数据对应的标签,选取的前k相近]。最后会返回分类的类别。

3,testknn_Test.py

 1 from os import listdir   #列出给定目录的文件名#
 2 import kNN_Algorithm
 3 import numpy as np
 4 import data_Prepare
 5 def class_test():
 6
 7     #获取训练集目录下的所有文件#
 8     labels = []
 9     train_file_list = listdir(‘trainingDigits‘)
10     m_train = len(train_file_list)
11     train_mat = np.zeros((m_train,1024))
12     for i in range(m_train):
13         file_str = train_file_list[i]
14         #filename1 =  ‘trainingDigits/‘+file_str#
15         file_name = file_str.split(‘.‘)[0]
16         class_num = file_name.split(‘_‘)[0]
17         labels.append(class_num)  #训练集所有文件对应的分类label#
18         train_mat[i,:]=data_Prepare.img2_vector(‘trainingDigits/%s‘ %file_str) #每个训练集特征#
19
20     test_file_list = listdir(‘testDigits‘)
21     error_count = 0.0
22     m_test = len(test_file_list)
23
24     for i in range(m_test):
25         file_str = test_file_list[i]
26         #filename2 =  ‘testDigits/‘+file_str
27         file_name = file_str.split(‘.‘)[0]
28         class_num = file_name.split(‘_‘)[0]
29         vector_under_test = data_Prepare.img2_vector(‘testDigits/%s‘ %file_str)
30         classifier_result = kNN_Algorithm.classidy0(vector_under_test,train_mat,labels,3) #进行一次测试#
31         print("the classifier came back with:%d, the real answer is : %d" %(int(classifier_result),int(class_num)))
32         if (classifier_result!=class_num):error_count+=1
33
34     print(‘\n the total number of errors is : %d‘ %error_count)
35     print(‘\n the total error rate is : %f‘%(error_count/float(m_test)))

解释:可以看出这个代码是一个测试函数,写的略显复杂,真实的意思就是循环调用第二个函数,计算错误率。

五、其余说明

限制:本代码手写数字识别,图片格式有局限性,所以若自己做相关项目,应该处理图片数据。

建议:建议仅参考第二个文件,即分类文件,这是整个算法的核心。然后可以用自己的方法用自己的数据,对算法稍作更改即可使用。

时间: 2024-08-04 03:46:51

机器学习(二)-kNN手写数字识别的相关文章

机器学习初探(手写数字识别)matlab读取数据集

手写数字识别是机器学习里面的一个经典问题,今天就这一段时间学习的机器学习,花一个下午茶的时间,试试机器学习. 首先数据库是在MNIST(http://yann.lecun.com/exdb/mnist/)下载下来的.下载下来的数据如下图所示.官方有给出数据怎么读取,我自己没有仔细看,因为我看到网上有人公布代码如何读取. 可以看到前四个是测试数据,后四个是训练数据. 这里我用matlab尝试读取这些数据. 首先看两个function. loadMNISTImages.m function imag

[机器学习案例1]基于KNN手写数字识别

算法介绍 之前已经介绍过,简单来说,K-NN可以看成:有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑离这个训练数据最近的K个点看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类. 算法步骤: 算法步骤: 1. step.1-初始化距离为最大值 2. step.2-计算未知样本和每个训练样本的距离dist 3. step.3-得到目前K个最临近样本中的最大距离maxdist 4. step.4-如果dist小于maxdist,则将

Kaggle竞赛丨入门手写数字识别之KNN、CNN、降维

引言 这段时间来,看了西瓜书.蓝皮书,各种机器学习算法都有所了解,但在实践方面却缺乏相应的锻炼.于是我决定通过Kaggle这个平台来提升一下自己的应用能力,培养自己的数据分析能力. 我个人的计划是先从简单的数据集入手如手写数字识别.泰坦尼克号.房价预测,这些目前已经有丰富且成熟的方案可以参考,之后关注未来就业的方向如计算广告.点击率预测,有合适的时机,再与小伙伴一同参加线上比赛. 数据集 介绍 MNIST ("Modified National Institute of Standards an

Python 手写数字识别-knn算法应用

在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点: 优点:精度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用数据范围:数值型和标称型(具有有穷多个不同值,值之间无序)    knn算法代码: #-*- coding: utf-8 -*- from numpy import * import operatorimport

05-05 主成分分析代码(手写数字识别)

目录 主成分分析代码(手写数字识别) 一.导入模块 二.数据预处理 三.KNN训练数据 3.1 准确度 四.降维(2维) 4.1 KNN训练数据 4.2 准确度 4.3 二维特征方差比例 五.查看原始数据特征方差比例 5.1 主成分所占方差比例 六.保留原始维度的80%的维度 6.1 查看主成分个数 6.2 降维(13维) 6.3 KNN训练数据 6.4 准确度 七.小结 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://ww

keras入门实战:手写数字识别

近些年由于理论知识的硬件的快速发展,使得深度学习达到了空前的火热.深度学习已经在很多方面都成功得到了应用,尤其是在图像识别和分类领域,机器识别图像的能力甚至超过了人类. 本文用深度学习Python库Keras实现深度学习入门教程mnist手写数字识别.mnist手写数字识别是机器学习和深度学习领域的"hello world",MNIST数据集是手写数字的数据集合,训练集规模为60000,测试集为10000. 本文的内容包括: 如何用Keras加载MNIST数据集 对于MNIST问题如何

DeepLearning (四) 基于自编码算法与softmax回归的手写数字识别

[原创]Liu_LongPo 转载请注明出处 [CSDN]http://blog.csdn.net/llp1992 softmax 回归模型,是logistic 回归模型在多分类问题上的推广.关于logistic回归算法的介绍,前面博客已经讲得很清楚,详情可以参考博客 机器学习实战ByMatlab(五)Logistic Regression 在logistic回归模型中,我们的激励函数sigmoid的输入为: z=θ0x0+θ1x1+θ2x2+...+θnxn 则可以得到假设函数为: hθ(x)

Tensorflow实战 手写数字识别(Tensorboard可视化)

一.前言 为了更好的理解Neural Network,本文使用Tensorflow实现一个最简单的神经网络,然后使用MNIST数据集进行测试.同时使用Tensorboard对训练过程进行可视化,算是打响学习Tensorflow的第一枪啦. 看本文之前,希望你已经具备机器学习和深度学习基础. 机器学习基础可以看我的系列博文: https://cuijiahua.com/blog/ml/ 深度学习基础可以看吴恩达老师的公开课: http://mooc.study.163.com/smartSpec/

利用手写数字识别项目详细描述BP深度神经网络的权重学习

本篇文章是针对学习<深度学习入门>(由日本学者斋藤康毅所著陆羽杰所译)中关于神经网络的学习一章来总结归纳一些收获. 本书提出神经网络的学习分四步:1.mini-batch 2.计算梯度 3.更新参数 4.重复前面步骤 1.从识别手写数字项目学习神经网络 所谓“从数据中学习”是指 可以由数据#自动决定权重#.当解决较为简单的问题,使用简单的神经网络时,网络里的权重可以人为的手动设置,去提取输入信息中特定的特征.但是在实际的神经网络中,参数往往是成千上万,甚至可能上亿的权重,这个时候人为手动设置是