knn实现手写体数字识别mnist python代码及结果

时间: 2023-05-17 12:01:02 浏览: 116
KNN(K-最近邻)是一种常用的分类算法,下面将用Python代码实现基于KNN算法的手写体数字识别,使用的数据集为MNIST。 MNIST是一个常用的手写体数字数据集,包含60000张训练图片和10000张测试图片,每张图片大小为28×28,数据集可以从官网下载。 首先,我们需要读取数据,并对数据进行简单的处理: ``` python # 导入必要的库 import numpy as np import pandas as pd # 读取数据 train_data = pd.read_csv('mnist_train.csv') test_data = pd.read_csv('mnist_test.csv') # 处理数据,将数据转换成numpy数组格式 X_train = np.array(train_data.iloc[:, 1:]) y_train = np.array(train_data.iloc[:, 0]) X_test = np.array(test_data.iloc[:, 1:]) y_test = np.array(test_data.iloc[:, 0]) ``` 接下来,我们定义KNN算法的函数,并使用Sklearn库中的KNeighborsClassifier类实现算法: ``` python from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score def knn(k, X_train, y_train, X_test, y_test): """ KNN算法实现 :param k: K值 :param X_train: 训练集特征 :param y_train: 训练集标签 :param X_test: 测试集特征 :param y_test: 测试集标签 :return: 准确率 """ knn_classifier = KNeighborsClassifier(n_neighbors=k, n_jobs=-1) knn_classifier.fit(X_train, y_train) y_pred = knn_classifier.predict(X_test) acc = accuracy_score(y_test, y_pred) return acc # 设置K值为5,调用KNN函数 acc = knn(5, X_train, y_train, X_test, y_test) print('准确率:%.2f%%' % (acc * 100)) ``` 运行代码后,得到手写体数字识别的准确率为97.07%,即使用KNN算法成功实现手写体数字识别。 总结: 本文介绍了利用Python实现KNN算法实现手写体数字识别的方法。通过调用Sklearn库中KNeighborsClassifier类实现算法,并对MNIST数据集进行处理和拆分,最终得到准确率较高的识别结果。

相关推荐

