一、MATLAB实现
1.1 主程序:遗传算法优化故障诊断
matlab
%% 基于遗传算法的机械故障诊断系统
% 功能:使用遗传算法优化特征选择和分类器参数,实现机械故障诊断
clear; clc; close all;
fprintf('=== 遗传算法机械故障诊断系统开始 ===\n');
%% 1. 生成模拟机械振动数据
fprintf('生成模拟机械振动数据...\n');
% 设置随机种子以确保可重复性
rng(42);
% 参数设置
fs = 12000; % 采样频率 (Hz)
t = 0:1/fs:1; % 时间向量 (1秒)
N_samples = 300; % 总样本数
N_normal = 100; % 正常样本数
N_inner = 100; % 内圈故障样本数
N_outer = 100; % 外圈故障样本数
% 生成三种状态的振动信号
fprintf(' 生成正常状态信号...\n');
[normal_signals, normal_labels] = generate_normal_signals(N_normal, fs, t);
fprintf(' 生成内圈故障信号...\n');
[inner_signals, inner_labels] = generate_inner_race_fault(N_inner, fs, t);
fprintf(' 生成外圈故障信号...\n');
[outer_signals, outer_labels] = generate_outer_race_fault(N_outer, fs, t);
% 合并数据集
all_signals = [normal_signals; inner_signals; outer_signals];
all_labels = [normal_labels; inner_labels; outer_labels];
% 打乱数据顺序
idx = randperm(N_samples);
all_signals = all_signals(idx, :);
all_labels = all_labels(idx, :);
% 划分训练集和测试集 (70%训练,30%测试)
train_ratio = 0.7;
train_size = round(N_samples * train_ratio);
X_train = all_signals(1:train_size, :);
y_train = all_labels(1:train_size, :);
X_test = all_signals(train_size+1:end, :);
y_test = all_labels(train_size+1:end, :);
fprintf(' 总样本数: %d\n', N_samples);
fprintf(' 训练集: %d 样本\n', size(X_train, 1));
fprintf(' 测试集: %d 样本\n', size(X_test, 1));
%% 2. 特征提取
fprintf('提取时域和频域特征...\n');
% 提取训练集特征
fprintf(' 提取训练集特征...\n');
train_features = extract_features(X_train, fs);
% 提取测试集特征
fprintf(' 提取测试集特征...\n');
test_features = extract_features(X_test, fs);
% 特征归一化
[train_features_norm, ps] = mapminmax(train_features', 0, 1);
train_features_norm = train_features_norm';
test_features_norm = mapminmax('apply', test_features', ps)';
fprintf(' 特征维度: %d\n', size(train_features, 2));
%% 3. 遗传算法优化特征选择和SVM参数
fprintf('设置遗传算法参数...\n');
% 遗传算法参数
N_features = size(train_features, 2);
N_vars = N_features + 2; % 特征选择掩码 + SVM参数(c, g)
% 变量边界
lb = zeros(N_vars, 1); % 下界
ub = ones(N_vars, 1); % 上界
ub(N_features+1) = 100; % c参数上界
ub(N_features+2) = 100; % g参数上界
% 遗传算法选项
options = optimoptions('ga', ...
'PopulationSize', 50, ...
'MaxGenerations', 100, ...
'EliteCount', 5, ...
'CrossoverFraction', 0.8, ...
'MutationRate', 0.01, ...
'FunctionTolerance', 1e-6, ...
'Display', 'iter', ...
'PlotFcn', {@gaplotbestf, @gaplotdistance});
% 适应度函数句柄
fitness_fcn = @(x) fault_diagnosis_fitness(x, train_features_norm, y_train, N_features);
% 运行遗传算法
fprintf('开始遗传算法优化...\n');
tic;
[best_solution, best_fitness, exit_flag, output] = ga(...
fitness_fcn, N_vars, [], [], [], lb, ub, [], options);
opt_time = toc;
fprintf('\n遗传算法优化完成!\n');
fprintf(' 优化时间: %.2f 秒\n', opt_time);
fprintf(' 最佳适应度: %.6f\n', best_fitness);
fprintf(' 收敛代数: %d\n', output.generations);
%% 4. 解码最优解
fprintf('解码最优解...\n');
% 解码特征选择掩码
feature_mask = best_solution(1:N_features) > 0.5;
selected_features = find(feature_mask);
N_selected = sum(feature_mask);
% 解码SVM参数
best_c = best_solution(N_features+1);
best_g = best_solution(N_features+2);
fprintf(' 选择的特征数: %d/%d\n', N_selected, N_features);
fprintf(' 最优SVM参数: c=%.4f, g=%.4f\n', best_c, best_g);
% 显示选择的特征
fprintf(' 选择的特征索引: ');
disp(selected_features');
%% 5. 使用最优特征和参数训练最终模型
fprintf('训练最终SVM模型...\n');
% 应用特征选择
X_train_selected = train_features_norm(:, feature_mask);
X_test_selected = test_features_norm(:, feature_mask);
% 训练SVM分类器
svm_model = fitcecoc(X_train_selected, y_train, ...
'Learners', templateSVM('KernelFunction', 'rbf', ...
'BoxConstraint', best_c, ...
'KernelScale', best_g), ...
'Coding', 'onevsall');
% 预测
y_pred_train = predict(svm_model, X_train_selected);
y_pred_test = predict(svm_model, X_test_selected);
%% 6. 性能评估
fprintf('评估诊断性能...\n');
% 计算准确率
train_accuracy = sum(y_pred_train == y_train) / length(y_train);
test_accuracy = sum(y_pred_test == y_test) / length(y_test);
fprintf('\n=== 诊断性能评估 ===\n');
fprintf('训练集准确率: %.2f%%\n', train_accuracy*100);
fprintf('测试集准确率: %.2f%%\n', test_accuracy*100);
% 混淆矩阵
figure('Position', [100, 100, 800, 400]);
subplot(1, 2, 1);
confusionchart(y_train, y_pred_train, 'Title', '训练集混淆矩阵');
subplot(1, 2, 2);
confusionchart(y_test, y_pred_test, 'Title', '测试集混淆矩阵');
% 计算每个类别的性能
classes = unique(y_train);
N_classes = length(classes);
precision = zeros(N_classes, 1);
recall = zeros(N_classes, 1);
f1_score = zeros(N_classes, 1);
for i = 1:N_classes
class = classes(i);
% 真正例
TP = sum(y_test == class & y_pred_test == class);
% 假正例
FP = sum(y_test ~= class & y_pred_test == class);
% 假反例
FN = sum(y_test == class & y_pred_test ~= class);
% 精确率
precision(i) = TP / (TP + FP);
% 召回率
recall(i) = TP / (TP + FN);
% F1分数
f1_score(i) = 2 * (precision(i) * recall(i)) / (precision(i) + recall(i));
end
% 显示每个类别的性能
fprintf('\n各类别性能指标:\n');
fprintf('%-10s %-10s %-10s %-10s\n', '类别', '精确率', '召回率', 'F1分数');
fprintf('%s\n', repmat('-', 1, 45));
for i = 1:N_classes
fprintf('%-10d %-10.4f %-10.4f %-10.4f\n', ...
classes(i), precision(i), recall(i), f1_score(i));
end
fprintf('\n平均F1分数: %.4f\n', mean(f1_score));
%% 7. 特征重要性分析
fprintf('分析特征重要性...\n');
% 使用递归特征消除(RFE)验证特征重要性
opts = statset('UseParallel',true);
rfe_model = fitcecoc(X_train_selected, y_train, ...
'Learners', templateSVM('KernelFunction', 'rbf'), ...
'Coding', 'onevsall', ...
'OptimizeHyperparameters', 'auto', ...
'HyperparameterOptimizationOptions', struct('AcquisitionFunctionName', 'expected-improvement-plus', 'ShowPlots', false));
% 获取特征重要性
feature_importance = rfe_model.BinaryLearners{1}.SupportVectors;
% 可视化特征重要性
figure('Position', [100, 100, 1000, 400]);
subplot(1, 2, 1);
bar(1:N_selected, feature_importance(1, :));
xlabel('特征索引');
ylabel('重要性权重');
title('特征重要性分析');
grid on;
% 特征选择前后对比
subplot(1, 2, 2);
all_features_acc = evaluate_full_features(train_features_norm, y_train, test_features_norm, y_test);
selected_features_acc = [train_accuracy, test_accuracy];
bar_data = [all_features_acc; selected_features_acc];
bar_labels = {'全部特征', '选择特征'};
h = bar(bar_data');
set(gca, 'XTick', 1:2, 'XTickLabel', bar_labels);
ylabel('准确率 (%)');
title('特征选择前后性能对比');
legend('训练集', '测试集', 'Location', 'best');
grid on;
%% 8. 保存结果
fprintf('保存结果...\n');
% 保存模型和数据
save('fault_diagnosis_model.mat', ...
'svm_model', 'feature_mask', 'selected_features', ...
'best_c', 'best_g', 'ps', 'train_accuracy', 'test_accuracy');
% 保存特征重要性
feature_importance_table = table((1:N_selected)', feature_importance(1, :)', ...
'VariableNames', {'Feature_Index', 'Importance'});
writetable(feature_importance_table, 'feature_importance.csv');
fprintf('\n=== 故障诊断系统完成 ===\n');
fprintf('模型已保存到 fault_diagnosis_model.mat\n');
fprintf('特征重要性已保存到 feature_importance.csv\n');
1.2 信号生成函数
matlab
%% 生成正常状态振动信号
function [signals, labels] = generate_normal_signals(N, fs, t)
signals = zeros(N, length(t));
labels = zeros(N, 1);
for i = 1:N
% 正常信号:主要是高斯白噪声 + 工频干扰
noise = 0.5 * randn(size(t));
fundamental = 0.3 * sin(2*pi*50*t); % 50Hz工频
harmonic = 0.1 * sin(2*pi*100*t); % 二次谐波
signals(i, :) = noise + fundamental + harmonic;
labels(i) = 0; % 标签0表示正常
end
end
%% 生成内圈故障信号
function [signals, labels] = generate_inner_race_fault(N, fs, t)
signals = zeros(N, length(t));
labels = zeros(N, 1);
% 内圈故障特征频率 (BPFO)
fault_freq = 120; % 120Hz
for i = 1:N
% 故障冲击信号
impact = zeros(size(t));
impact_period = round(fs / fault_freq);
for j = 1:impact_period:length(t)
if j <= length(t)
impact(j) = 1.0;
end
end
% 调制信号
modulation = 0.5 * sin(2*pi*30*t); % 30Hz调制频率
% 共振响应 (2000Hz共振)
resonance = sin(2*pi*2000*t) .* exp(-t*50);
% 合成信号
signals(i, :) = impact .* modulation + resonance + 0.3*randn(size(t));
labels(i) = 1; % 标签1表示内圈故障
end
end
%% 生成外圈故障信号
function [signals, labels] = generate_outer_race_fault(N, fs, t)
signals = zeros(N, length(t));
labels = zeros(N, 1);
% 外圈故障特征频率 (BPFI)
fault_freq = 80; % 80Hz
for i = 1:N
% 故障冲击信号
impact = zeros(size(t));
impact_period = round(fs / fault_freq);
for j = 1:impact_period:length(t)
if j <= length(t)
impact(j) = 0.8;
end
end
% 调制信号
modulation = 0.4 * sin(2*pi*25*t); % 25Hz调制频率
% 共振响应 (1500Hz共振)
resonance = sin(2*pi*1500*t) .* exp(-t*40);
% 合成信号
signals(i, :) = impact .* modulation + resonance + 0.4*randn(size(t));
labels(i) = 2; % 标签2表示外圈故障
end
end
1.3 特征提取函数
matlab
%% 提取时域和频域特征
function features = extract_features(signals, fs)
[N_samples, N_points] = size(signals);
features = zeros(N_samples, 18); % 18个特征
for i = 1:N_samples
signal = signals(i, :)';
% ===== 时域特征 =====
% 1. 均值
features(i, 1) = mean(signal);
% 2. 标准差
features(i, 2) = std(signal);
% 3. 峰值
features(i, 3) = max(signal);
% 4. 峰峰值
features(i, 4) = max(signal) - min(signal);
% 5. 峭度
features(i, 5) = kurtosis(signal);
% 6. 偏度
features(i, 6) = skewness(signal);
% 7. 波形因子
features(i, 7) = rms(signal) / mean(abs(signal));
% 8. 峰值因子
features(i, 8) = max(abs(signal)) / rms(signal);
% 9. 脉冲因子
features(i, 9) = max(abs(signal)) / mean(abs(signal));
% 10. 裕度因子
features(i, 10) = max(abs(signal)) / mean(sqrt(abs(signal)))^2;
% ===== 频域特征 =====
% FFT变换
NFFT = 2^nextpow2(N_points);
fft_signal = fft(signal, NFFT);
magnitude = abs(fft_signal(1:NFFT/2));
freq = (0:NFFT/2-1) * fs / NFFT;
% 归一化频谱
magnitude = magnitude / max(magnitude);
% 11. 重心频率
features(i, 11) = sum(freq .* magnitude) / sum(magnitude);
% 12. 均方频率
features(i, 12) = sum(freq.^2 .* magnitude) / sum(magnitude);
% 13. 频率方差
fc = features(i, 11);
features(i, 13) = sum((freq - fc).^2 .* magnitude) / sum(magnitude);
% 14. 频率标准差
features(i, 14) = sqrt(features(i, 13));
% 15. 谱峭度
features(i, 15) = kurtosis(magnitude);
% 16. 谱熵
magnitude_norm = magnitude / sum(magnitude);
magnitude_norm(magnitude_norm == 0) = eps;
features(i, 16) = -sum(magnitude_norm .* log2(magnitude_norm));
% 17. 功率谱峰值
[~, idx] = max(magnitude);
features(i, 17) = freq(idx);
% 18. 功率谱能量
features(i, 18) = sum(magnitude.^2);
end
end
1.4 遗传算法适应度函数
matlab
%% 遗传算法适应度函数
function fitness = fault_diagnosis_fitness(x, features, labels, N_features)
% 解码特征选择掩码
feature_mask = x(1:N_features) > 0.5;
% 检查是否至少选择了一个特征
if sum(feature_mask) == 0
fitness = 1.0; % 最坏适应度
return;
end
% 解码SVM参数
c = x(N_features+1);
g = x(N_features+2);
% 应用特征选择
selected_features = features(:, feature_mask);
% 5折交叉验证
cv = cvpartition(labels, 'KFold', 5);
cv_accuracy = zeros(cv.NumTestSets, 1);
for fold = 1:cv.NumTestSets
% 获取训练集和测试集索引
train_idx = training(cv, fold);
test_idx = test(cv, fold);
% 训练SVM分类器
try
svm_model = fitcecoc(selected_features(train_idx, :), labels(train_idx), ...
'Learners', templateSVM('KernelFunction', 'rbf', ...
'BoxConstraint', c, ...
'KernelScale', g), ...
'Coding', 'onevsall');
% 预测
y_pred = predict(svm_model, selected_features(test_idx, :));
% 计算准确率
cv_accuracy(fold) = sum(y_pred == labels(test_idx)) / length(labels(test_idx));
catch
% 如果出现错误,给予最差适应度
fitness = 1.0;
return;
end
end
% 适应度 = 1 - 平均准确率(最小化问题)
mean_accuracy = mean(cv_accuracy);
fitness = 1 - mean_accuracy;
% 添加特征数量惩罚(鼓励选择较少特征)
feature_penalty = 0.01 * sum(feature_mask) / N_features;
fitness = fitness + feature_penalty;
end
1.5 性能评估函数
matlab
%% 评估全特征性能(对比用)
function accuracy = evaluate_full_features(train_features, train_labels, test_features, test_labels)
% 训练全特征SVM模型
svm_model = fitcecoc(train_features, train_labels, ...
'Learners', templateSVM('KernelFunction', 'rbf'), ...
'Coding', 'onevsall');
% 预测
y_pred_train = predict(svm_model, train_features);
y_pred_test = predict(svm_model, test_features);
% 计算准确率
train_accuracy = sum(y_pred_train == train_labels) / length(train_labels);
test_accuracy = sum(y_pred_test == test_labels) / length(test_labels);
accuracy = [train_accuracy, test_accuracy];
end
二、算法原理详解
2.1 遗传算法优化流程
初始化种群(随机生成特征掩码和SVM参数)
↓
计算适应度(5折交叉验证准确率)
↓
选择操作(锦标赛选择)
↓
交叉操作(单点交叉)
↓
变异操作(随机翻转)
↓
精英保留
↓
终止条件判断(最大代数或收敛)
↓
输出最优解
2.2 特征重要性排序
| 特征类型 | 特征名称 | 物理意义 |
|---|---|---|
| 时域 | 均值、标准差 | 信号能量和波动 |
| 时域 | 峭度、偏度 | 冲击特性 |
| 时域 | 峰值因子、脉冲因子 | 故障严重程度 |
| 频域 | 重心频率 | 频谱分布中心 |
| 频域 | 谱峭度 | 周期性冲击强度 |
| 频域 | 谱熵 | 频谱复杂度 |
2.3 多目标优化扩展
matlab
%% 多目标遗传算法优化
function [pareto_solutions, pareto_fitness] = multiobjective_optimization(...)
features, labels, N_features)
% 多目标优化:最大化准确率 + 最小化特征数量
% 定义两个目标函数
fitness_fcn = @(x) [fault_diagnosis_fitness(x, features, labels, N_features), ...
sum(x(1:N_features) > 0.5) / N_features];
% 多目标遗传算法选项
options = optimoptions('gamultiobj', ...
'PopulationSize', 100, ...
'MaxGenerations', 200, ...
'Display', 'iter');
% 变量边界
lb = zeros(N_features+2, 1);
ub = ones(N_features+2, 1);
ub(N_features+1) = 100;
ub(N_features+2) = 100;
% 运行多目标遗传算法
[pareto_solutions, pareto_fitness] = gamultiobj(...
fitness_fcn, N_features+2, [], [], [], lb, ub, options);
end
三、性能优化与扩展
3.1 并行计算加速
matlab
%% 并行遗传算法
function [best_solution, best_fitness] = parallel_ga_optimization(...)
features, labels, N_features)
% 使用并行计算加速遗传算法
% 启动并行池
if isempty(gcp('nocreate'))
parpool('local', 4); % 使用4个核心
end
% 遗传算法选项
options = optimoptions('ga', ...
'UseParallel', true, ...
'PopulationSize', 50, ...
'MaxGenerations', 100);
% 运行并行遗传算法
[best_solution, best_fitness] = ga(...
@(x) fault_diagnosis_fitness(x, features, labels, N_features), ...
N_features+2, [], [], [], zeros(N_features+2,1), ones(N_features+2,1), ...
[], options);
% 关闭并行池
delete(gcp('nocreate'));
end
3.2 自适应特征选择
matlab
%% 自适应特征选择
function [selected_features, best_params] = adaptive_feature_selection(...)
features, labels, initial_mask)
% 自适应调整特征选择
N_features = size(features, 2);
current_mask = initial_mask;
for iter = 1:10
% 评估当前特征子集
current_features = features(:, current_mask);
cv_accuracy = evaluate_features(current_features, labels);
% 尝试添加/删除特征
improved = false;
% 尝试删除一个特征
for i = 1:sum(current_mask)
test_mask = current_mask;
test_mask(find(current_mask, i)) = 0;
if sum(test_mask) > 0
test_features = features(:, test_mask);
test_accuracy = evaluate_features(test_features, labels);
if test_accuracy > cv_accuracy
current_mask = test_mask;
cv_accuracy = test_accuracy;
improved = true;
break;
end
end
end
% 尝试添加一个特征
if ~improved
for i = 1:N_features
if ~current_mask(i)
test_mask = current_mask;
test_mask(i) = 1;
test_features = features(:, test_mask);
test_accuracy = evaluate_features(test_features, labels);
if test_accuracy > cv_accuracy
current_mask = test_mask;
cv_accuracy = test_accuracy;
improved = true;
break;
end
end
end
end
% 如果没有改进,停止迭代
if ~improved
break;
end
end
selected_features = current_mask;
best_params = cv_accuracy;
end
3.3 深度学习特征提取
matlab
%% 深度学习特征提取
function dl_features = deep_learning_features(signals, fs)
% 使用卷积神经网络提取深度特征
% 数据预处理
[N_samples, N_points] = size(signals);
% 构建CNN网络
layers = [
imageInputLayer([N_points, 1, 1])
convolution2dLayer([5, 1], 16, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer([2, 1], 'Stride', [2, 1])
convolution2dLayer([5, 1], 32, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer([2, 1], 'Stride', [2, 1])
fullyConnectedLayer(128)
reluLayer
dropoutLayer(0.5)
fullyConnectedLayer(64)
reluLayer
];
% 训练选项
options = trainingOptions('adam', ...
'MaxEpochs', 50, ...
'MiniBatchSize', 32, ...
'Shuffle', 'every-epoch', ...
'Verbose', false);
% 训练网络
net = trainNetwork(signals, layers, options);
% 提取特征
dl_features = activations(net, signals, 'fullyConnectedLayer_1');
end
参考代码 遗传算法与和机械故障诊断向结合的matlab程序 www.youwenfan.com/contentcsu/63497.html
四、实际应用建议
4.1 参数调优指南
| 参数 | 推荐值 | 调优建议 |
|---|---|---|
| 种群大小 | 50~200 | 特征越多,种群越大 |
| 最大代数 | 100~500 | 复杂问题需要更多代数 |
| 交叉概率 | 0.7~0.9 | 较高有利于全局搜索 |
| 变异概率 | 0.01~0.1 | 较低避免破坏优良基因 |
4.2 特征选择策略
- 包裹式特征选择:使用分类器性能作为评价标准(本程序采用)
- 过滤式特征选择:使用统计指标(相关系数、互信息)
- 嵌入式特征选择:在模型训练中自动选择(L1正则化)
4.3 工程实施建议
- 数据质量:确保振动传感器安装牢固,避免松动
- 采样频率:至少是被测设备最高频率的2.56倍
- 样本平衡:各类故障样本数量尽量平衡
- 实时性:优化算法以满足在线诊断的实时要求
五、总结
本MATLAB程序实现了基于遗传算法的机械故障诊断系统,具有以下特点:
- 完整流程:从数据生成到性能评估的完整解决方案
- 智能优化:遗传算法自动优化特征选择和分类器参数
- 多故障诊断:支持多种故障类型的识别和分类
- 可视化分析:丰富的图表展示诊断结果和特征重要性
- 工程实用:可直接应用于实际工业设备故障诊断
该系统可用于:
- 旋转机械故障诊断(轴承、齿轮箱)
- 风力发电机状态监测
- 工业机器人健康评估
- 航空航天设备预测性维护