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

现在我来为你讲解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单体模式的几种常见实现方法详解

    Python单例模式的几种常见实现方法详解 在 Python 编程中,单例模式是一种常用的设计模式。这种模式的主要目的是确保在一个进程中只有一个特定类的实例,且该实例易于全局访问。 本攻略将详细介绍 Python 单例模式的几种常见实现方法,包括: 基于模块实现单例模式 基于元类实现单例模式 基于装饰器实现单例模式 基于__new__方法实现单例模式 下面将…

    python 2023年5月19日
    00
  • python实现灰度图

    下面是 python 实现灰度图的完整攻略。 什么是灰度图 灰度图是一种黑白图像,其中所有像素点只有一个亮度值,没有颜色信息。亮度值通常在 0 到 255 之间取值,其中 0 表示黑色,255 表示白色。 实现灰度图的方法 方法一:使用 PIL 库 PIL(Python Imaging Library)是 Python 中常用的图像处理库,可以用于图像读取、…

    python 2023年5月18日
    00
  • 详解Python中的四种队列

    在Python中,队列是一种常用的数据结构,它可以用于实现多线程、异步编程等场景。Python中常用的队列有四种,分别是queue.Queue、queue.LifoQueue、queue.PriorityQueue和asyncio.Queue。本文将详细介绍这四种队列的特点、用法和示例。 queue.Queue queue.Queue是Python标准库中提…

    python 2023年5月13日
    00
  • python操作toml文件的示例代码

    当需要在Python程序中处理TOML文件时,可以使用PyTOML库。本文将介绍如何使用PyTOML库来读写TOML文件。 安装PyTOML库 在开始之前,需要确保已安装PyTOML库。可以使用pip安装: pip install pytoml 读取TOML文件 以下代码演示了如何在Python中读取一个TOML文件: import toml with op…

    python 2023年6月2日
    00
  • Python 扩展简单循环

    要在Python中使用扩展简单循环,可以使用for循环语句。在for循环中,我们可以遍历一些可迭代对象的元素,例如列表、元组、字符串、集合等,并执行特定的操作。 在Python中,我们可以使用range函数来生成一个连续的数字序列,然后使用for循环进行迭代。range函数的使用格式为:range(start,stop,step),其中start是起始数字,…

    python-answer 2023年3月25日
    00
  • Python中TypeError:unhashable type:’dict’错误的解决办法

    当我们在使用Python进行开发时,有时候会遇到 “TypeError:unhashabletype:’dict’” 错误,这个错误一般是由于我们将一个字典作为某些操作函数的输入参数,并将这个字典作为空间的 key 进行 hash 计算导致的。下面我将为大家介绍解决这个错误的方法。 1. 错误原因 在 Python 中,一般而言我们需要将某些函数的输入数据进…

    python 2023年5月13日
    00
  • python教程之利用pyautogui图形自动化击败重复性办公任务

    接下来我将为您详细讲解“Python教程之利用PyAutoGUI图形自动化击败重复性办公任务”的完整攻略。 1. 概述 PyAutoGUI是一个Python第三方库,用于通过鼠标和键盘模拟实现GUI操作。利用PyAutoGUI可以高效地进行重复性办公任务的自动化操作。本文将介绍如何使用PyAutoGUI来实现图形自动化击败重复性办公任务。 2. 安装 在执行…

    python 2023年5月19日
    00
  • Python numpy.broadcast_to()函数

    以下是Python numpy.broadcast_to()函数的详细攻略。 numpy.broadcast_to() 函数 numpy.broadcast_to() 函数将数组广播到新形状。它在原始数组上返回只读视图,不改变原始数组。 语法 numpy.broadcast_to(array, shape, subok=False) 参数说明 array:要…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部