MATLAB模式识别经典算法课程作业集
项目简介
本项目是一个针对《模式识别》课程开发的MATLAB代码集合,旨在通过编程实践帮助理解统计模式识别与机器学习基础中的核心算法。代码集成了从数据生成、分类器设计、聚类分析、非参数估计到特征降维的完整流程。所有算法均采用原生MATLAB代码或基础数学运算实现,包含详细的注释,并配有直观的二维可视化演示,能够动态展示算法的决策边界、投影效果及迭代过程。
功能特性
- 多类合成数据生成:能够模拟生成服从二维高斯分布的多类别数据集,支持自定义均值、协方差矩阵及样本数量。
- 贝叶斯分类器:实现了基于最小错误率的贝叶斯决策规则,利用极大似然估计(MLE)拟合参数,并绘制二维决策边界。
- Fisher线性判别(LDA):计算类内离散度矩阵,寻找最佳投影方向,将二维数据投影至一维以最大化类间分离度。
- K-Means聚类:实现了包含动态迭代过程动画的K均值聚类算法,直观展示聚类中心如何随迭代收敛。
- 非参数方法:集成了K近邻(KNN)分类算法与Parzen窗概率密度估计,展示非参数方法的分类与拟合效果。
- 主成分分析(PCA):通过特征值分解实现数据降维,可视化主成分轴及数据在最大方差方向上的投影分布。
系统要求
- MATLAB R2016b 或更高版本
- 需安装 Statistics and Machine Learning Toolbox(用于数据生成函数
mvnrnd 及统计绘图功能)
使用方法
- 确保MATLAB当前工作目录包含主脚本文件。
- 直接运行主函数。
- 程序将依次执行各个算法模块,并在命令行输出关键统计量(如Fisher准则函数值、分类准确率、PCA特征值等)。
- 程序运行过程中将生成多个图形窗口,分别展示原始数据分布、贝叶斯决策面、LDA投影分析、K-Means迭代动画、KNN/Parzen分析结果以及PCA主成分向量。
详细功能与算法实现逻辑
本项目的主程序通过分步调用的方式展示了以下核心算法的具体实现:
1. 数据生成与预处理
程序首先设置随机种子以保证结果可复现。接着利用多维正态随机数生成器构建三个类别的二维数据集:
- 类别1与类别2:均值与协方差矩阵设定为具有一定的重叠,主要用于二分类任务(贝叶斯、LDA)。
- 类别3:作为额外类别,与前两类组合用于多分类及聚类任务。
- 预处理:将数据集进行组合,构建用于不同任务的二分类数据集和多分类数据集,并绘制原始数据分布散点图。
2. 贝叶斯分类器设计(基于MLE)
该模块演示了参数化方法的分类过程:
- 参数估计:不直接使用真实参数,而是通过极大似然估计(MLE)从训练数据中计算各类的样本均值和样本协方差矩阵。
- 后验概率计算:假设两类先验概率相等,在二维平面构建密集网格,计算每个网格点属于各类的条件概率密度。
- 决策边界绘制:比较后验概率大小生成分类判决图,使用等高线填充图(contourf)展示决策区域,并叠加显示参数估计后的高斯分布等高线,直观对比样本分布与模型估计分布。
3. Fisher线性判别分析(LDA)
该模块实现了经典的线性降维分类算法:
- 离散度矩阵计算:计算各类别的均值向量,进而计算类内离散度矩阵和总类内离散度矩阵(Sw)。
- 最佳投影方向求解:求解 Sw 的逆矩阵与均值差向量的乘积,得到最佳投影权重向量 w,并对其进行归一化。
- 降维投影:将二维数据投影到 w 向量上,并在图形窗口中同时展示原始空间中的投影直线以及投影后的一维数据直方图。
- 性能评估:计算并输出Fisher准则函数值 J(w),量化类间距离与类内方差的比值。
4. 主成分分析(PCA)
该模块展示了无监督的特征提取与降维过程:
- 数据准备:为了演示效果,单独生成了一组具有高相关性的二维高斯数据。
- 特征值分解:对数据进行中心化处理,计算协方差矩阵,通过特征值分解求解特征向量(主成分方向)和特征值。
- 可视化:在原始数据上以箭头形式绘制第一和第二主成分方向(箭头长度与特征值平方根成正比),并展示数据在第一主成分(最大方差方向)上的投影分布。
5. K-Means 聚类
该模块手动实现了K均值聚类算法,重点在于过程可视化:
- 初始化:随机从数据集中选取 K 个样本作为初始聚类中心(本例中 K=3)。
- 迭代循环:
1.
分配步骤:计算每个样本到各个聚类中心的欧氏距离,将样本分配给最近的中心。
2.
可视化更新:在每次分配后,清除画布并重新绘制带有不同颜色的簇以及当前的聚类中心,配合暂停指令形成动画效果。
3.
更新步骤:重新计算每个簇的均值作为新的聚类中心。
- 收敛判断:通过比较新旧聚类中心位置的变化量,当变化小于设定阈值(1e-4)或达到最大迭代次数时停止算法。
6. 非参数估计:KNN与Parzen窗
该模块结合了两种典型的非参数方法:
- 数据集划分:将数据集随机打乱,并按 7:3 的比例划分为训练集和测试集。
- K近邻(KNN)分类:
* 设定邻居数 k=5。
* 遍历测试集样本,计算其与所有训练样本的欧氏距离并排序。
* 选取最近的 k 个邻居,通过投票(取众数)确定预测类别。
* 计算测试集准确率,并在图中标记出分类错误的样本。
* 选取第一类数据的第一维特征进行分析。
* 使用高斯核函数作为窗函数,设定窗口宽度 h=1.0。
* 在定义的一维网格上,利用训练样本计算概率密度函数的估计值。
* 绘制归一化直方图与Parzen窗估计曲线的对比图,展示非参数方法对数据分布的拟合能力。