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日

相关文章

  • pytorch中函数tensor.numpy()的数据类型解析

    PyTorch是一个开源的机器学习框架,其中的Tensor是其核心数据类型。Tensor由数据及其相关的操作方法构成,可以理解为多维数组。在Tensor中,我们往往需要对数据进行操作和分析,而函数tensor.numpy()就是将Tensor数据类型转换为numpy的多维数组数据类型。 使用tensor.numpy()函数的步骤 使用tensor.numpy…

    python 2023年6月3日
    00
  • 提高python代码运行效率的一些建议

    我来为您详细讲解提高Python代码运行效率的一些建议。 1.使用合适的数据类型 选择合适的数据类型可以明显提高程序的运行效率。比如说,使用列表储存大量数据时,每次进行搜索或者插入时,都需要遍历整个列表。但如果使用集合或字典来替代列表,搜索和插入的效率会明显提高。 例如,我们有一个列表,里面存储了10000个元素,需要不断查找一个特定元素的索引位置,可以使用…

    python 2023年6月6日
    00
  • 详解Python合并两个图元

    下面是Python程序合并两个图元的完整攻略。 1. 准备工作 在开始前,我们需要先安装好Python的绘图库,推荐使用matplotlib。以及掌握基本的Python编程知识和语法。如果您还不熟悉这些,可以先去学习一下。 2. 合并两个图元 将两个图元合并起来,需要用到matplotlib中的add_patch函数。add_patch函数是用来添加图形对象…

    python-answer 2023年3月25日
    00
  • Python calendar模块详情

    Python calendar模块是一个处理日期的标准库,它可以帮助我们快速地生成各种格式的日历,主要包括以下几个函数: calendar模块的函数 calendar.calendar(year, w=2, l=1, c=6) year:要显示的年份; w:每个日期之间的空格宽度,默认为2; l:每周所占的行数,默认为1; c:每月之间的间隔字符数,默认为6…

    python 2023年5月14日
    00
  • Python爬虫图片懒加载技术 selenium和PhantomJS解析

    Python爬虫图片懒加载技术 selenium和PhantomJS解析 本文将介绍如何利用Python爬虫对使用懒加载技术的网页上的图片进行爬取。在这里我将使用selenium和PhantomJS解析器作为我们工具。其中selenium是一个流行的Web自动化测试框架,可以模拟用户在浏览器上的各种操作,而PhantomJS是一个无界面的,基于WebKit的…

    python 2023年5月14日
    00
  • Python免费试用最新Openai API的步骤

    以下是Python免费试用最新Openai API的步骤详解: 1. 注册Openai账号并获取API key 1.1 打开 https://beta.openai.com/signup/ 进入Openai注册页面;1.2 在注册页面填写信息并完成注册;1.3 注册成功后,进入Dashboard(仪表盘)页面,生成API key。 2. 安装Openai A…

    python 2023年5月18日
    00
  • Python for Informatics 第11章之正则表达式(四)

    以下是“PythonforInformatics第11章之正则表达式(四)”的完整攻略: 一、问题描述 在PythonforInformatics第11章中,我们学习了如何使用Python的re模块进行正则表达式匹配。本文将详细讲解PythonforInformatics第11章之正则表达式(四),并提供两个示例说明。 二、解决方案 2.1 re模块中的su…

    python 2023年5月14日
    00
  • 跟老齐学Python之list和str比较

    跟老齐学Python之list和str比较 在Python中,list和str是两种常见的数据类型。虽然它们都可以存储多个元素,但是它们之间还是有很大区别的。本文将详细讲解list和str的比较,包括定义、操作、转换等方面的内容,并给出两个示例说明。 定义 list和str的定义方式不同。list使用方括号[]来定义,元素之间用逗号隔开。例如: my_lis…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部