《机器学习实战》之k-近邻算法(手写识别系统)

这个玩意和改进约会网站的那个差不多,它是提前把所有数字转换成了32*32像素大小的黑白图,然后转换成字符图(用0,1表示),将所有1024个像素点用一维矩阵保存下来,这样就可以通过knn计算欧几里得距离来得到最接近的答案。

 1 import os
 2 import operator
 3 from numpy import *
 4
 5 def classify0(inX, dataSet, labels, k):
 6     dataSetSize = dataSet.shape[0]
 7     diffMat = tile(inX, (dataSetSize,1)) - dataSet  #统一矩阵,实现加减
 8     sqDiffMat = diffMat**2
 9     sqDistances = sqDiffMat.sum(axis=1)  #进行累加,axis=0是按列,axis=1是按行
10     distances = sqDistances**0.5  #开根号
11     sortedDistIndicies = distances.argsort()  #按升序进行排序,返回原下标
12     classCount = {}
13     for i in range(k):
14         voteIlabel = labels[sortedDistIndicies[i]]
15         classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1  #get是字典中的方法,前面是要获得的值,后面是若该值不存在时的默认值
16     sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
17     return sortedClassCount[0][0]
18
19
20 def img2vector(filename):
21     f = open(filename)
22     returnVect = zeros((1,1024))
23     for i in range(32):
24         line = f.readline()
25         for j in range(32):
26             returnVect[0,i*32+j] = int(line[j])
27     return returnVect
28
29
30 def handwritingClassTest():
31     fileList = os.listdir(‘trainingDigits‘)
32     m = len(fileList)
33     traingMat = zeros((m, 1024))
34     hwlabels = []
35     for i in range(m):
36         fileName = fileList[i]
37         prefix = fileName.split(‘.‘)[0]
38         number = int(prefix.split(‘_‘)[0])
39         hwlabels.append(number)
40         traingMat[i,:] = img2vector(‘trainingDigits/%s‘ %fileName)
41     testFileList = os.listdir(‘testDigits‘)
42     m = len(testFileList)
43     errorNum = 0.0
44     for i in range(m):
45         testFileName = testFileList[i]
46         prefix = testFileList[i].split(‘.‘)[0]
47         realNumber = int(prefix.split(‘_‘)[0])
48         testMat = img2vector(‘testDigits/%s‘ %testFileName)
49         testResult = classify0(testMat, traingMat, hwlabels, 3)
50         if testResult != realNumber:
51             errorNum += 1
52         print(‘The classifier came back with: %d, the real answer is: %d‘ %(testResult, realNumber))
53     print(‘错误率为%f‘ %(errorNum/float(m)))
54
55 if __name__ == ‘__main__‘:
56     handwritingClassTest()

原文地址:https://www.cnblogs.com/zyb993963526/p/8447681.html

时间: 2024-11-03 09:35:35

《机器学习实战》之k-近邻算法(手写识别系统)的相关文章

k近邻算法--手写识别系统

下面的例子来源为<机器学习实战>,例子只能识别0-9. 首先需要将图像二进制数据转化为测试向量: def imgTransformVector(filename): # 将 32x32 二进制图像矩阵转化为 1x1024 向量 returnVector = np.zeros((1,1024)) fr = open(filename) for i in range(32): lineStr = fr.readline() for j in range(32): returnVector[0,32

《机器学习实战》-k近邻算法

目录 K-近邻算法 k-近邻算法概述 解析和导入数据 使用 Python 导入数据 实施 kNN 分类算法 测试分类器 使用 k-近邻算法改进约会网站的配对效果 收集数据 准备数据:使用 Python 解析文本文件 分析数据:使用 Matplotlib 画二维散点图 准备数据:归一化数值 测试算法:验证分类器 使用算法:构建完整可用系统 手写识别系统 准备数据 测试算法 使用算法:构建完整可用系统 总结 K-近邻算法 k-近邻分类算法概述 使用 k-近邻算法改进约会网站的配对效果 手写识别系统

机器学习实战笔记-K近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类 K近邻算法特点: 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. K近邻算法原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签.一般来说,我们只选择样本数据集中前k个最

机器学习实战笔记-K近邻算法2(改进约会网站的配对效果)

案例二.:使用K-近邻算法改进约会网站的配对效果 案例分析: 海伦收集的数据集有三类特征,分别是每年获得的飞行常客里程数.玩视频游戏所耗时间百分比. 每周消费的冰淇淋公升数.我们需要将新数据的每个新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数.最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类. 流程:在约会网站上使用K

机器学习实战笔记--k近邻算法

1 #encoding:utf-8 2 from numpy import * 3 import operator 4 import matplotlib 5 import matplotlib.pyplot as plt 6 7 from os import listdir 8 9 def makePhoto(returnMat,classLabelVector): #创建散点图 10 fig = plt.figure() 11 ax = fig.add_subplot(111) #例如参数为

使用K近邻算法实现手写体识别系统

目录 1. 应用介绍 1.1实验环境介绍 1.2应用背景介绍 2. 数据来源及预处理 2.1数据来源及格式 2.2数据预处理 3. 算法设计与实现 3.1手写体识别系统算法实现过程 3.2 K近邻算法实现 3.3手写体识别系统实现 3.4算法改进与优化 4. 系统运行过程与结果展示 1.应用介绍 1.1实验环境介绍 本次实验主要使用Python语言开发完成,Python的版本为2.7,并且使用numpy函数库做一些数值计算和处理. 1.2应用背景介绍 本次实验实现的是简易的手写体识别系统,即根据

机器学习实战笔记-K近邻算法3(手写识别系统)

1 准备数据:将图像转换为测试向量 这次数据集还是有两种,训练数据集和测试数据集,分别有2000个,900个. 我们将把一个32*32的二进制图像矩阵转换为1 x 1024的向量,这样前两节使用的分类器就可以处理数字图像信息了. 代码: def img2vector(filename): returnVect = zeros((1,1024)) file = open(filename) for i in range(32): line = file.readline() for j in ra

《机器学习实战》——K近邻算法

原理: (1) 输入点A,输入已知分类的数据集data (2) 求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点 (3) K个点进行投票,票数最多的分类即为所求 优点: 简单,可用于非线性分类 缺点: 当样本不均衡时影响投票结果: 分类结果受K值影响: 时空复杂度高:需要保存全部数据O(N),每次取前k个都要与全部数据进行计算O(N),耗费内存大且计算量大 改进: 样本均衡化 太小的K值容易受噪音影响,大的K值减小噪音但会使分类边界模糊,最合适的方法是用交叉验证确定K值:先确定

机器学习实战笔记——基于KNN算法的手写识别系统

本文主要利用k-近邻分类器实现手写识别系统,训练数据集大约2000个样本,每个数字大约有200个样本,每个样本保存在一个txt文件中,手写体图像本身是32X32的二值图像,如下图所示: 首先,我们需要将图像格式化处理为一个向量,把一个32X32的二进制图像矩阵通过img2vector()函数转换为1X1024的向量: def img2vector(filename): returnVect = zeros((1,1024)) fr = open(filename) for i in range(

机器学习与数据挖掘-logistic回归及手写识别实例的实现

本文主要介绍logistic回归相关知识点和一个手写识别的例子实现 一.logistic回归介绍: logistic回归算法很简单,这里简单介绍一下: 1.和线性回归做一个简单的对比 下图就是一个简单的线性回归实例,简单一点就是一个线性方程表示 (就是用来描述自变量和因变量已经偏差的方程) 2.logistic回归 可以看到下图,很难找到一条线性方程能将他们很好的分开.这里也需要用到logistic回归来处理了. logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,