knn算法手写字识别案例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
from sklearn.neighbors import KNeighborsClassifier def build_data(dir_name):
"""
构建数据
:param dir_name: 指定传入文件夹名称
:return: 构建好的数据
"""
# 获取文件名列表
file_name_list = os.listdir(dir_name + "/")
print("获取到的文件名列表:\n", file_name_list)
# 进行读取文件 data = np.zeros(shape=(len(file_name_list), 1025)) # 循环读取文件
for file_index, file_name in enumerate(file_name_list):
# file_index 文本名称所对应的下标
# file_name 文本名称
# 加载数据
file_data = np.loadtxt(dir_name + "/" + file_name, dtype=np.str) # 构建一个列表
arr = []
for file_data_index, file_data_content in enumerate(file_data):
# print(file_data_content)
# print("*"*80)
# 将 每一个元素转化为一个int 类型的列表
arr_sigle_list = [int(tmp) for tmp in file_data_content]
# print(arr)
# 把每个元素添加到列表中
arr.append(arr_sigle_list) # print(arr)
# 将一个样本转化为数组
arr_single_sample = np.array(arr)
# print(arr_single_sample)
# np.savetxt("./hh.txt",arr_single_sample,fmt="%d")
# 将二维数组展开为一维---特征值
arr_single_sample = arr_single_sample.ravel()
# print(arr_single_sample)
# 目标值
label = int(file_name[0])
# print(res)
# print(arr_single_sample.shape)
# 将一个 完整的样本拼接起来,组成完整的样本
arr_single_sample = np.concatenate((arr_single_sample, [label]), axis=0) # print(arr_single_sample)
# print(arr_single_sample.shape) data[file_index, :] = arr_single_sample # print(data)
return data def save_data(file_name, data):
"""
保存文件
:param file_name: 保存的文件名称
:param data: 保存的数组
:return: None
"""
if not os.path.exists("./data/"):
os.makedirs("./data/") np.save("./data/" + file_name, data) def load_data(file_name):
"""
加载数据
:param file_name:文件路径+ 名称
:return: 数据
"""
data = np.load(file_name, allow_pickle=True) return data def distance(v1, v2):
"""
计算距离
:param v1: 点1
:param v2: 点2
:return: 距离
"""
dist = np.sqrt(np.sum(np.power((v1 - v2), 2))) return dist def knn_owns(train, test, k):
"""
自定knn算法实现手写字识别
:param train: 训练集数据
:param test: 测试集数据
:param k: 邻居个数
:return: 准确率
"""
# 设置计数器
true_num = 0
# 获取训练集的特征值 目标值
train_x = train.iloc[:, :-1].values
train_y = train.iloc[:, -1].values
# 获取测试集的特征值 目标值
test_x = test.iloc[:, :-1].values
test_y = test.iloc[:, -1].values
# 计算每一个测试样本特征与每一个训练样本特征的距离
for i in range(test.shape[0]): # 循环每一个 测试样本
for j in range(train.shape[0]):
# 计算距离
dist = distance(test_x[i,:],train_x[j,:])
train.loc[j,'dist'] = dist res = train.sort_values(by='dist') mode = res.iloc[:,-2][:k].mode()[0] if mode == test_y[i]:
true_num += 1
# print(test_y) score = true_num / test.shape[0] print(score) return score # train_data = build_data("./trainingDigits")
# test_data = build_data("./testDigits")
#
# save_data("train_data",train_data)
# save_data("test_data",test_data) # 加载数据
train = load_data("./data/train_data.npy")
test = load_data("./data/test_data.npy") train = pd.DataFrame(train)
test = pd.DataFrame(test) # print(train)
# print("*"*80)
# print(test)
k_list = [5,6,7,8,9,10]
score_list = []
for k in k_list:
# score = knn_owns(train, test, k)
# score_list.append(score)
knn = KNeighborsClassifier(n_neighbors=k)
#训练数据
knn.fit(train.iloc[:,:-1].values,train.iloc[:,-1].values)
# 进行预测
y_predict = knn.predict(test.iloc[:,:-1].values) # 可以获取准确率
score = knn.score(test.iloc[:,:-1].values,test.iloc[:,-1].values) score_list.append(score)
print(score_list) #进行结果可视化
# 1、创建画布
plt.figure()
# 默认不支持中文,需要配置RC 参数
plt.rcParams['font.sans-serif']='SimHei'
# 设置字体之后不支持负号,需要去设置RC参数更改编码
plt.rcParams['axes.unicode_minus']=False
# 2、绘图
x = np.array(k_list)
y = np.array(score_list) plt.plot(x,y) plt.title("k与准确率的关系走势图")
plt.xlabel("k值")
plt.ylabel("准确率")
plt.savefig("./k值对准确率的影响.png")
# 3、展示 plt.show()
knn算法手写字识别案例的更多相关文章
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 用TensorFlow教你手写字识别
博主原文链接:用TensorFlow教你做手写字识别(准确率94.09%) 如需转载,请备注出处及链接,谢谢. 2012 年,Alex Krizhevsky, Geoff Hinton, and Il ...
- k最邻近算法——使用kNN进行手写识别
上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...
- 机器学习实战kNN之手写识别
kNN算法算是机器学习入门级绝佳的素材.书上是这样诠释的:“存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都有标签,即我们知道样本集中每一条数据与所属分类的对应关系.输入没有标签的新数据 ...
- python 实现 KNN 分类器——手写识别
1 算法概述 1.1 优劣 优点:进度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 应用:主要用于文本分类,相似推荐 适用数据范围:数值型和标称型 1.2 算法伪代码 (1)计 ...
- tensorflow卷积神经网络与手写字识别
1.知识点 """ 基础知识: 1.神经网络(neural networks)的基本组成包括输入层.隐藏层.输出层.而卷积神经网络的特点在于隐藏层分为卷积层和池化层(po ...
- k-近邻算法-手写识别系统
手写数字是32x32的黑白图像.为了能使用KNN分类器,我们需要把32x32的二进制图像转换为1x1024 1. 将图像转化为向量 from numpy import * # 导入科学计算包numpy ...
- tensorflow神经网络与单层手写字识别
1.知识点 """ 1.基础知识: 1.神经网络结构:1.输入层 2.隐含层 3.全连接层(类别个数=全连接层神经元个数)+softmax函数 4.输出层 2.逻辑回归: ...
- 基于PyTorch实现MNIST手写字识别
本篇不涉及模型原理,只是分享下代码.想要了解模型原理的可以去看网上很多大牛的博客. 目前代码实现了CNN和LSTM两个网络,整个代码分为四部分: Config:项目中涉及的参数: CNN:卷积神经网络 ...
随机推荐
- Mysql日期和字符的相互转换
今天从网上查到了一些关于MySQL数据库的日期转换函数的转换的用法,在这里记录一下: mysql日期和字符相互转换 date_format(date,'%Y-%m-%d') ------------- ...
- 【推荐系统】知乎live入门
参考链接: 知乎推荐系统live:姚凯飞推荐系统live 目录 1.推荐概览与框架 2.细节补充 3.召回 4.排序 5.常用技能与日常工作 5.用户画像-特征工程 6.相关经验 7.推荐考试拿分路径 ...
- [翻译]解释JavaScript中的类型转换
原文地址:JavaScript type coercion explained 类型转换是将值从一种类型转换为另一种类型的过程(比如字符串转换为数值,对象转换为布尔值,等等).任何类型,无论是原始类型 ...
- linux加大服务器文件描述符
最简单的说,在 unix/liux 里面,你的服务只要开启一个进程,就要占用文件描述符的.liunx 默认 是 1024,如果描述符少了,你的访问量多了,你的服务器支撑不了,所以要把描述符加大. #e ...
- django中collectstatic的使用
前言 我最近在琢磨django框架的使用,在上传个人网站服务器上时,再次遇到了找不到静态文件,css.img等样式全无的问题.于是沉下心来,好好研究了django的静态文件到底应该怎么去部署(depl ...
- HDU-6038 Function 思维+循环节
解法:这道题很有意思,值得一做和细细思考. 首先是我们要观察这个映射公式,他的实质是什么?其实就是b到a的循环映射,这是因为a数列和b数列都是0-n-1的排列,意味着每个数都是唯一的,那么ab的这个循 ...
- window 批处理脚本获取上级目录
1 SET CurrDir=%CD% CD.. SET InstPath=%CD% CD %CurrDir% 2 pushd.. set parent=%cd% popd 参考: https://ms ...
- substring c# js java
c# String.SubString(int index,int length) String.SubString(int start) 等效于 javascript stringObject.su ...
- uboot学习之五-----uboot如何启动Linux内核
uboot和内核到底是什么?uboot实质就是一个复杂的裸机程序:uboot可以被配置也可以做移植: 操作系统内核本身就是一个裸机程序,和我们学的uboot和其他裸机程序没有本质的区别:区别就是我们操 ...
- Thread类与Runnable接口
Runnable 先看看源码中对Runnable的声明 @FunctionalInterface public interface Runnable { /** * When an object im ...