基于MATLAB的支持向量机(SVM)在故障诊断中的应用例程

基于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. 实际应用优化技巧

 

专注于matlab/simulink,电子电路,编程