代码实现了一个基于五维几何理论融合的机械故障诊断模型。
首先系统从振动信号文件中加载数据,对原始振动信号进行去直流分量和标准化预处理,然后将长信号分割成固定长度的样本段。核心创新在于同时运用五种不同的几何理论(仿射几何、共形几何、旋量几何、双曲几何和张量几何)从同一振动信号中提取互补的特征表示:仿射几何提取尺度、剪切和平移不变的特征;共形几何关注角度保持特性,通过希尔伯特变换分析相位信息;旋量几何处理旋转和方向信息,将信号转换为四元数表示;双曲几何在负曲率空间中分析信号结构,使用双曲正切和对数变换;张量几何则处理高阶数据结构,通过协方差矩阵和特征值分析捕捉信号的深层结构特征。
接着,系统将这五种几何特征进行维度对齐和拼接融合,形成综合特征向量,然后使用梯度提升树分类器进行训练。在训练过程中,系统自动检测并处理数值异常,确保稳定性,最终在测试集上评估模型性能,输出精确的分类结果、混淆矩阵和特征重要性分析,实现轴承正常状态、滚珠故障、外圈故障和内圈故障四类状态的高精度智能诊断。
详细算法步骤
第一步:数据准备阶段
系统首先读取四种不同状态的轴承振动信号数据文件,分别对应正常运转、滚珠故障、外圈故障和内圈故障。对每个原始振动信号进行预处理,消除直流偏置分量使信号零均值化,接着进行标准化处理使不同信号具有可比性。然后将长时振动信号按照固定长度和重叠率切割成多个样本片段,每个样本片段标注对应的故障类型标签,形成标准化的样本数据集。
第二步:五维几何特征并行提取
系统同步启动五种不同的几何特征提取引擎。仿射几何引擎计算信号的仿射不变矩特征,捕捉信号在尺度变化、剪切变形和平移情况下的不变特性。共形几何引擎通过希尔伯特变换获得解析信号,提取相位角度特征和多尺度形状特征,重点关注信号的角度保持性质。旋量几何引擎将信号映射到四元数空间,分析信号的旋转方向和姿态变化特征。双曲几何引擎将信号投影到负曲率空间,通过双曲正切和对数变换提取信号在非欧几何空间中的结构特征。张量几何引擎构建信号的高阶张量表示,通过协方差分析和特征值分解捕捉信号的深层统计结构特征。
第三步:特征融合与对齐
将五种几何理论提取的特征向量进行维度统一处理,通过截断或填充确保各特征维度一致。接着按照样本顺序将五种特征水平拼接,形成每个样本的综合特征表示。系统自动检测融合特征中的数值异常,使用中位数策略填充缺失值,最后对整体特征矩阵进行标准化处理,使各特征维度具有零均值和单位方差。
第四步:智能分类模型构建
将标准化后的特征数据集划分为训练集和测试集,保持各类别样本比例一致。采用梯度提升树算法构建分类模型,设置适当的树深度、学习率和正则化参数。训练过程中启用早停机制,当验证集性能不再提升时自动终止训练,防止模型过拟合。在训练集上优化模型参数,使模型能够准确区分四种轴承状态。
第五步:性能评估与可视化
使用训练好的模型对测试集样本进行状态预测,计算整体分类准确率、精确率、召回率和F1分数等多维性能指标。
import numpy as np import pandas as pd from scipy.linalg import logm, expm, eigvals, eig, sqrtm, norm from scipy.spatial.distance import cdist from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.ensemble import RandomForestClassifier, HistGradientBoostingClassifier from sklearn.metrics import classification_report, accuracy_score, confusion_matrix, f1_score from sklearn.decomposition import PCA import matplotlib.pyplot as plt import matplotlib import warnings warnings.filterwarnings('ignore') from tqdm import tqdm import os import seaborn as sns from scipy.signal import hilbert import cmath # 设置样式 matplotlib.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans'] matplotlib.rcParams['axes.unicode_minus'] = False plt.style.use('seaborn-v0_8-darkgrid') # ============================== # 数据加载模块 # ============================== class AdvancedDataLoader: """增强版数据加载器""" def __init__(self, data_dir='data', sampling_freq=12000): self.data_dir = data_dir self.sampling_freq = sampling_freq self.label_map = { '98raw.txt': 0, # 正常状态 '106raw.txt': 1, # 滚珠故障 '119raw.txt': 2, # 外圈故障 '131raw.txt': 3 # 内圈故障 } self.label_names = { 0: 'Normal', 1: 'Ball Fault', 2: 'Outer Race Fault', 3: 'Inner Race Fault' } self.colors = ['#2E86AB', '#A23B72', '#F18F01', '#C73E1D'] def load_data(self, segment_length=2048, overlap=0.5): """加载数据""" X = [] y = [] for filename in os.listdir(self.data_dir): if filename.endswith('.txt'): filepath = os.path.join(self.data_dir, filename) label = self.label_map[filename] # 读取数据 data = pd.read_csv(filepath, header=None, names=['vibration']) signal = data['vibration'].values # 预处理 signal = signal - np.mean(signal) # 去除直流分量 signal = (signal - np.mean(signal)) / np.std(signal) # 标准化 # 分割成样本 step = int(segment_length * (1 - overlap)) for i in range(0, len(signal) - segment_length + 1, step): segment = signal[i:i + segment_length] X.append(segment) y.append(label) X = np.array(X) y = np.array(y) print(f"Data loaded successfully") print(f"Total samples: {len(X)}") print(f"Class distribution: {np.bincount(y)}") return X, y # ============================== # 仿射几何不变性特征提取模块 - 简化修复版 # ============================== class AffineInvariantFeatureExtractor: """仿射几何不变性特征提取 """ def __init__(self, n_invariants=15): self.n_invariants = n_invariants self.scaler = StandardScaler() def compute_affine_moments(self, signal): """计算仿射不变量矩 """ n = len(signal) x = np.arange(n) # 中心矩 mu_00 = np.sum(signal) # 归一化矩 eps = 1e-12 if mu_00 > eps: eta_10 = np.sum(x * signal) / mu_00 eta_01 = np.sum(signal**2) / mu_00 eta_20 = np.sum(x**2 * signal) / mu_00 else: eta_10 = eta_01 = eta_20 = 0 # 仿射不变量矩 invariants = [] # Hu矩 nu_20 = eta_20 - eta_10**2 nu_02 = eta_01 - eta_01**2 # 一阶不变量 I1 = nu_20 + nu_02 invariants.append(I1) # 二阶不变量 I2 = (nu_20 - nu_02)**2 invariants.append(I2) # 计算信号曲率特征 curvature_features = self._compute_curvature_invariants(signal) invariants.extend(curvature_features) # 确保没有NaN或Inf invariants = np.nan_to_num(invariants, nan=0.0, posinf=0.0, neginf=0.0) return np.array(invariants[:self.n_invariants]) def _compute_curvature_invariants(self, signal): """计算曲率仿射不变量 -""" n = len(signal) if n < 3: return [0] * 5 # 一阶差分 dx = np.gradient(signal) # 二阶差分 d2x = np.gradient(dx) # 计算曲率 - 安全版本 denominator = (1 + dx**2)**1.5 denominator = np.where(denominator < 1e-12, 1e-12, denominator) curvature = np.abs(d2x) / denominator # 曲率统计特征 if len(curvature) > 0: features = [ np.mean(curvature), np.std(curvature), np.max(curvature), np.sum(curvature**2) / len(curvature), # 曲率能量密度 np.sum(np.abs(np.diff(curvature))) / (len(curvature)-1) if len(curvature) > 1 else 0 # 曲率变化率 ] else: features = [0, 0, 0, 0, 0] return features参考文章:
基于五维几何不变性特征融合的机械故障诊断方法(Python) - 哥廷根数学学派的文章
https://zhuanlan.zhihu.com/p/1986574502679830934
工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任
《中国电机工程学报》优秀审稿专家,《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》,《宇航学报》等EI期刊审稿专家。
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。