基于MATLAB的KNN最近邻分类与预测系统
项目简介
本项目是一个基于MATLAB编程语言实现的K-最近邻(K-Nearest Neighbors)数据挖掘算法系统。项目专门针对数据挖掘课程设计,旨在通过底层代码实现而非直接调用工具箱函数,深入展示KNN算法的核心逻辑。系统集成了分类(Classification)与回归预测(Regression)两大核心功能,涵盖了从数据加载、预处理、参数寻优、模型构建到结果可视化的完整机器学习流程。
功能特性
- 双模式支持:同时支持离散标签的分类任务(如鸢尾花分类)和连续数值的回归预测任务(如函数拟合)。
- 多维度距离度量:底层实现了欧氏距离(Euclidean)、曼哈顿距离(Manhattan)和切比雪夫距离(Chebyshev)三种度量方式,且针对欧氏距离进行了矩阵化运算加速,避免了低效的双重循环。
- 科学的数据预处理:内置归一化(Min-Max)和标准化(Z-Score)模块。特别实现了训练集参数(均值、方差、极值)对测试集的迁移应用,严格遵守机器学习的数据隔离原则,防止数据泄露。
- 自动参数寻优:通过K-折交叉验证(K-Fold Cross Validation)机制,遍历指定的K值范围,自动计算平均准确率并绘制误差曲线,辅助选择最优K值。
- 丰富的可视化:
*
K值优选曲线:展示不同K值下的交叉验证准确率变化。
*
自定义混淆矩阵热力图:直观展示分类结果的准确性与误判情况。
*
回归拟合对比图:展示真实值与预测值的拟合程度。
- 零依赖底层实现:所有核心算法(距离计算、众数查找、交叉验证索引生成、混淆矩阵计算等)均不依赖MATLAB的高级机器学习工具箱(如 Statistics and Machine Learning Toolbox),完全由原生矩阵操作实现。
系统要求
- MATLAB版本:R2016a及以上版本(代码主要使用基础矩阵运算,兼容性极高)。
- 数据集:
* 分类任务:使用MATLAB内置的
fisheriris 数据集。
* 回归任务:程序自动生成含噪声的正弦波模拟数据。
使用方法
- 将项目代码保存并设置MATLAB当前工作路径到该文件夹。
- 在MATLAB命令行窗口输入主函数名称
main 并不是直接运行。 - 程序将依次执行以下流程:
* 加载并显示Iris数据集的基本信息;
* 执行K-折交叉验证并在控制台输出最优K值;
* 弹出图形窗口显示分类与参数优化结果;
* 生成模拟数据执行回归预测;
* 在控制台输出回归误差(MSE, R²)并弹出回归效果对比图。
核心算法与实现逻辑
本项目的主程序通过通过模块化函数设计,清晰地实现了以下逻辑:
1. 数据预处理
代码中包含了自动化的数据缩放逻辑。
- 训练阶段:根据训练数据计算统计量(如最大值/最小值,或均值/标准差),并对训练数据进行变换。
- 测试阶段:关键点,利用训练阶段计算得到的统计量对测试数据进行同样的变换,而不是重新计算测试集的统计量,确保了模型在真实应用场景下的有效性。
2. 参数寻优(K-折交叉验证)
程序并未简单地将数据划分为训练集和测试集,而是实现了一个手动参数寻优过程:
- 索引生成:通过其内部算法将训练数据随机划分为K个互斥的子集(Fold)。
- 循环验证:在给定的K值范围内(默认1-20),每一轮通过“留一法”选取其中一份作为验证集,其余作为训练集,重复执行KNN预测。
- 决策支持:计算所有折的平均准确率,最终选取平均准确率最高的K值作为最终模型的参数。
3. KNN核心预测引擎
预测函数是系统的核心,通过以下步骤实现:
- 距离矩阵计算:使用完全向量化的方式计算测试样本与训练样本之间的距离。针对欧氏距离,利用了完全平方公式展开技巧(
a² + b² - 2ab)进行矩阵加速。 - 近邻搜索:对距离进行升序排序,提取前K个最小距离对应的训练样本索引。
- 决策机制:
*
分类模式:采用了
多数表决(Majority Voting)机制,统计K个近邻中出现次数最多的类别作为预测结果。针对平票情况,代码采取了取索引最小值的默认策略。
*
回归模式:采用了
算术平均机制,计算K个近邻的目标值的平均数作为预测输出。
4. 结果评估
- 分类评估:手动构建了混淆矩阵(Confusion Matrix),计算预测类别与真实类别在矩阵各位置的计数,并利用灰度热力图进行展示,同时计算总体准确率(Accuracy)。
- 回归评估:代码实现了均方误差(MSE)和决定系数(R²)的计算公式,量化评估回归模型的预测精度。
5. 自定义工具函数
为保证代码独立性,项目自行实现了以下辅助功能:
- 众数计算:不依赖工具箱,通过自行统计唯一样本计数来寻找众数。
- 交叉验证索引:模拟了类似
crossvalind 的逻辑,生成随机的K折索引。 - 混淆矩阵绘制:利用
imagesc 结合文本标注,手动绘制带有数值标注的混淆矩阵图表。