基于MATLAB的支持向量机(SVM)在故障诊断中的应用例程
1. 数据准备与预处理
% 加载数据集(示例:滚动轴承振动信号)
load('bearing_dataset.mat'); % 包含正常/故障振动信号及标签
X = bearing_dataset(:, 2:end-1); % 特征数据(时域/频域特征)
Y = bearing_dataset(:, end); % 标签(故障类型)
% 数据归一化(消除量纲影响)
[X_norm, mu, sigma] = zscore(X); % 标准化处理
% 划分训练集与测试集(80%训练,20%测试)
cv = cvpartition(size(X,1),'HoldOut',0.2);
X_train = X_norm(cv.training,:);
Y_train = Y(cv.training);
X_test = X_norm(cv.test,:);
Y_test = Y(cv.test);
2. 特征提取(以振动信号为例)
% 时域特征提取(示例:均值、方差、峭度)
mean_val = mean(X_train, 2);
var_val = var(X_train, 0, 2);
kurtosis_val = kurtosis(X_train, 0, 2);
% 频域特征提取(FFT频谱峰值)
Y_fft = fft(X_train, [], 2);
freq = (0:size(Y_fft,2)-1)*(fs/size(Y_fft,2)); % 频率轴
[~, idx] = max(abs(Y_fft(:,1:1000)), [], 2); % 取前1000点频谱峰值
peak_freq = freq(idx);
% 构建综合特征向量
features = [mean_val, var_val, kurtosis_val, peak_freq];
3. SVM模型构建与训练
% 定义SVM参数(RBF核函数)
svm_opts = statset('Display','iter');
model = fitcsvm(X_train, Y_train, ...
'KernelFunction', 'rbf', ...
'BoxConstraint', 10, ... % 惩罚系数C
'KernelScale', 'auto', ... % 自动选择gamma
'Standardize', true, ...
'ClassNames', unique(Y)); % 多分类支持
% 交叉验证优化参数(网格搜索)
tuneGrid = struct('BoxConstraint',[0.1,1,10],...
'KernelScale',[0.5,1,2]);
optimized_model = fitcsvm(X_train, Y_train, ...
'KernelFunction','rbf',...
'OptimizeHyperparameters','auto',...
'HyperparameterOptimizationOptions',...
struct('AcquisitionFunctionName','expected-improvement-plus'));
4. 模型测试与性能评估
% 预测测试集
Y_pred = predict(optimized_model, X_test);
% 计算分类指标
accuracy = sum(Y_pred == Y_test)/numel(Y_test);
conf_mat = confusionmat(Y_test, Y_pred);
precision = diag(conf_mat)./sum(conf_mat,2);
recall = diag(conf_mat)./sum(conf_mat,1)';
% 可视化混淆矩阵
confusionchart(Y_test, Y_pred);
title('混淆矩阵');
% ROC曲线(多分类)
[Xroc, Yroc, Troc, Auc] = perfcurve(Y_test, Y_pred, 1);
figure;
plot(Xroc, Yroc);
xlabel('假阳性率'); ylabel('真阳性率');
title('ROC曲线 (AUC = %.2f)', mean(Auc));
5. 关键参数调优策略
5.1 核函数选择对比
| 核函数类型 | 适用场景 | MATLAB参数 |
|---|---|---|
| RBF | 非线性可分/高维数据 | 'KernelFunction','rbf' |
| 多项式 | 特征间存在多项式关系 | 'KernelFunction','polynomial' |
| 线性 | 线性可分/高维稀疏数据 | 'KernelFunction','linear' |
5.2 惩罚系数C优化
% 通过交叉验证选择最佳C值
C_values = [0.01,0.1,1,10,100];
best_accuracy = 0;
for C = C_values
model = fitcsvm(X_train, Y_train, 'BoxConstraint', C);
Y_pred = predict(model, X_test);
acc = sum(Y_pred == Y_test)/numel(Y_test);
if acc > best_accuracy
best_accuracy = acc;
best_C = C;
end
end
disp(['最佳惩罚系数C: ', num2str(best_C)]);
6. 多分类扩展(以11类故障为例)
% 加载多分类数据集
load('motor_fault_dataset.mat'); % 包含11类故障标签
% 使用ECOC(纠错输出码)策略
model = fitcecoc(X_train, Y_train, ...
'Learners', 'svm', ...
'Coding', 'onevsall', ...
'ClassNames', categorical(1:11));
% 预测与评估
Y_pred = predict(model, X_test);
macro_avg = mean(precision);
weighted_avg = sum(precision .* recall) / sum(recall);
disp(['宏平均精度: ', num2str(macro_avg)]);
disp(['加权平均精度: ', num2str(weighted_avg)]);
参考代码 基于MATLAB的支持向量机(SVM)在故障诊断中的的应用例程 www.youwenfan.com/contentcni/65944.html
7. 实际应用优化技巧
-
数据不平衡处理:使用SMOTE过采样或调整类别权重
model = fitcsvm(X_train, Y_train, 'ClassNames', [0,1], ... 'Prior', [0.7,0.3]); % 调整类别先验概率 -
实时性优化:模型轻量化与GPU加速
% 使用GPU加速预测 X_test_gpu = gpuArray(X_test); Y_pred_gpu = predict(optimized_model, X_test_gpu); Y_pred = gather(Y_pred_gpu); -
增量学习:在线更新模型(新数据持续接入场景)
incremental_model = incrementalClassificationLinear('Beta', model.Beta); incremental_model = updateMetrics(incremental_model, X_new, Y_new);