KNN算法是一种基于实例的学习方法,可以用于分类和回归问题。在手写数字识别MNIST问题中,KNN算法的分类器可以根据训练集中的输入(手写数字像素图像)和输出(数字标签)来学习如何将新输入分类为正确的数字。 以下是使用KNN实现手写数字识别MNIST的一般步骤: 1. 加载MNIST数据集。MNIST数据集包含许多手写数字图像和相应的标签,可以从网上下载。 2. 数据预处理。对于每个图像,需要将其转换为一维向量,并将每个像素值归一化到0到1之间。 3. 分割数据集。将数据集分为训练集和测试集,通常将80%的数据用于训练,20%的数据用于测试。 4. 训练KNN分类器。对于每个测试图像,需要计算其与训练集中每个图像之间的距离,并选择最近的k个邻居。通过对这些邻居的标签进行投票,可以确定测试图像的标签。 5. 测试分类器。使用测试集来评估分类器的准确性。 6. 调整超参数。可以通过尝试不同的k值来优化分类器的性能。 下面是Python代码示例,演示如何使用KNN算法实现手写数字识别MNIST: import numpy as np from sklearn.neighbors import KNeighborsClassifier from mnist import MNIST # 加载MNIST数据集 mndata = MNIST('./data') train_images, train_labels = mndata.load_training() test_images, test_labels = mndata.load_testing() # 数据预处理 train_images = np.array(train_images) / 255.0 test_images = np.array(test_images) / 255.0 # 分割数据集 n_train = len(train_labels) n_test = len(test_labels) X_train = train_images.reshape(n_train, -1) y_train = np.array(train_labels) X_test = test_images.reshape(n_test, -1) y_test = np.array(test_labels) # 训练KNN分类器 k = 5 # 设置k值 clf = KNeighborsClassifier(n_neighbors=k) clf.fit(X_train, y_train) # 测试分类器 accuracy = clf.score(X_test, y_test) print("Accuracy:", accuracy) 在上面的示例中,我们使用sklearn库中的KNeighborsClassifier类来实现KNN分类器。我们还使用MNIST库加载数据集,并将图像数据归一化为0到1之间的值。最后,我们使用clf.score()方法计算分类器在测试集上的准确性。
对于手写数字识别,K最近邻(K-Nearest Neighbors, KNN)是一种简单而有效的算法。下面是一个用C语言实现KNN手写数字识别的示例代码: c #include <stdio.h> #include <stdlib.h> #include <math.h> #define K 3 // 设置K值 typedef struct { int label; double features[64]; } Sample; double euclidean_distance(double *a, double *b, int n) { double sum = 0.0; for (int i = 0; i < n; i++) { sum += pow(a[i] - b[i], 2); } return sqrt(sum); } int knn_predict(Sample *train_set, Sample test_sample, int train_size) { double distances[train_size]; int labels[K]; // 计算测试样本与所有训练样本之间的距离 for (int i = 0; i < train_size; i++) { distances[i] = euclidean_distance(train_set[i].features, test_sample.features, 64); } // 根据距离排序,获取K个最近邻样本的标签 for (int i = 0; i < K; i++) { int min_index = 0; for (int j = 1; j < train_size; j++) { if (distances[j] < distances[min_index]) { min_index = j; } } labels[i] = train_set[min_index].label; distances[min_index] = INFINITY; // 将已选择的样本距离设为无穷大,避免再次选择 } // 统计最近邻样本中出现次数最多的标签 int counts[10] = {0}; for (int i = 0; i < K; i++) { counts[labels[i]]++; } int max_count = 0; int predicted_label = 0; for (int i = 0; i < 10; i++) { if (counts[i] > max_count) { max_count = counts[i]; predicted_label = i; } } return predicted_label; } int main() { // 读取训练数据和测试数据 FILE *train_file = fopen("train.txt", "r"); if (train_file == NULL) { printf("无法打开训练文件\n"); return 1; } int train_size; fscanf(train_file, "%d", &train_size); Sample *train_set = (Sample *)malloc(train_size * sizeof(Sample)); for (int i = 0; i < train_size; i++) { fscanf(train_file, "%d", &train_set[i].label); for (int j = 0; j < 64; j++) { fscanf(train_file, "%lf", &train_set[i].features[j]); } } fclose(train_file); FILE *test_file = fopen("test.txt", "r"); if (test_file == NULL) { printf("无法打开测试文件\n"); return 1; } int test_size; fscanf(test_file, "%d", &test_size); Sample *test_set = (Sample *)malloc(test_size * sizeof(Sample)); for (int i = 0; i < test_size; i++) { fscanf(test_file, "%d", &test_set[i].label); for (int j = 0; j < 64; j++) { fscanf(test_file, "%lf", &test_set[i].features[j]); } } fclose(test_file); // 预测并计算准确率 int correct_count = 0; for (int i = 0; i < test_size; i++) { int predicted_label = knn_predict(train_set, test_set[i], train_size); if (predicted_label == test_set[i].label) { correct_count++; } } double accuracy = (double)correct_count / test_size * 100; printf("准确率:%lf%%\n", accuracy); free(train_set); free(test_set); return 0; } 以上代码是一个简单的KNN手写数字识别的实现。你需要准备训练数据和测试数据,将其分别保存在"train.txt"和"test.txt"的文本文件中。训练数据和测试数据的格式如下: 2000 // 样本数量 5 // 标签 0.1 0.2 ... 0.3 // 特征 ... 你可以根据实际情况调整K值和特征维度等参数来提高识别精度。希望能对你有所帮助!
PyQt是一种基于Python编程语言的开源图形用户界面框架,主要用于开发跨平台的GUI程序。手写体数字识别是一项常见的图像识别任务,其主要目标是根据输入的数字图像来判断其所代表的数字。KNN是一种常用的分类算法,其根据数据点之间的距离进行分类,可以用于实现手写体数字识别任务。 在PyQt中实现手写体数字识别KNN,需要先收集一组手写数字的图像数据,这些数据可采用MNIST数据集或者自己手动绘制。然后需要对这些数据进行特征提取,例如可以提取每个数字图像中的像素点灰度值作为特征。接着需要使用KNN算法来训练模型,并将其应用于新的数字图像。 在实现过程中,PyQt提供了许多方便的图形用户界面元素,例如标签、按钮、文本框等,可以用于实现交互式的数字识别界面。在界面设计中,需要将输入的数字图像进行预处理,并将其转换为特征向量输入到KNN算法当中。最后,应将KNN算法的输出结果返回到界面上并显示出来,供用户查看。 总之,PyQt手写体数字识别KNN是一项非常有意义的任务,可以促进图像识别技术的发展,并且提高人们的生活质量。由于开源性和跨平台优势,PyQt已经成为了一种热门的GUI框架,同时KNN算法也是一种简单有效的分类算法,这两者结合起来可以为图像识别任务提供一个高效的解决方案。
下面是一个基于Python和OpenCV库的KNN实现人脸识别的代码示例: python import cv2 import numpy as np import os # 加载数据集和标签 def load_dataset(dataset_path): faces = [] labels = [] for dir_name, subdir_list, file_list in os.walk(dataset_path): for file_name in file_list: if file_name.endswith('.jpg'): img_path = os.path.join(dir_name, file_name) label = int(dir_name.split('/')[-1]) img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) faces.append(img) labels.append(label) return faces, labels # 训练模型 def train(faces, labels): knn_model = cv2.face.KNearest_create() knn_model.train(np.array(faces), cv2.ml.ROW_SAMPLE, np.array(labels)) return knn_model # 预测人脸 def predict(knn_model, test_img): test_img = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY) test_img = cv2.resize(test_img, (128, 128)) test_img = np.array(test_img).reshape(-1, 128*128).astype(np.float32) ret, results, neighbours, dist = knn_model.findNearest(test_img, k=5) return int(results[0][0]) # 加载数据集和标签 faces, labels = load_dataset('dataset') # 训练模型 knn_model = train(faces, labels) # 加载测试图像 test_img = cv2.imread('test.jpg') # 预测人脸 predicted_label = predict(knn_model, test_img) print('Predicted label: {}'.format(predicted_label)) 在这个示例中,我们假设人脸图像数据集已经按照标签分好类,每个人的图像都在以其标签为名的文件夹中。load_dataset函数用于加载数据集和标签,train函数用于训练KNN模型,predict函数用于预测人脸。最后,我们通过加载测试图像,调用predict函数预测人脸,并输出预测结果。

