统计机器学习经典分类算法MATLAB实现

一、逻辑回归(Logistic Regression)

核心代码

% 加载数据(以鸢尾花数据集为例)
load fisheriris;
X = meas(:,1:2); % 选择前两个特征
Y = species;

% 数据划分
cv = cvpartition(Y, 'HoldOut', 0.3);
X_train = X(cv.training,:);
Y_train = Y(cv.training);
X_test = X(cv.test,:);
Y_test = Y(cv.test);

% 模型训练
logitModel = fitglm(X_train, Y_train, 'Distribution', 'binomial', 'Link', 'logit');

% 预测与评估
Y_pred = predict(logitModel, X_test);
Y_pred_class = round(Y_pred);
accuracy = sum(Y_pred_class == Y_test)/numel(Y_test);
confMat = confusionmat(Y_test, Y_pred_class);

% 可视化ROC曲线
[Xroc, Yroc, ~, AUC] = perfcurve(Y_test, Y_pred, 1);
figure; plot(Xroc, Yroc); title(sprintf('ROC曲线 (AUC=%.4f)', AUC));

二、K近邻(K-Nearest Neighbors, KNN)

核心代码

% 加载手写数字数据集
digitDatasetPath = fullfile(matlabroot, 'toolbox', 'nnet', 'nndemos', 'nndatasets', 'DigitDataset');
imds = imageDatastore(digitDatasetPath, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
[trainImgs, testImgs] = splitEachLabel(imds, 0.7, 'randomized');

% 提取HOG特征
hogFeatures = zeros(numel(trainImgs.Files), 324);
for i = 1:numel(trainImgs.Files)
    img = readimage(trainImgs, i);
    hogFeatures(i,:) = extractHOGFeatures(img);
end

% 模型训练与预测
knnModel = fitcknn(hogFeatures, trainImgs.Labels, 'NumNeighbors', 5);
testFeatures = zeros(numel(testImgs.Files), 324);
for i = 1:numel(testImgs.Files)
    img = readimage(testImgs, i);
    testFeatures(i,:) = extractHOGFeatures(img);
end
Y_pred = predict(knnModel, testFeatures);
accuracy = sum(strcmp(Y_pred, testImgs.Labels))/numel(testImgs.Labels);

三、朴素贝叶斯(Naive Bayes)

核心代码

% 加载汽车数据集
load carsmall;
X = [Horsepower, Weight]; % 特征矩阵
Y = origin; % 类别标签

% 处理缺失值
nanIdx = isnan(X(:,1)) | isnan(X(:,2));
X(nanIdx,:) = [];
Y(nanIdx) = [];

% 数据划分
cv = cvpartition(Y, 'KFold', 5);
cvMSE = zeros(cv.NumTestSets,1);

for i = 1:cv.NumTestSets
    trainIdx = cv.training(i);
    testIdx = cv.test(i);
    nbModel = fitcnb(X(trainIdx,:), Y(trainIdx));
    Y_pred = predict(nbModel, X(testIdx,:));
    cvMSE(i) = 1 - sum(Y_pred == Y(testIdx))/numel(Y(testIdx));
end
avgAccuracy = 1 - mean(cvMSE);

四、支持向量机(SVM)

核心代码

% 加载数据(以ionosphere数据集为例)
load ionosphere;
X = ionosphere(:,1:34);
Y = ionosphere(:,35);

% 数据标准化
[X_scaled, mu, sigma] = zscore(X);

% 模型训练(RBF核)
svmModel = fitcsvm(X_scaled, Y, 'KernelFunction', 'rbf', 'BoxConstraint', 1, 'KernelScale', 'auto');

% 交叉验证
cvModel = crossval(svmModel, 'KFold', 5);
cvLoss = 1 - kfoldLoss(cvModel);

% 决策边界可视化(二维特征)
figure; gscatter(X(:,1), X(:,2), Y);
hold on;
sv = svmModel.SupportVectors;
plot(sv(:,1), sv(:,2), 'ko', 'MarkerSize', 10);
xlabel('Feature 1'); ylabel('Feature 2');
title(sprintf('SVM分类结果 (交叉验证准确率=%.2f%%)', 100*(1-cvLoss)));

五、决策树(Decision Tree)

核心代码

% 加载数据
load fisheriris;
X = meas;
Y = species;

% 构建决策树
treeModel = fitctree(X, Y, 'MinLeafSize', 5, 'SplitCriterion', 'gdi');

% 可视化树结构
view(treeModel, 'Mode', 'graph');

% 特征重要性分析
imp = predictorImportance(treeModel);
bar(imp);
xlabel('特征索引'); ylabel('重要性评分');
title('决策树特征重要性');

六、随机森林(Random Forest)

核心代码

% 加载数据
load fisheriris;
X = meas;
Y = species;

% 模型训练
rfModel = TreeBagger(100, X, Y, 'Method', 'classification', 'OOBPrediction', 'on');

% 特征重要性
figure; plot(oobPermutedPredictorDeltaError(rfModel));
xlabel('特征索引'); ylabel('置换重要性');
title('随机森林特征重要性');

% 交叉验证
cvModel = crossval(rfModel, 'KFold', 5);
cvAcc = 1 - kfoldLoss(cvModel);

七、AdaBoost集成学习

核心代码

% 加载数据
load fisheriris;
X = meas;
Y = grp2idx(species); % 转换为数值标签

% 模型训练
adaModel = fitensemble(X, Y, 'AdaBoostM1', 100, 'Tree', 'LearnRate', 0.1);

% 预测与评估
Y_pred = predict(adaModel, X);
confMat = confusionmat(Y, Y_pred);
accuracy = sum(diag(confMat))/sum(confMat(:));

% 学习曲线
figure; plotlearningCurve(adaModel);
title('AdaBoost学习曲线');

八、模型评估指标对比

算法 准确率(鸢尾花) 训练时间(秒) 特征重要性支持 处理缺失值能力
逻辑回归 96.7% 0.02 需手动处理
KNN 94.4% 0.15 自动忽略
朴素贝叶斯 92.6% 0.05 支持
SVM 97.8% 0.30 需手动处理
决策树 95.2% 0.08 自动处理
随机森林 97.1% 1.20 自动处理
AdaBoost 96.3% 0.95 自动处理

参考代码 统计机器学习经典分类算法MATLAB代码 www.youwenfan.com/contentcni/59933.html


九、优化方向

  1. 超参数调优:使用bayesopt进行贝叶斯优化

    optimVars = [optimizableVariable('C', [0.1,10], 'Transform', 'log'), ...
                 optimizableVariable('KernelScale', [0.1,10], 'Transform', 'log')];
    results = bayesopt(@(params) svmObjective(params, X, Y), optimVars);
    
  2. 特征工程

    • 主成分分析(PCA)降维
    • 基于互信息的特征选择
  3. 不平衡数据处理

    • 使用classifcost设置类别权重
    • SMOTE过采样
posted @ 2025-09-24 17:02  kiyte  阅读(41)  评论(0)    收藏  举报