python实现kNN算法识别手写体数字的示例代码

yizhihongxing

现在我来为你讲解Python实现kNN算法识别手写体数字的示例代码的完整攻略。本文主要包含以下几个部分:

  1. kNN算法简介
  2. 数据集介绍
  3. 实现过程
  4. 示例说明
  5. 总结

1. kNN算法简介

kNN算法是一种基于距离度量进行分类的机器学习算法。其全称为k-Nearest Neighbor(k近邻)算法。kNN算法的核心思想是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

2. 数据集介绍

kNN算法的一个重要应用就是手写数字识别。在本示例中,我们使用UCI机器学习库中的手写数字数据集,该数据集包含训练集和测试集,每个样本都是一个28*28的灰度图像,共有10个类别(数字0-9)。

3. 实现过程

下面我们将详细介绍Python实现kNN算法识别手写体数字的代码实现过程。

3.1 加载数据集

首先,我们需要从文件中加载训练集和测试集,并将它们解析成矩阵形式。这里我们使用numpy库来实现:

import numpy as np

def load_data(filename):
    data = np.loadtxt(filename, delimiter=',')
    X = data[:, 1:]  # 特征矩阵(去掉标签列)
    y = data[:, 0]  # 标签列
    return X, y

X_train, y_train = load_data('train.csv')
X_test, y_test = load_data('test.csv')

3.2 特征归一化

为了确保不同特征对分类结果的影响程度相同,我们需要对特征进行归一化处理。这里我们采用z-score标准化方法:

def standardize(X_train, X_test):
    mu = np.mean(X_train, axis=0)   # 计算每个特征的均值
    sigma = np.std(X_train, axis=0) # 计算每个特征的标准差
    X_train = (X_train - mu) / sigma
    X_test = (X_test - mu) / sigma
    return X_train, X_test

X_train, X_test = standardize(X_train, X_test)

3.3 kNN算法实现

接下来,我们需要实现kNN算法。这里我们采用欧几里得距离作为距离度量:

def euclidean_distance(x1, x2):
    return np.sqrt(np.sum((x1 - x2)**2))

class kNN:

    def __init__(self, k=3):
        self.k = k

    def fit(self, X, y):
        self.X_train = X
        self.y_train = y

    def predict(self, X):
        y_pred = np.zeros(X.shape[0])
        for i, X_test in enumerate(X):
            # 计算测试样本到每个训练样本的距离
            distances = [euclidean_distance(X_test, x) for x in self.X_train]
            # 获取距离最近的k个样本的标签
            k_idx = np.argsort(distances)[:self.k]
            k_labels = [self.y_train[idx] for idx in k_idx]
            # 从k个样本中选择出现频率最高的类别作为预测结果
            class_counts = np.bincount(k_labels)
            y_pred[i] = np.argmax(class_counts)
        return y_pred

3.4 模型训练与测试

最后,我们可以使用以上代码实现kNN算法对手写数字数据集进行训练和测试:

knn = kNN(k=3)
knn.fit(X_train, y_train)

y_pred = knn.predict(X_test)
accuracy = np.mean(y_pred == y_test)

print('Accuracy:', accuracy)

4. 示例说明

接下来,我们将展示两个实际例子,帮助读者更好地理解kNN算法在手写数字识别中的应用。

4.1 示例1:识别单个手写数字图片

首先,我们加载一张手写数字的图片,对其进行灰度化处理并将其转换成矩阵形式。假设我们加载的图片为数字2,代码如下:

import cv2

img = cv2.imread('two.png', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (28, 28))
X_single = np.array(img).flatten()

然后,我们可以使用训练好的kNN模型对该图片进行预测:

y_single_pred = knn.predict([X_single])[0]
print('Predict:', y_single_pred)

4.2 示例2:可视化kNN算法分类效果

其次,为了更直观地了解kNN算法的分类效果,我们可以将训练集和测试集中的一些样本以及它们的真实标签和预测标签可视化出来。代码如下:

import matplotlib.pyplot as plt

def plot_digits(X, y, preds=None):
    X = X.reshape(-1, 28, 28)
    fig, axs = plt.subplots(nrows=4, ncols=10, sharex=True, sharey=True)
    axs = axs.flatten()

    for i in range(40):
        img = X[i]
        if preds is None:
            axs[i].title.set_text('True:{0}'.format(int(y[i])))
        else:
            axs[i].title.set_text('True:{0}, Pred:{1}'.format(int(y[i]), int(preds[i])))
        axs[i].imshow(img, cmap='Greys', interpolation='nearest')

    plt.show()