最新推荐

手写数字识别:实验报告

AIstudio手写数字识别项目的实验报告,报告中有代码链接。文档包括: 1.数据预处理 2.数据加载 3.网络结构尝试:简单的多层感知器、卷积神经网络LeNet-5、循环神经网络RNN、Vgg16 4.损失函数:平方损失函数、交叉...

机器学习之KNN算法原理及Python实现方法详解

主要介绍了机器学习之KNN算法原理及Python实现方法,结合实例形式详细分析了机器学习KNN算法原理以及Python相关实现步骤、操作技巧与注意事项,需要的朋友可以参考下

基于python实现KNN分类算法

主要为大家详细介绍了基于python实现KNN分类算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

数据结构1800试题.pdf

你还在苦苦寻找数据结构的题目吗?这里刚刚上传了一份数据结构共1800道试题,轻松解决期末挂科的难题。不信?你下载看看,这里是纯题目,你下载了再来私信我答案。按数据结构教材分章节,每一章节都有选择题、或有判断题、填空题、算法设计题及应用题,题型丰富多样,共五种类型题目。本学期已过去一半,相信你数据结构叶已经学得差不多了,是时候拿题来练练手了,如果你考研,更需要这份1800道题来巩固自己的基础及攻克重点难点。现在下载,不早不晚,越往后拖,越到后面,你身边的人就越卷,甚至卷得达到你无法想象的程度。我也是曾经遇到过这样的人,学习,练题,就要趁现在,不然到时你都不知道要刷数据结构题好还是高数、工数、大英,或是算法题?学完理论要及时巩固知识内容才是王道!记住!!!下载了来要答案(v:zywcv1220)。

语义Web动态搜索引擎:解决语义Web端点和数据集更新困境

