【机器学习】6:K

您所在的位置:网站首页 926数字图片 【机器学习】6:K

【机器学习】6:K

2024-07-10 05:19| 来源: 网络整理| 查看: 265

前言:

本来觉得自己从数据建模转人工智能方向应该问题不大(自我感觉自己算法学的不错)。结果一个K-邻近实现手写数字识别的代码就让我改了三四天。虽然网上这方面的代码是很多,但是我运行了好几个,结果都不是很理想。一次偶然的念想——为什么我不把这些代码的优点结合在一起呢,于是说做就做,年轻人嘛,反正有时间燥起来,动动手总有益处,于是就拙笔于此,有更好的建议与意见,欢迎指正;

–-----------------------------------------------------------------------------—---------------------------------------- 本篇所有的源码资源都已上传:https://download.csdn.net/download/zzz_cming/10377414 –-----------------------------------------------------------------------------—----------------------------------------

一、什么是K-近邻算法

百度百科上的定义:K-近邻(k-Nearest Neighbor,KNN)是分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

–-----------------------------------------------------------------------------—---------------------------------------- –-----------------------------------------------------------------------------—----------------------------------------

二、K-近邻算法怎么应用于数字识别

实现过程直观点说:根据测试数据与每个训练集数据距离的大小来判断该测试数据分属哪个类别——我们有一堆已经注明好它是哪个数字的图片(这一堆图片组成训练集,也叫比较集、样本空间)。现在有一个测试数据“6”来了,我们要识别这个“6”的步骤就是:

(说明:左图是我用Windows自带的画图工具写的一个“6”,图片大小是28*28。右图是经过我切割、拉伸转化后的0-1矩阵图) 图片6(28*28像素点) 字符串6

将测试数据由图片形式转换成只有一列的0-1矩阵形式:上左图中有像素点的位置记为1,没有像素点的位置记为0,成上右图(上右图是经过我切割、拉伸后的结果)。再将上右图中所有后一行数字接到前一行末尾,形成一行,最后转置即可得一列0-1矩阵形式将所有(L个)训练数据也都用上方法从图片形式转换成只有一列的0-1矩阵形式把L个单列数据存入新矩阵A中——矩阵A每一列存储一个图片的所有信息用测试数据与矩阵A中的每一列求距离,求得的L个距离存入距离数组中(距离 = 对应位差值的平方和再求平方根)从距离数组中取出最小的K个距离所对应的训练集的索引拥有最多索引的值就是预测值(有多个众数时,按距离和最小)

–-----------------------------------------------------------------------------—---------------------------------------- –-----------------------------------------------------------------------------—---------------------------------------- –-----------------------------------------------------------------------------—----------------------------------------

三、三个KNN实现数字识别的方法

这是自己在网上看到的三个大神写的比较好的代码,前两个都能实现要求,后一个是预处理方法。我也只是站在大神的肩膀上做一点点修改,原理还是他们教的我,在此向他们表示致敬。

–-----------------------------------------------------------------------------—----------------------------------------

第一个:图片大小28*28,手写数字图片识别

代码如下:

# -*- coding:utf-8 -*- # -*- author:zzZ_CMing # -*- 2017/12/25 # -*- python3.5 import numpy as np from image import image2onebit as it import sys from tensorflow.examples.tutorials.mnist import input_data import math import datetime #KNN算法主体:计算测试样本与每一个训练样本的距离 def get_index(train_data,test_data, i): #1、 np.argmin(np.sqrt(np.sum(np.square(test_data[i]-train_data),axis=1))) #2、a数组存入:测试样本与每一个训练样本的距离 all_dist = np.sqrt(np.sum(np.square(test_data[i]-train_data),axis=1)).tolist() return all_dist #KNN算法主体:计算查找最近的K个训练集所对应的预测值 def get_number(all_dist): all_number = [] min_index = 0 #print('距离列表:', all_dist,) for k in range(Nearest_Neighbor_number): # 最小索引值 = 最小距离的下标编号 min_index = np.argmin(all_dist) #依据最小索引值(最小距离的下标编号),映射查找到预测值 ss = np.argmax((train_label[min_index])).tolist() print('第',k+1,'次预测值:',ss) #将预测值改为字符串形式存入新元组bb中 all_number = all_number + list(str(ss)) #在距离数组中,将最小的距离值删去 min_number = min(all_dist) xx = all_dist.index(min_number) del all_dist[xx] print('预测值总体结果:',all_number) return all_number #KNN算法主体:在K个预测值中,求众数,找到分属最多的那一类,输出 def get_min_number(all_number): c = [] #将string转化为int,传入新列表c for i in range(len(all_number)): c.append(int(all_number[i])) #求众数 new_number = np.array(c) counts = np.bincount(new_number) return np.argmax(counts) t1 = datetime.datetime.now() #计时开始 print('说明:训练集数目取值范围在[0,60000],K取值最好


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3