监督学习——K邻近算法及数字识别实践
1. KNN 算法
K-近邻(k-Nearest Neighbor,KNN)是分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
K邻近算法原理很简单,但是真正用好它也不容易,比如K的取值到底为多少才合适,而且知道什么场景下用它更不简单。
缺点: 该算法的执行效率并不高,每次计算都需要将 待识别的用例 与所有测试用例进行求差计算,计算量较大。随着测试数据的增多,计算量会越来越大。
2. 数字识别 Python 实现
下图为一个 二进制表示的数字“6”,每个训练数据和测试数据都是以这种形式保存在一个txt文件中,数据为32*32(1024个数据)的矩阵。

KNN算法实现数字识别步骤
1. 读取训练数据中的所有数据到一个矩阵中(矩阵中的每一列代表一个图片数据),同时读取数据的标签保存在一个数组中(数据的标签或患者说文件代表的具体数字信息在文件命中)
2. 读取测试数据,转换1024*1的矩阵。
3. 用测试数据与矩阵A中的每一列求距离,求得的L个距离存入距离数组中(距离算法)
4. 从距离数组中取出最小的K个距离所对应的训练集的索引
5. 拥有最多索引的值就是预测值(有多个众数时,按距离和最小)
数据加载函数
该函数用于打开一个数字数据源(32*32),保存在一个1*1024的矩阵中
def openFile(fileName):
returnVect = np.zeros((1,1024))
fr = open(fileName)
for i in range(32):
linestr = fr.readline();
for j in range(32):
returnVect[0,32*i+j] = int(linestr[j])
return returnVect
如果需要加载某个文件夹下的所有数字文件则可以调用如下函数(数字的标签保存在文件名中第一个字符)
def loadData(dir):
fileList = listdir(dir) // 列出dir文件下的所有文件(测试数据)
lable = []
index = 0
dataMat = np.zeros((1024,len(fileList)))
for file in fileList:
lable.append(int(file[0])); // 标签信息保存在文件的第一个字符中
dataMat[:,index] = openFile(dir+file)
index +=1;
return dataMat,lable
距离计算函数
该函数用于计算两个图片举证(1*1024)的距离,(相同位置如果数字相同则距离加1)
def caculateerro(data1,data2):
len1 = len(data1)
len2 = len(data2)
sizelen = min(len1,len2);
totalerro = 0;
for i in range(sizelen):
if data1[i] != data2[i]:
totalerro +=1
return totalerro
数字识别函数
def classFier(datain):
k=15
dictErro = {} //保存 训练数据编号——测试数据与该训练数据的距离
trainingdata, traninglabel = loadData('digits\\trainingDigits\\');
m,n = trainingdata.shape; for i in range(n):
// 计算测试图片与每张训练图片的距离
currErro = caculateerro(datain,trainingdata[:,i])
dictErro[i] = currErro
sortedDict = sorted(dictErro.items(),key=lambda x:x[1],reverse=False);
numofnumber = range(10) for i in range(10):
numofnumber[i] = 0
for j in range(30):
label = int(sortedDict[j][0])
numofnumber[int(traninglabel[label])] += 1;
return numofnumber.index(max(numofnumber))
上述源码中KNN算法的K取值为15,即取出距离训练数据最小的十五个图片,然后判断这15张图片中对应的那个数字出现的平率最多,将最多的数据作为识别结果返回。
参考:
《机器学习实战》
https://blog.csdn.net/zzz_cming/article/details/78938107
监督学习——K邻近算法及数字识别实践的更多相关文章
- k邻近算法(KNN)实例
一 k近邻算法原理 k近邻算法是一种基本分类和回归方法. 原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实 ...
- kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)
一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...
- [机器学习实战] k邻近算法
1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...
- 《机器学习实战》学习笔记一K邻近算法
一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...
- Python实现kNN(k邻近算法)
Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...
- Python3机器学习—Tensorflow数字识别实践
[本文出自天外归云的博客园] Windows下Anaconda+Tensorflow环境部署 1. 安装Anaconda. 2. 开始菜单 > 所有程序 > Anaconda 3 (64- ...
- <机器学习实战>读书笔记--k邻近算法KNN
k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...
- 机器学习算法及代码实现–K邻近算法
机器学习算法及代码实现–K邻近算法 1.K邻近算法 将标注好类别的训练样本映射到X(选取的特征数)维的坐标系之中,同样将测试样本映射到X维的坐标系之中,选取距离该测试样本欧氏距离(两点间距离公式)最近 ...
- 机器学习基础——简单易懂的K邻近算法,根据邻居“找自己”
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天的文章给大家分享机器学习领域非常简单的模型--KNN,也就是K Nearest Neighbours算法,翻译过来很简单,就是K最近邻居 ...
随机推荐
- Java-ServletConfig
/** * * A servlet configuration object used by a servlet container * to pass information to a servle ...
- 数据库用户映射到SQL Server登录名
由于不是固定在一如电脑开始,经常需要把数据备份与恢复.或者是帮助客户修改程序,接收到客户备份好的数据,需要在电脑恢复. 这样就需要将数据库用户映射到 SQL Server 登录名.如何映射?可使用下面 ...
- How to Create Modifiers Using the API QP_MODIFIERS_PUB.PROCESS_MODIFIERS
In this Document Goal Solution Example Scripts Steps to verify the creation of modifier(s). ...
- C++中的new/delete
不同于C语言中的malloc/free是库函数,C++语言中的new/delete是运算符,而不是库函数. new/delete执行流程 我们经常会接触到的是new/delete operator(就 ...
- Mac OS 终端常用命令基础
基础概念 OS X 采用的Unix文件系统,所有文件都挂在跟目录" /" 下面,所以不在要有Windows 下的盘符概念.比如什么"C:"你在桌面上看到的硬盘都 ...
- 设置UIButton中的文字和图片,设置UILabel的文在显示不同颜色
UIButton: UIEdgeInsets 在UIButton中有三个对EdgeInsets的设置:ContentEdgeInsets.titleEdgeInsets.imageEdgeInsets ...
- MATLAB坐标系中绘制图片
MATLAB坐标系中绘制图片 方法一 使用图片坐标循环的方式,代码如下. clear,clc,close all tic; map=imbinarize(imread('map.bmp'));%map ...
- iOS解决UITableView中Cell重用带来的问题
tableView的常规配置,当超出一屏的cell就会标上可重用的标识出列到可重用缓存池中,后面再根据可重用标识来到的可重的cell就会和前面显示同样内容. - (UITableViewCell *) ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- Ubuntu设置代理的方法
用过Linux的都知道,众多的PROXY配置,让人应接不暇,本文列出常见的一些PROXY的配置 1.apt-get proxy 的配置sudo gedit /etc/apt/apt.conf NOTE ...