一、逻辑回归(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.NumTestSetstrainIdx = 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
九、优化方向
-
超参数调优:使用
bayesopt
进行贝叶斯优化optimVars = [optimizableVariable('C', [0.1,10], 'Transform', 'log'), ...optimizableVariable('KernelScale', [0.1,10], 'Transform', 'log')]; results = bayesopt(@(params) svmObjective(params, X, Y), optimVars);
-
特征工程:
- 主成分分析(PCA)降维
- 基于互信息的特征选择
-
不平衡数据处理:
- 使用
classifcost
设置类别权重 - SMOTE过采样
- 使用