【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
来源:互联网 发布:企业网站如何做好优化 编辑:程序博客网 时间:2024/05/11 02:59
【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
【机器学习算法实现】系列文章将记录个人阅读机器学习论文、书籍过程中所碰到的算法,每篇文章描述一个具体的算法、算法的编程实现、算法的具体应用实例。争取每个算法都用多种语言编程实现。所有代码共享至github:https://github.com/wepe/MachineLearning-Demo 欢迎交流指正!
(1)kNN算法_手写识别实例——基于Python和NumPy函数库
1、kNN算法简介
kNN算法,即K最近邻(k-NearestNeighbor)分类算法,是最简单的机器学习算法之一,算法思想很简单:从训练样本集中选择k个与测试样本“距离”最近的样本,这k个样本中出现频率最高的类别即作为测试样本的类别。下面的简介选自wiki百科:http://zh.wikipedia.org/wiki/%E6%9C%80%E8%BF%91%E9%84%B0%E5%B1%85%E6%B3%95
方法
- 目标:分类未知类别案例。
- 输入:待分类未知类别案例项目。已知类别案例集合D ,其中包含 j个已知类别的案例。
- 输出:项目可能的类别。
步骤
如下图
我们考虑样本为二维的情况下,利用knn方法进行二分类的问题。图中三角形和方形是已知类别的样本点,这里我们假设三角形为正类,方形为负类。图中圆形点是未知类别的数据,我们要利用这些已知类别的样本对它进行分类。
分类过程如下:
1 首先我们事先定下k值(就是指k近邻方法的k的大小,代表对于一个待分类的数据点,我们要寻找几个它的邻居)。这边为了说明问题,我们取两个k值,分别为3和5;
2 根据事先确定的距离度量公式(如:欧氏距离),得出待分类数据点和所有已知类别的样本点中,距离最近的k个样本。
3 统计这k个样本点中,各个类别的数量。如上图,如果我们选定k值为3,则正类样本(三角形)有2个,负类样本(方形)有1个,那么我们就把这个圆形数据点定为正类;而如果我们选择k值为5,则正类样本(三角形)有2个,负类样本(方形)有3个,那么我们这个数据点定为负类。即,根据k个样本中,数量最多的样本是什么类别,我们就把这个数据点定为什么类别。
补充:
优缺点:
(1)优点:
算法简单,易于实现,不需要参数估计,不需要事先训练。
(2)缺点:
属于懒惰算法,“平时不好好学习,考试时才临阵磨枪”,意思是kNN不用事先训练,而是在输入待分类样本时才开始运行,这一特点导致kNN计算量特别大,而且训练样本必须存储在本地,内存开销也特别大。
K的取值:
参数k的取值一般通常不大于20。——《机器学习实战》
2、手写识别实例
2.1 python、numpy函数
NumPy库总包含两种基本的数据类型:矩阵和数组,矩阵的使用类似Matlab,本实例用得多的是数组array。
shape()
shape是numpy函数库中的方法,用于查看矩阵或者数组的维素
>>>shape(array) 若矩阵有m行n列,则返回(m,n)
>>>array.shape[0] 返回矩阵的行数m,参数为1的话返回列数n
tile()
tile是numpy函数库中的方法,用法如下:
>>>tile(A,(m,n)) 将数组A作为元素构造出m行n列的数组
sum()
sum()是numpy函数库中的方法
>>>array.sum(axis=1)按行累加,axis=0为按列累加
argsort()
argsort()是numpy中的方法,得到矩阵中每个元素的排序序号
>>>A=array.argsort() A[0]表示排序后 排在第一个的那个数在原来数组中的下标
dict.get(key,x)
python中字典的方法,get(key,x)从字典中获取key对应的value,字典中没有key的话返回0
sorted()
python中的方法
min()、max()
numpy中有min()、max()方法,用法如下
>>>array.min(0) 返回一个数组,数组中每个数都是它所在列的所有数的最小值
>>>array.min(1) 返回一个数组,数组中每个数都是它所在行的所有数的最小值
listdir('str')
python的operator中的方法
>>>strlist=listdir('str') 读取目录str下的所有文件名,返回一个字符串列表
split()
python中的方法,切片函数
>>>string.split('str')以字符str为分隔符切片,返回list
关于更多的numpy中的函数,可以查阅官网:http://docs.scipy.org/doc/
2.2 编程实现“手写识别”
3、工程文件
- 【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
- 【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
- 【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
- 【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
- kNN算法__手写识别——基于Python和NumPy函数库
- (1)kNN算法_手写识别实例——基于Python和NumPy函数库
- 【机器学习算法实现】logistic回归__基于Python和Numpy函数库
- 【机器学习算法实现】logistic回归__基于Python和Numpy函数库
- 【机器学习算法实现】logistic回归__基于Python和Numpy函数库
- 机器学习实战笔记——基于KNN算法的手写识别系统
- 【机器学习】Knn算法实现手写数字识别
- Python实现KNN算法手写识别数字
- Python实现knn算法手写数字识别
- 基于python和numpy的KNN手写识别
- 学习笔记——《机器学习实战》KNN算法实现 约会网站测试,手写数字识别,代码,注释,错误修改
- KNN算法 手写识别 python
- 《机器学习实战》-kNN算法手写算法识别
- 机器学习(3)——KNN算法及手写数字的识别(一)
- 21Python中多线程的创建
- 修改ad值实现路由备份
- 关于lilnux应用于区块链开发的环境部署(docker-chaincode-nodejs)
- linux shell之回放和广播
- 高效的SQLSERVER分页查询(推荐)
- 【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库
- 视觉slam14讲——第3讲 三维空间刚体运动
- oracle 中 cursor 与refcursor及sys_refcursor的区别 (转载)
- 数据库视图
- 实验4:栈和队列的基本操作实现及其应用之《顺序栈》
- Mybatis调用Oracle返回结果集存储过程
- [noip2013]货车运输 题解
- 前端基础(1):JavaScript、html和css的简介
- 实验四 掌握用户管理的基本内容和原理