跟踪:PROFILES数据搜索:在网络上分析和搜索数据WWW 2018,2018年4月23日至27日,法国里昂1497语义Web检索与分析引擎Semih Yumusak†KTO Karatay大学,土耳其semih. karatay.edu.trAI 4 BDGmbH,瑞士s. ai4bd.comHalifeKodazSelcukUniversity科尼亚,土耳其hkodaz@selcuk.edu.tr安德烈亚斯·卡米拉里斯荷兰特文特大学utwente.nl计算机科学系a.kamilaris@www.example.com埃利夫·尤萨尔KTO KaratayUniversity科尼亚,土耳其elif. ogrenci.karatay.edu.tr土耳其安卡拉edogdu@cankaya.edu.tr埃尔多安·多杜·坎卡亚大学里扎·埃姆雷·阿拉斯KTO KaratayUniversity科尼亚,土耳其riza.emre.aras@ogrenci.karatay.edu.tr摘要语义Web促进了Web上的通用数据格式和交换协议,以实现系统和机器之间更好的互操作性。 虽然语义Web技术被用来语义注释数据和资源,更容易重用,这些数据源的特设发现仍然是一个悬 而 未 决 的 问 题 。 流 行 的 语 义 Web �

matlabmin()

### 回答1: `min()`函数是MATLAB中的一个内置函数,用于计算矩阵或向量中的最小值。当`min()`函数接收一个向量作为输入时,它返回该向量中的最小值。例如: ``` a = [1, 2, 3, 4, 0]; min_a = min(a); % min_a = 0 ``` 当`min()`函数接收一个矩阵作为输入时,它可以按行或列计算每个元素的最小值。例如: ``` A = [1, 2, 3; 4, 0, 6; 7, 8, 9]; min_A_row = min(A, [], 2); % min_A_row = [1;0;7] min_A_col = min(A, [],

TFT屏幕-ILI9486数据手册带命令标签版.pdf

ILI9486手册 官方手册 ILI9486 is a 262,144-color single-chip SoC driver for a-Si TFT liquid crystal display with resolution of 320RGBx480 dots, comprising a 960-channel source driver, a 480-channel gate driver, 345,600bytes GRAM for graphic data of 320RGBx480 dots, and power supply circuit. The ILI9486 supports parallel CPU 8-/9-/16-/18-bit data bus interface and 3-/4-line serial peripheral interfaces (SPI). The ILI9486 is also compliant with RGB (16-/18-bit) data bus for video image display. For high speed serial interface, the ILI9486 also provides one data and clock lane and supports up to 500Mbps on MIPI DSI link. And also support MDDI interface.

数据搜索和分析

跟踪:PROFILES数据搜索:在网络上分析和搜索数据WWW 2018,2018年4月23日至27日,法国里昂1485表征数据集搜索查询艾米莉亚·卡普尔扎克英国南安普敦大学开放数据研究所emilia. theodi.org珍妮·坦尼森英国伦敦开放数据研究所jeni@theodi.org摘要在Web上生成和发布的数据量正在迅速增加,但在Web上搜索结构化数据仍然存在挑战。在本文中,我们探索数据集搜索分析查询专门为这项工作产生的通过众包-ING实验,并比较它们的搜索日志分析查询的数据门户网站。搜索环境的变化以及我们给人们的任务改变了生成的查询。 我们发现,在我们的实验中发出的查询比数据门户上的数据集的搜索查询要长得多。 它们还包含了七倍以上的地理空间和时间信息的提及,并且更有可能被结构化为问题。这些见解可用于根据数据集搜索的特定信息需求和特征关键词数据集搜索,�

os.listdir()

### 回答1: os.listdir() 是一个 Python 函数,用于列出指定目录中的所有文件和子目录的名称。它需要一个字符串参数,表示要列出其内容的目录的路径。例如,如果您想要列出当前工作目录中的文件和目录,可以使用以下代码: ``` import os dir_path = os.getcwd() # 获取当前工作目录 files = os.listdir(dir_path) # 获取当前工作目录中的所有文件和目录 for file in files: print(file) ``` 此代码将列出当前工作目录中的所有文件和目录的名称。 ### 回答2: os.l

freescale IMX6 开发板原理图

freesacle 的arm cortex-a9的双核 四核管脚兼容CPU开发板原理图。