4. 基于统计特征的PHM特征提取与选择
任务目标
本案例面向PHM(故障预测与健康管理)场景,从振动、温度等多通道传感器信号中提取均值、方差、峰值、均方根等统计特征,并通过相关性分析筛选出与故障状态强相关的关键特征,形成可用于后续诊断建模的特征子集。
实现方案
使用Python实现完整流程:构造多通道传感器信号样本(含正常与故障两种状态),提取时域统计特征,采用皮尔逊相关系数评估各特征与故障标签的相关性,按阈值筛选关键特征并输出结果。整个过程不依赖外部数据文件,可直接运行验证。
完整代码
import numpy as np
import pandas as pd
# ---------- 1. 构造模拟传感器数据(振动+温度,正常/故障各50个样本) ----------
np.random.seed(42)
n_samples = 100
t = np.linspace(0, 1, 500)
def generate_signal(fault=False):
"""生成单样本振动+温度信号"""
vib_base = 2.0 * np.sin(2 * np.pi * 50 * t)
temp_base = 25.0 + 5.0 * np.sin(2 * np.pi * 0.5 * t)
if fault:
# 故障:振动幅值增大+冲击成分,温度均值升高
vib = vib_base * 1.8 + 0.8 * np.random.randn(500) + 3.0 * np.exp(-((t - 0.3) ** 2) / 0.001)
temp = temp_base + 8.0 + 1.5 * np.random.randn(500)
else:
vib = vib_base + 0.3 * np.random.randn(500)
temp = temp_base + 0.5 * np.random.randn(500)
return vib, temp
# ---------- 2. 特征提取函数 ----------
def extract_features(vib, temp):
"""从振动和温度信号中提取统计特征"""
features = {}
# 振动特征
features['vib_mean'] = np.mean(vib)
features['vib_var'] = np.var(vib)
features['vib_peak'] = np.max(np.abs(vib))
features['vib_rms'] = np.sqrt(np.mean(vib ** 2))
features['vib_std'] = np.std(vib)
# 温度特征
features['temp_mean'] = np.mean(temp)
features['temp_var'] = np.var(temp)
features['temp_peak'] = np.max(temp)
features['temp_range'] = np.max(temp) - np.min(temp)
return features
# ---------- 3. 生成数据集 ----------
data_rows = []
labels = []
for i in range(n_samples):
fault = i >= n_samples // 2 # 前50正常,后50故障
vib, temp = generate_signal(fault)
feat = extract_features(vib, temp)
feat['fault_label'] = int(fault)
data_rows.append(feat)
df = pd.DataFrame(data_rows)
X = df.drop('fault_label', axis=1)
y = df['fault_label']
# ---------- 4. 相关性分析与特征选择 ----------
corr = X.apply(lambda col: np.corrcoef(col, y)[0, 1])
corr_df = pd.DataFrame({'feature': corr.index, 'correlation': corr.values})
corr_df['abs_corr'] = corr_df['correlation'].abs()
corr_df = corr_df.sort_values('abs_corr', ascending=False)
# 筛选阈值:|相关系数| > 0.5 视为关键特征
threshold = 0.5
selected = corr_df[corr_df['abs_corr'] > threshold]['feature'].tolist()
# ---------- 5. 输出结果 ----------
print("=== 特征与故障标签的相关系数(按值降序)===")
print(corr_df.to_string(index=False))
print(f"\n筛选阈值: |r| > {threshold}")
print(f"关键特征数量: {len(selected)}")
print(f"关键特征列表: {selected}")
# 输出关键特征子集数据(供后续建模使用)
X_selected = X[selected]
print(f"\n关键特征子集形状: {X_selected.shape}")
运行方式
- 安装依赖:
pip install numpy pandas - 将上述代码保存为
feature_selection.py - 执行:
python feature_selection.py
验证方法与判定标准
程序运行后应观察到:
- 相关系数表中,振动幅值相关特征(
vib_peak、vib_rms、vib_std、vib_var)与故障标签的相关系数值明显较高(通常大于0.8); - 温度均值特征(
temp_mean)相关系数值也较高(约0.7~0.9); - 筛选出的关键特征数量约为5~6个,且包含上述强相关特征;
- 输出特征子集形状为
(100, 5)或(100, 6),与关键特征数量一致。
若输出结果符合上述规律,说明特征提取与选择流程正确,筛选出的特征子集可用于后续PHM故障诊断模型训练。
关键说明
本案例使用模拟信号验证方法流程,实际工程中只需将generate_signal替换为真实传感器数据读取逻辑(如从CSV或数据库中加载振动、温度通道数据),后续特征提取与选择代码无需改动。相关系数阈值0.5为经验值,实际应用中可根据特征数量与业务需求调整。