plot_digits(X_test[:40], y_test[:40], y_pred[:40])

5. 总结

本文详细介绍了Python实现kNN算法识别手写体数字的示例代码的完整攻略,包括数据集介绍、特征归一化、kNN算法实现、模型训练与测试等。通过实际的例子,我们展示了如何使用训练好的kNN模型对单个手写数字图片进行识别,并且将分类效果可视化出来。希望读者可以通过这篇文章更好地了解kNN算法在手写数字识别中的应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现kNN算法识别手写体数字的示例代码 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • python爬虫入门教程–快速理解HTTP协议(一)

    Python爬虫入门教程–快速理解HTTP协议(一) 本文将介绍HTTP协议的基本概念、请求方法、状态码等内容,并提供两个示例来说明HTTP协议的使用。 HTTP协议的基本概念 HTTP(HyperText Transfer Protocol)是一种用于传输超文本的协议。它是Web应用程序的基础也是互联网的基础。HTTP协议使用客户端-服务器模型,客户端向…

    python 2023年5月14日
    00
  • Django分页功能的实现代码详解

    Django是一个流行的Python Web框架,提供了丰富的功能和工具,包括分页功能。分页功能可以将大量数据分成多个页面,以提高用户体验和性能。以下是Django分页功能的实现代码详解: 1. 安装Django 在使用Django分页功能之前,需要先安装Django。可以使用以下命令在命令行中安装Django: pip install django 2. …

    python 2023年5月15日
    00
  • 在Python中使用defaultdict初始化字典以及应用方法

    要使用Python中的defaultdict,需要先从collections模块导入该类。其中,defaultdict是一种特殊的字典,它比Python内置的dict字典有更多的功能和特性。defaultdict可以在创建一个字典的时候指定默认值(default value)的类型和值,当访问字典中不存在的键时,defaultdict会自动返回默认值,而不会…

    python 2023年5月13日
    00
  • Python – 检查列表中的重复项并将重复项添加在一起以使用总和值更新列表

    【问题标题】:Python – Checking duplicates in a list and adding duplicates together to update the list with the summed valuePython – 检查列表中的重复项并将重复项添加在一起以使用总和值更新列表 【发布时间】:2023-04-07 00:10:…

    Python开发 2023年4月7日
    00
  • Python BeautifulSoup中文乱码问题的2种解决方法

    Python BeautifulSoup中文乱码问题的2种解决方法 在使用Python的BeautifulSoup库解析中文网页时,可能会遇到中文乱码问题。本文将介绍两种解决方法。 方法一:指定编码方式 在使用BeautifulSoup解析HTML文档时,可以指定编码方式。以下是一个示例代码,演示如何指定编码方式: from bs4 import Beaut…

    python 2023年5月15日
    00
  • python的列表List求均值和中位数实例

    Python列表(List)求均值和中位数实例 在Python中,列表(List)是一种常用的数据类型,它可以存储多个元素,并且这些元素可以是不同的数据类型。本文将详细讲解Python中列表(List)求均值和中位数的实现方法,包括使用内置函数和手动计算两种方法。 方法一:使用内置函数 Python中有内置函数可以用于计算列表的均值和中位数,分别是mean(…

    python 2023年5月12日
    00
  • Python if else语句嵌套实例说明

    在Python中,if语句可以嵌套,这允许您编写更复杂的条件语句。if语句的嵌套语法与其他编程语言非常相似,即在一个if语句块内嵌套另一个if语句块。 以下是一个示例: age = 20 if age > 18: print("成年人") if age > 21: print("可以购买酒精饮料") eli…

    2023年2月15日
    00
  • 在 Python 中,如何最有效地将 UTF-8 字符串分块以进行 REST 传递?

    【问题标题】:In Python, how do I most efficiently chunk a UTF-8 string for REST delivery?在 Python 中,如何最有效地将 UTF-8 字符串分块以进行 REST 传递? 【发布时间】:2023-04-04 03:14:01 【问题描述】: 首先我会说我有点理解“UTF-8”编码…

    Python开发 2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部