当前位置: 首页 > wzjs >正文

重庆网站制作权威乐云践新中山网站建设制作 .超凡科技

重庆网站制作权威乐云践新,中山网站建设制作 .超凡科技,如何注册一个免费网站,黄冈app推广服务机构KNN实验——手写数字识别 实验目的: 实验内容: 实现最基本的KNN算法,使用trainingDigits文件夹下的数据,对testDigits中的数据进行预测。(K赋值为1,使用欧氏距离,多数投票决定分类结果&#…

KNN实验——手写数字识别

实验目的:

实验内容:

  1. 实现最基本的KNN算法,使用trainingDigits文件夹下的数据,对testDigits中的数据进行预测。(K赋值为1,使用欧氏距离,多数投票决定分类结果)
  2. 改变K的值,并观察对正确率的影响。
  3. 更改距离度量方式,更改投票方式(距离加权),分析错误率。

实验要求:

  1. 要求给出代码,以及运行窗口截图。
  2. 对正确率的影响,最好用表格或作图说明,并做简要分析。
  3. 实验内容3为选做,不做统一要求。

实验步骤与内容:

算法设计说明

实验环境

  1. 硬件环境    个人笔记本电脑
  2. 软件环境    Python   Eclipse  Pydev插件

所用语言:Python

实验数据分析

把来自UCI数据库的手写数据集简化成32像素x32像素的黑白图像,并且以01矩阵的方式存储在txt文件中。大约有训练样本2000个,测试样本900个。

digits 目录下有两个文件夹,分别是:

  1. trainingDigits:训练数据,1934个文件,每个数字大约200个文件。
  2. testDigits:测试数据,946个文件,每个数字大约100个文件。

每个文件中存储一个手写的数字,文件的命名类似0_7.txt,第一个数字0表示文件中的手写数字是0,后面的7是个序号。

我们使用目录trainingDigits中的数据训练分类器,使用目录testDigits中的数据测试分类器的效果。两组数据没有重叠。

算法设计

1.思路

  1. KNN的主要思想是找到与待测样本最接近的k个样本,然后把这k个样本出现次数最多的类别作为待测样本的类别。
  2. 下载实验要求中给的数据集digits文件夹,用trainingDigits作训练集,用testDigits作为测试集
  3. 将每个样本的txt文件转换为对应的一个向量
  4. 以欧氏距离作为度量进行KNN算法,分析样本之间的相似度

2.具体实现

a.加载数据loadDataSet():

从digits文件夹中读取训练数据和测试数据

以训练数据为例

dataSetDir = './digits/'     
trainingFileList = os.listdir(dataSetDir + 'trainingDigits')

加载同目录下/digits/trainingDigits中的训练数据文件

numSamples = len(trainingFileList)
train_x = zeros((numSamples, 1024))
train_y = []

train_x用来储存txt文件转换成的向量

train_y用来储存该文件实际代表的数字

for i in xrange(numSamples):filename = trainingFileList[i]对每个训练数据文件进行处理# get train_xtrain_x[i, :] = img2vector(dataSetDir + 'trainingDigits/%s' % filename)调用img2vector方法将txt文件转换为对应的一个向量# get label from file name such as "1_18.txt"label = int(filename.split('_')[0]) # return 1train_y.append(label)记录该文件实际代表的数字

加载测试集数据的过程同理,用test_x,test_y表示

b.将图片转换为向量img2vector(filename):

def  img2vector(filename):rows = 32cols = 32

数据的行列都是32

imgVector = zeros((1, rows * cols))
fileIn = open(filename)

对每个训练数据文件进行处理

  for row in xrange(rows):lineStr = fileIn.readline()for col in xrange(cols):imgVector[0, row * 32 + col] = int(lineStr[col])
return imgVector

转换为向量

c.KNN分类核心方法 kNNClassify(newInput, dataSet, labels, k):

newInput为待测试数据,dataSet是训练集,labels是分类合集

def kNNClassify(newInput, dataSet, labels, k):
numSamples = dataSet.shape[0]  # shape[0]代表行数

已知分类的数据集(训练集)的行数

先tile函数将输入点拓展成与训练集相同维数的矩阵,再计算欧氏距离

 # # step 1: 计算欧式距离# tile(A, reps): 将A重复reps次来构造一个矩阵# the following copy numSamples rows for dataSet
diff = tile(newInput, (numSamples, 1)) - dataSet  # Subtract element-wise样本与训练集的差值矩阵
squaredDiff = diff ** 2  # squared for the subtract
差值矩阵平方
squaredDist = sum(squaredDiff, axis = 1)   # sum is performed by row
计算每一行上元素的和
distance = squaredDist ** 0.5开方得到欧拉距离矩阵# # step 2: 对距离排序# argsort()返回排序后的索引
sortedDistIndices = argsort(distance)按distances中元素进行升序排序后得到的对应下标的列表classCount = {}  # 定义一个空的字典for i in xrange(k):# # step 3: 选择k个最小距离voteLabel = labels[sortedDistIndices[i]]# # step 4: 计算类别的出现次数# when the key voteLabel is not in dictionary classCount, get()# will return 0classCount[voteLabel] = classCount.get(voteLabel, 0) + 1选择距离最小的k个点# # step 5: 返回出现次数最多的类别作为分类结果maxCount = 0for key, value in classCount.items():if value > maxCount:maxCount = valuemaxIndex = keyreturn maxIndex
返回出现次数最多的类别作为分类结果

d.计算预测准确率

# # step 3: 测试print "step 3: testing..."numTestSamples = test_x.shape[0]
matchCount = 0
声明总待测数据和预测正确数for i in xrange(numTestSamples):predict = kNNClassify(test_x[i], train_x, train_y, 1)if predict == test_y[i]:matchCount += 1对每一个测试样本进行测试,正确则计入accuracy = float(matchCount) / numTestSamples计算正确率

3.改进

程序运行结果仅输出几个步骤提示,界面停滞几分钟后便直接输出准确率的结果,未免有些不到位,所以应该加入更加细致的算法运行结果的显示。

需要添加:

对每个测试样本进行KNN分类算法后的结果

与该样本实际类别的比较

print "分类结果为: %d, 实际类别为: %d" % (predict, test_y)总测试数量
print "总测试样本数: %d" % numTestSamples
测试准确数
print "测试正确样本数: %d" % matchCount
分类准确率
print '分类正确率: %.2f%%' % (accuracy * 100)

实验结果

要求:改变K的值,并观察对正确率的影响。

K值

正确率

1

98.63%

2

98.63%

3

98.84%

4

98.52%

5

98.20%

实验结果分析:

根据上方的图表,可以看出K的取值可以影响分类的准确率

K=1时准确率就已经高达98.63%;K=2时准确率保持不变,仍是98.63%;在K=3的时候准确率最高,上升到了98.84%;在K=4时又开始降低到98.52%;K=5时准确率仍然在降低,为98.20%

之后增加K的值,如K=6,K=7,可以看到准确率继续降低

结论是,为了保证较高的准确率,应该把K的值设得小一些。

实验结果截图

K=1

K=2

结果同K=1

K=3

K=4

K=5

http://www.dtcms.com/wzjs/792835.html

相关文章:

  • 深圳网站备案拍照点新手网络推广怎么干
  • 建站网址是多少国外对旅游网站建设的现状
  • 任何网站都可以做谷歌推广的吗长沙感染人数最新消息
  • 孝昌县专注网站建设代理桂林人论坛
  • 旅游网--个人网站建设 论文网站动态图片如何做
  • 飞飞cms悠悠电影网站阿里云 备案 网站服务内容
  • 安阳网站推广西安制作网站公司哪家好
  • 做网站宁夏百度友情链接
  • 如何解决网站兼容性问题能用网站做微信小程序
  • 四川seo整站优化集团网站制作方案ppt
  • 网站建设的人性分析亚洲国产中文域名查询
  • 网站设计酷站个人与企业签订网站开发合同
  • 怎么做合买彩票网站网站开发从入门到实战
  • wordpress 整站带数据网站建设软文模板
  • 网站安全备案如何注册网站卖东西
  • 重庆网站建设套餐微企申请网站
  • 网页设计与网站建设考试wordpress文章页面500
  • 北京网站建设交易做传销网站后果严重吗
  • 如何在网站中做二级下拉菜单mt4网站建设
  • 网站建设 天津广州涉疫重点场所有更新
  • 门户网站设计特点二级域名查询
  • 专业的网站开发app开发公司入
  • 网站建设路由设置wordpress网站定时更新没有发布
  • 保护环境网站模板上海网站制作公司多少钱
  • php做网站如何广州专业的网站建设公司
  • 空间排版设计网站Wordpress hover插件
  • 如何用h5自己做网站自己怎样做公司广告视频网站
  • 网站建设方案 doc怎么做微信领券网站
  • 上海专业建网站广州专业网站制作公司
  • 珠海网站建设珠海做计算机模拟ie题模拟网站打不开