基于KPCA的手写数字降维与分类识别 1.作者介绍李至屹男西安工程大学电子信息学院2025级研究生研究方向FPGA嵌入式系统设计电子邮件2274511087qq.com郭政男西安工程大学电子信息学院2025级研究生张宏伟人工智能课题组研究方向机器视觉与人工智能电子邮件1225301905qq.com2.算法介绍2.1 KPCA算法介绍KPCAKernel Principal Component Analysis核主成分分析是一种非线性降维方法通过核函数将原始数据映射到高维特征空间实现非线性主成分提取。它也是PCA的非线性扩展核心是用核技巧把数据隐式映射到高维空间再在该空间做线性PCA从而处理PCA无法解决的非线性降维问题。以本实验为例KPCA可用于手写数字数据降维保留主要特征降低噪声影响降维之后结合分类器本项目使用SVM实现数字分类识别。2.2 KPCA算法原理分析原理图从784个像素点到二维降维空间说明本实验使用MNIST手写数字数据集MNIST图像大小为28×28每张图像由784个像素点组成。每个像素点可以看作原始空间中的一个维度因此每张图像可以看作是一个784维的向量不是784个样本。我们将所有样本在784维空间中进行KPCA非线性映射并降维到二维空间进行可视化演示。关键点1.原始空间维度是 784 维每个像素点一个维度。2.每张图像是一个 784 维向量不是 784 个样本。3.KPCA 通过核映射捕捉非线性结构将数据映射到高维特征空间再进行线性降维。4.最终在2维空间中可视化展示。该原理图中通过非线性核函数映射后数据被压缩到二维空间不同数字类别开始分离这样就便于可视化和分类。核函数示意图RBF核将数据映射到高维该图中显示二维数据经过RBF核映射到曲面高维空间数据点可以通过线性超平面分开,使线性不可分的问题在高维空间中变得线性可分。KPCA的工作流程主要包括数据准备核矩阵构建中心化特征值分解选择主成分投影降维模型训练和预测评估下面是其工作流程图3.数据集介绍与实验环境3.1 数据集介绍前面提到本实验使用MNIST手写数字数据集该数据集是计算机视觉领域中最经典、最常用的基准数据集之一由美国国家标准与技术研究院NIST改进整理而成。该数据集由60000个训练样本和10000个测试样本组成每个样本为28×28像素的灰度图像像素取值范围为 0~255。数据集特点共包含 10 个数字类别0-9。图像为灰度图像单通道无彩色信息。数字书写风格多样包含不同书写人、不同笔画粗细和倾斜程度。数据集用途广泛用于数字识别、降维、分类等机器学习与深度学习任务。适合作为降维方法如 KPCA效果评估与方法对比的基准数据集。对应数据集下载地址https://www.openml.org/d/554?utm_sourcechatgpt.com下面是该数据集的部分样本展示注每行代表一个数字类别0-9展示该类别的部分样本示例3.2 实验环境本实验采用的软件环境Windows 11操作系统Python 3.10VSCode 开发环境Anaconda 虚拟环境管理本实验需要安装的依赖库PyTorch模型训练NumPy数值计算Matplotlib数据可视化Scikit-learn机器学习Pandas数据处理其中NumPy用于矩阵与数值运算Matplotlib用于数据可视化Scikit-learn主要用于KPCA与SVM实现Pandas用于数据读取与处理。4.代码实现本实验完整代码及流程注释如下所示# 1. 导入相关库import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import fetch_openmlfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.decomposition import KernelPCAfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_scorefrom sklearn.metrics import confusion_matrixfrom sklearn.metrics import ConfusionMatrixDisplay# 2. 加载MNIST数据集mnist fetch_openml(mnist_784,version1,parserauto)# 3. 只取部分数据优化# 只取前5000个样本X mnist.data[:5000]y mnist.target[:5000].astype(int)print(数据加载完成)print(数据维度:, X.shape)print(标签维度:, y.shape)# 4. 数据归一化# 像素归一化X X / 255.0# 标准化scaler StandardScaler()X scaler.fit_transform(X)print(归一化完成)# 5. 展示部分手写数字样本fig, axes plt.subplots(2, 5, figsize(10, 5))for i, ax in enumerate(axes.flat):image X[i].reshape(28, 28)ax.imshow(image, cmapgray)ax.set_title(fLabel: {y[i]})ax.axis(off)plt.suptitle(MNIST Handwritten Digits)plt.tight_layout()plt.show()# 6. 划分训练集和测试集X_train, X_test, y_train, y_test train_test_split(X,y,test_size0.2,random_state42)print(训练集大小:, X_train.shape)print(测试集大小:, X_test.shape)# 7. KPCA降维kpca KernelPCA(n_components50, # 主成分数量kernelrbf, # RBF核gamma0.003, # 核参数eigen_solverrandomized # 随机SVD)# 训练集降维X_train_kpca kpca.fit_transform(X_train)# 测试集降维X_test_kpca kpca.transform(X_test)print(KPCA降维完成)print(降维后训练集维度:, X_train_kpca.shape)# 8. KPCA结果可视化plt.figure(figsize(10, 8))scatter plt.scatter(X_train_kpca[:, 0],X_train_kpca[:, 1],cy_train,cmaptab10,s10)plt.colorbar(scatter)plt.title(KPCA Dimensionality Reduction Visualization)plt.xlabel(Principal Component 1)plt.ylabel(Principal Component 2)plt.grid(True)plt.show()# 9. SVM分类器训练svm SVC(kernelrbf,C5)svm.fit(X_train_kpca, y_train)print(SVM训练完成)# 10. 模型预测y_pred svm.predict(X_test_kpca)# 11. 分类准确率accuracy accuracy_score(y_test, y_pred)print(f分类准确率: {accuracy * 100:.2f}%)# 12. 混淆矩阵print(\n绘制混淆矩阵...)cm confusion_matrix(y_test, y_pred)disp ConfusionMatrixDisplay(confusion_matrixcm)fig, ax plt.subplots(figsize(10, 10))disp.plot(axax)plt.title(MNIST Classification Confusion Matrix)plt.show()# 13. 程序结束print(程序运行结束)运行结果1.在终端会输出最终的分类准确率用于衡量算法的分类识别性能。对应代码及运行结果如下图所示2.生成手写数字样本图用于展示MNIST数据集数字图片。3.生成KPCA降维可视化图该图片为二维散点图用于展示不同数字类别在二维空间中的分布。4.最后绘制混淆矩阵并生成混淆矩阵图用于展示各数字分类识别情况。