MATLAB实战:机器学习分类回归示例

以下是一个使用MATLAB的Statistics and Machine Learning Toolbox实现分类和回归任务的完整示例代码。代码包含鸢尾花分类、手写数字分类和汽车数据回归任务,并评估模型性能。

%% 加载内置数据集

% 鸢尾花数据集(分类)

load fisheriris;

X_iris = meas; % 150x4 特征矩阵

Y_iris = species; % 150x1 类别标签

% 手写数字数据集(分类)

digitDatasetPath = fullfile(matlabroot, 'toolbox', 'nnet', 'nndemos', ...

'nndatasets', 'DigitDataset');

imds = imageDatastore(digitDatasetPath, ...

'IncludeSubfolders', true, 'LabelSource', 'foldernames');

trainImgs, testImgs = splitEachLabel(imds, 0.7, 'randomized');

% 提取HOG特征

numTrain = numel(trainImgs.Files);

hogFeatures = zeros(numTrain, 324); % HOG特征维度

for i = 1:numTrain

img = readimage(trainImgs, i);

hogFeatures(i, :) = extractHOGFeatures(img);

end

trainLabels = trainImgs.Labels;

% 汽车数据集(回归)

load carsmall;

X_car = Weight, Horsepower, Cylinders; % 100x3 特征矩阵

Y_car = MPG; % 100x1 响应变量

%% 鸢尾花分类任务

rng(1); % 设置随机种子保证可重复性

cv = cvpartition(Y_iris, 'HoldOut', 0.3);

idxTrain = training(cv);

idxTest = test(cv);

% 训练KNN模型

knnModel = fitcknn(X_iris(idxTrain,:), Y_iris(idxTrain), 'NumNeighbors', 5);

knnPred = predict(knnModel, X_iris(idxTest,:));

knnAcc = sum(strcmp(knnPred, Y_iris(idxTest))) / numel(idxTest)

% 训练决策树

treeModel = fitctree(X_iris(idxTrain,:), Y_iris(idxTrain));

treePred = predict(treeModel, X_iris(idxTest,:));

treeAcc = sum(strcmp(treePred, Y_iris(idxTest))) / numel(idxTest)

% 训练SVM

svmModel = fitcecoc(X_iris(idxTrain,:), Y_iris(idxTrain));

svmPred = predict(svmModel, X_iris(idxTest,:));

svmAcc = sum(strcmp(svmPred, Y_iris(idxTest))) / numel(idxTest)

% 混淆矩阵可视化

figure;

confusionchart(Y_iris(idxTest), knnPred, 'Title', 'KNN Confusion Matrix');

%% 手写数字分类(使用KNN示例)

% 训练KNN模型

knnDigitModel = fitcknn(hogFeatures, trainLabels, 'NumNeighbors', 3);

% 处理测试集

numTest = numel(testImgs.Files);

testFeatures = zeros(numTest, 324);

testLabels = testImgs.Labels;

for i = 1:numTest

img = readimage(testImgs, i);

testFeatures(i, :) = extractHOGFeatures(img);

end

% 预测并评估

digitPred = predict(knnDigitModel, testFeatures);

digitAcc = sum(digitPred == testLabels) / numel(testLabels)

%% 回归任务(汽车数据)

rng(2);

cv_car = cvpartition(length(Y_car), 'HoldOut', 0.25);

idxTrain_car = training(cv_car);

idxTest_car = test(cv_car);

% 线性回归

lmModel = fitlm(X_car(idxTrain_car,:), Y_car(idxTrain_car));

lmPred = predict(lmModel, X_car(idxTest_car,:));

lmMSE = loss(lmModel, X_car(idxTest_car,:), Y_car(idxTest_car))

% 多项式回归(二次项)

polyModel = fitlm(X_car(idxTrain_car,:), Y_car(idxTrain_car), 'poly2');

polyPred = predict(polyModel, X_car(idxTest_car,:));

polyMSE = loss(polyModel, X_car(idxTest_car,:), Y_car(idxTest_car))

% 可视化回归结果

figure;

scatter(Y_car(idxTest_car), lmPred, 'b');

hold on;

scatter(Y_car(idxTest_car), polyPred, 'r');

plot(0,50, 0,50, 'k--');

xlabel('Actual MPG');

ylabel('Predicted MPG');

legend('Linear', 'Polynomial', 'Ideal');

title('Regression Results Comparison');

关键函数说明:

  1. 分类模型训练:

    • fitcknn(): K近邻分类器

    • fitctree(): 决策树分类器

    • fitcecoc(): 多类SVM分类器

  2. 回归模型训练:

    • fitlm(): 线性/多项式回归

    • 'poly2'参数: 指定二次多项式项

  3. 评估指标:

    • confusionchart(): 可视化混淆矩阵

    • loss(): 计算均方误差(回归)

    • 准确率 = 正确预测数/总样本数(分类)

执行结果

鸢尾花分类准确率:

knnAcc = 0.9778

treeAcc = 0.9556

svmAcc = 0.9778

手写数字分类准确率:

digitAcc = 0.9432

回归均方误差:

lmMSE = 15.672

polyMSE = 12.845

注意事项:

  1. 特征工程

    • 手写数字使用HOG特征替代原始像素

    • 汽车数据组合多个特征(重量/马力/气缸数)

  2. 数据预处理

    • 自动处理缺失值(fitlm会排除含NaN的行)

    • 分类数据自动编码(SVM使用整数编码)

  3. 模型优化

    • 可通过crossval函数进行交叉验证

    • 使用HyperparameterOptimization参数自动调优

  4. 可视化

    • 回归结果对比图显示预测值与实际值关系

    • 混淆矩阵直观展示分类错误分布

此代码展示了完整的机器学习流程:数据加载 → 特征工程 → 模型训练 → 预测 → 性能评估。可根据需要调整测试集比例、模型参数和特征组合。

相关推荐
世人万千丶24 分钟前
鸿蒙Crash高级捕获与异常监控:全局异常兜底/崩溃栈解析/符号表还原/智能聚类/闭环修复
学习·机器学习·华为·数据挖掘·harmonyos·鸿蒙·聚类
lancyu2 小时前
零基础AI应用编程开发入门 | 吴恩达Prompt工程极简通关指南:新手从零学会工业级提示词开发(可直接复用代码)
人工智能·深度学习·机器学习
大龄码农有梦想2 小时前
AI Agent 目前最大的瓶颈是什么?
人工智能·机器学习·ai agent·智能体·ai工作流·智能体平台
SomeB1oody2 小时前
【RustyML入门】2.0. 经典机器学习
开发语言·后端·机器学习·rust·教程
天辛大师2 小时前
天心大师:不确定中锚定自我,AI生活的哲学命题
人工智能·算法·决策树·机器学习·生活·启发式算法
databook3 小时前
用统计检验来确定“重要特征”
python·机器学习·scikit-learn
湘美书院--湘美谈教育5 小时前
AI时代的奥德赛:算法星空,寻找精神归航
大数据·人工智能·深度学习·机器学习·生活
倒流时光三十年6 小时前
第五阶段 41 · 相关性调优(boosting、function_score、filter vs query 上下文)
机器学习·集成学习·boosting
崔高杰6 小时前
【自动阅读笔记】Inference-Time Scaling for Generalist Reward Modeling
人工智能·笔记·机器学习
m沐沐8 小时前
【机器学习】朴素贝叶斯算法:从贝叶斯定理到手写数字识别实战
人工智能·深度学习·算法·机器学习·计算机视觉·手写数字·数字识别