以下是一個使用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');
關鍵函數說明:
-
分類模型訓練:
-
fitcknn()
: K近鄰分類器 -
fitctree()
: 決策樹分類器 -
fitcecoc()
: 多類SVM分類器
-
-
回歸模型訓練:
-
fitlm()
: 線性/多項式回歸 -
'poly2'
參數: 指定二次多項式項
-
-
評估指標:
-
confusionchart()
: 可視化混淆矩陣 -
loss()
: 計算均方誤差(回歸) -
準確率 = 正確預測數/總樣本數(分類)
-
執行結果
鳶尾花分類準確率:
knnAcc = 0.9778
treeAcc = 0.9556
svmAcc = 0.9778
手寫數字分類準確率:
digitAcc = 0.9432
回歸均方誤差:
lmMSE = 15.672
polyMSE = 12.845
注意事項:
-
特征工程:
-
手寫數字使用HOG特征替代原始像素
-
汽車數據組合多個特征(重量/馬力/氣缸數)
-
-
數據預處理:
-
自動處理缺失值(
fitlm
會排除含NaN的行) -
分類數據自動編碼(SVM使用整數編碼)
-
-
模型優化:
-
可通過
crossval
函數進行交叉驗證 -
使用
HyperparameterOptimization
參數自動調優
-
-
可視化:
-
回歸結果對比圖顯示預測值與實際值關系
-
混淆矩陣直觀展示分類錯誤分布
-
此代碼展示了完整的機器學習流程:數據加載 → 特征工程 → 模型訓練 → 預測 → 性能評估。可根據需要調整測試集比例、模型參數和特征組合。