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}")

运行方式

  1. 安装依赖:pip install numpy pandas
  2. 将上述代码保存为 feature_selection.py
  3. 执行: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为经验值,实际应用中可根据特征数量与业务需求调整。