在工业设备监测、生物医学信号分析等领域,原始传感器信号往往包含大量噪声和冗余信息。直接将这些原始数据输入机器学习模型,不仅计算效率低下,还会影响模型性能。特征提取的核心目标,就是从原始信号中提炼出具有物理意义和判别性的关键指标。
我参与过多个振动监测项目,深刻体会到特征提取的质量直接决定后续诊断模型的准确率。比如在轴承故障诊断中,时域指标中的峭度系数对早期点蚀故障极为敏感,而频域的重心频率偏移则能有效识别齿轮箱的齿面磨损。这些特征就像给机器"把脉"时捕捉的关键脉搏特征。
matlab复制function [mean_val, std_val] = basic_stats(signal)
% 均值反映信号直流分量
mean_val = mean(signal);
% 标准差表征信号波动强度
std_val = std(signal);
end
在旋转机械监测中,我们特别关注以下特征组合:
实际项目中要注意:时域特征对采样率敏感,建议统一采样频率后再比较不同设备的数据。
无量纲指标的最大优势是对信号幅值不敏感,这使得不同传感器、不同增益设置下的数据可以直接比较。在去年某风电项目中发现:
这些指标的组合能构建出非常直观的故障指纹图。
matlab复制function [f, P] = compute_psd(signal, fs)
% 使用周期图法计算功率谱
[P, f] = periodogram(signal, [], [], fs);
% 工程实践中建议加窗处理
window = hann(length(signal));
[P, f] = periodogram(signal, window, [], fs);
end
在计算频域特征时,我总结出几个经验:
某电机故障诊断案例中:
特别要注意的是,均方根频率对高频噪声非常敏感,在使用前建议先做1kHz以上的带阻滤波。
matlab复制function [E] = wavelet_energy(signal)
% 使用db4小波进行3层分解
T = wpdec(signal, 3, 'db4');
% 提取各节点能量
for i = 1:7
E(i) = norm(wpcoef(T, i), 2)^2;
end
E = E/sum(E); % 能量归一化
end
在轴承诊断项目中,我们发现:
建议先用已知故障数据标定敏感节点,再建立监测阈值。
变分模态分解(VMD)对非平稳信号效果显著,但参数设置很关键:
某水轮机振动分析案例显示,VMD结合能量熵能提前2周预警推力轴承异常,比传统方法更灵敏。
不同特征的量纲差异巨大,必须进行标准化:
matlab复制% Z-score标准化
fea_norm = (fea - mean(fea))./std(fea);
% 或者采用[0,1]归一化
fea_norm = (fea - min(fea))./(max(fea)-min(fea));
建议采用三级筛选:
在某压缩机项目中,经过筛选后特征维度从22维降至8维,模型准确率反而提高了5%。
对于在线监测系统,我总结了几点性能优化经验:
以某风机齿轮箱振动数据为例:
matlab复制% 数据加载
load('vibration.mat'); % 振动信号x, 采样率fs=10kHz
% 特征配置
feature_set = {'mean','kurtosis','FC','waveletE'};
% 特征提取
options.waveletType = 'db4';
fea = genFeature(x, fs, feature_set, options);
% 故障诊断模型输入
model = load('SVM_model.mat');
pred = predict(model, fea);
这个流程在实际项目中帮助我们将故障识别准确率从82%提升到93%,误报率降低60%。关键是要根据具体设备特性调整特征组合,比如对低速重载设备应增加脉冲类指标权重。