核心流程首先从原始振动信号出发,通过多尺度小波变换提取时频域特征,同时利用辛几何相空间重构技术将一维信号转换为保持相空间体积和能量结构的辛对称矩阵;接着,算法采用最优传输理论中的Wasserstein距离来衡量辛矩阵之间的相似性,构建基于最优传输的图结构,并通过谱嵌入方法将高维辛矩阵降维;同时,将辛矩阵投影到流形切空间得到辛几何特征向量;然后将小波特征和辛几何特征进行维度对齐和融合,形成综合了时频信息和几何结构的复合特征;最后,使用梯度提升树分类器在融合特征上进行训练和分类,实现对轴承四种工作状态(正常、滚珠故障、外圈故障、内圈故障)的智能诊断。
整个流程结合了信号处理、微分几何、最优传输理论和机器学习,形成了一套完整的故障诊断方法。
详细算法步骤
第一步,数据采集与预处理阶段,系统首先从轴承振动传感器获取原始的一维时序振动信号,对这些信号进行去除直流分量和标准化处理,然后将长序列分割成固定长度的重叠样本段,为后续分析准备规整的数据格式。
第二步,多尺度小波特征提取阶段,对每个振动信号样本进行多层级的小波分解,在不同尺度上提取小波系数的统计特征,包括均值、标准差、能量、熵值等时频域指标,接着通过主成分分析对这些高维特征进行降维处理,保留主要信息的同时减少特征维度。
第三步,辛几何相空间重构阶段,采用延迟坐标法将一维振动信号重构为高维相空间轨迹,基于辛几何理论构造保持相空间体积和能量结构的辛对称矩阵,这些矩阵能够反映系统的动力学特性。
第四步,最优传输图嵌入阶段,创新性地使用Wasserstein距离计算辛矩阵之间的相似性,这种距离度量比传统的欧氏距离更能反映概率分布差异,基于最优传输距离构建样本间的亲和力图,然后利用谱图理论将高维辛矩阵嵌入到低维空间。
第五步,辛流形切空间投影阶段,在辛矩阵构成的流形上计算Karcher均值作为参考点,将所有辛矩阵通过对数映射投影到该参考点的切空间,得到向量形式的辛几何特征。
第六步,特征融合阶段,将小波特征向量与辛几何特征向量进行维度对齐,然后拼接形成综合特征,这种融合策略同时捕捉了信号的时频特性和系统的几何结构特性。
第七步,模型训练阶段,使用梯度提升树算法在融合特征上训练分类模型,通过集成多个弱学习器构建强分类器,学习不同故障模式的特征模式。
第八步,故障诊断阶段,对新的振动信号依次进行相同的特征提取和融合流程,然后输入训练好的模型进行预测,输出轴承的故障类型诊断结果,同时提供置信度评估。
第九步,可视化分析阶段,系统生成多维度的可视化图表,包括特征分布图、混淆矩阵、性能指标对比等。
整个系统在训练集和测试集上均实现了100%的准确率和F1分数,对4种轴承工作状态(正常、滚珠故障、外圈故障、内圈故障)实现了完全准确的分类识别;这一优异性能得益于系统创新性地将信号处理、微分几何、最优传输理论和机器学习深度融合,首先通过多尺度小波变换从原始振动信号中提取了46维时频域统计特征并降维至20维保留95.3%的方差信息,同时利用辛几何相空间重构技术将一维信号转换为6×6的辛对称矩阵以保持相空间的体积和能量结构,进而采用最优传输理论中的Wasserstein距离度量辛矩阵间的相似性并构建图结构进行谱嵌入降维,再将辛矩阵投影到流形切空间得到几何特征,最终将20维小波特征与20维辛几何特征融合形成40维综合特征输入梯度提升树分类器进行训练和预测;系统在824个样本的数据集上经过8分37秒的完整训练流程,在248个测试样本上取得了所有类别精度、召回率和F1分数均为1.0000的完美表现,验证了辛几何保持动力学结构、最优传输提供鲁棒相似性度量、多尺度小波捕捉时频特征以及特征融合增强表征能力的理论优势,形成了一套兼具理论创新性和实际应用价值的轴承故障智能诊断解决方案。
import numpy as np import pandas as pd from scipy.linalg import logm, expm, eigvals, eig, sqrtm from scipy.spatial.distance import cdist from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier from sklearn.metrics import classification_report, accuracy_score, confusion_matrix, f1_score from sklearn.decomposition import PCA, KernelPCA from sklearn.manifold import TSNE, LocallyLinearEmbedding import matplotlib.pyplot as plt import matplotlib import warnings warnings.filterwarnings('ignore') from tqdm import tqdm import os import pywt import seaborn as sns #pip install POT import ot # Python Optimal Transport library from scipy.optimize import linear_sum_assignment import networkx as nx # 设置样式 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 SymplecticPhaseSpaceReconstruction: """辛几何相空间重构 - 创新点1:使用辛几何保持相空间的体积和能量结构""" def __init__(self, embedding_dim=6, tau=1): self.embedding_dim = embedding_dim self.tau = tau def reconstruct(self, signal): """辛几何相空间重构,返回辛对称矩阵""" n = len(signal) # 确保参数有效 embedding_dim = min(self.embedding_dim, n // 2) if embedding_dim < 2: embedding_dim = 2 tau = self.tau trajectory_length = n - (embedding_dim - 1) * tau if trajectory_length <= embedding_dim: embedding_dim = max(2, min(embedding_dim, trajectory_length - 1)) tau = 1 trajectory_length = n - (embedding_dim - 1) * tau # 构建辛相空间轨迹矩阵 trajectory = np.zeros((trajectory_length, embedding_dim)) for i in range(embedding_dim): start_idx = i * tau end_idx = start_idx + trajectory_length trajectory[:, i] = signal[start_idx:end_idx] # 计算轨迹的辛结构矩阵 # 辛矩阵满足 J^T Ω J = Ω,其中Ω是标准辛矩阵 symplectic_matrix = self._compute_symplectic_matrix(trajectory) return symplectic_matrix参考文章:
基于辛几何流形学习和最优传输理论的多尺度小波特征融合机械故障诊断方法(Python) - 哥廷根数学学派的文章
https://zhuanlan.zhihu.com/p/1986350085949383337
工学博士,担任《Mechanical System and Signal Processing》审稿专家,担任
《中国电机工程学报》优秀审稿专家,《控制与决策》,《系统工程与电子技术》,《电力系统保护与控制》,《宇航学报》等EI期刊审稿专家。
擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。