news 2026/5/1 7:33:19

基于五维几何不变性特征融合的机械故障诊断方法(Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于五维几何不变性特征融合的机械故障诊断方法(Python)

代码实现了一个基于五维几何理论融合的机械故障诊断模型。

首先系统从振动信号文件中加载数据,对原始振动信号进行去直流分量和标准化预处理,然后将长信号分割成固定长度的样本段。核心创新在于同时运用五种不同的几何理论(仿射几何、共形几何、旋量几何、双曲几何和张量几何)从同一振动信号中提取互补的特征表示:仿射几何提取尺度、剪切和平移不变的特征;共形几何关注角度保持特性,通过希尔伯特变换分析相位信息;旋量几何处理旋转和方向信息,将信号转换为四元数表示;双曲几何在负曲率空间中分析信号结构,使用双曲正切和对数变换;张量几何则处理高阶数据结构,通过协方差矩阵和特征值分析捕捉信号的深层结构特征。

接着,系统将这五种几何特征进行维度对齐和拼接融合,形成综合特征向量,然后使用梯度提升树分类器进行训练。在训练过程中,系统自动检测并处理数值异常,确保稳定性,最终在测试集上评估模型性能,输出精确的分类结果、混淆矩阵和特征重要性分析,实现轴承正常状态、滚珠故障、外圈故障和内圈故障四类状态的高精度智能诊断。

详细算法步骤

第一步:数据准备阶段

系统首先读取四种不同状态的轴承振动信号数据文件,分别对应正常运转、滚珠故障、外圈故障和内圈故障。对每个原始振动信号进行预处理,消除直流偏置分量使信号零均值化,接着进行标准化处理使不同信号具有可比性。然后将长时振动信号按照固定长度和重叠率切割成多个样本片段,每个样本片段标注对应的故障类型标签,形成标准化的样本数据集。

第二步:五维几何特征并行提取

系统同步启动五种不同的几何特征提取引擎。仿射几何引擎计算信号的仿射不变矩特征,捕捉信号在尺度变化、剪切变形和平移情况下的不变特性。共形几何引擎通过希尔伯特变换获得解析信号,提取相位角度特征和多尺度形状特征,重点关注信号的角度保持性质。旋量几何引擎将信号映射到四元数空间,分析信号的旋转方向和姿态变化特征。双曲几何引擎将信号投影到负曲率空间,通过双曲正切和对数变换提取信号在非欧几何空间中的结构特征。张量几何引擎构建信号的高阶张量表示,通过协方差分析和特征值分解捕捉信号的深层统计结构特征。

第三步:特征融合与对齐

将五种几何理论提取的特征向量进行维度统一处理,通过截断或填充确保各特征维度一致。接着按照样本顺序将五种特征水平拼接,形成每个样本的综合特征表示。系统自动检测融合特征中的数值异常,使用中位数策略填充缺失值,最后对整体特征矩阵进行标准化处理,使各特征维度具有零均值和单位方差。

第四步:智能分类模型构建

将标准化后的特征数据集划分为训练集和测试集,保持各类别样本比例一致。采用梯度提升树算法构建分类模型,设置适当的树深度、学习率和正则化参数。训练过程中启用早停机制,当验证集性能不再提升时自动终止训练,防止模型过拟合。在训练集上优化模型参数,使模型能够准确区分四种轴承状态。

第五步:性能评估与可视化

使用训练好的模型对测试集样本进行状态预测,计算整体分类准确率、精确率、召回率和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等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:21:32

基于仿射不变性-复流形结构-芬斯勒度量-子流形嵌入四维几何融合的机械故障诊断方法(Python)

核心流程首先从原始振动信号出发&#xff0c;通过多几何并行的特征提取架构同时进行四个维度的几何分析&#xff1a;在仿射几何维度&#xff0c;系统计算信号的仿射不变量矩、仿射曲率和仿射弧长等特征&#xff0c;这些特征在尺度变换、剪切变形和平移操作下保持不变&#xff0…

作者头像 李华
网站建设 2026/5/1 7:23:57

SPI 驱动 WS2812 GD32方案

遇到的大坑&#xff1a; 1.spi一定要选&#xff1a; 跳变沿选第二个&#xff08;2Edge&#xff09;模式 因为跳变沿为 1 的话&#xff0c;MOSI 的空闲电平为高电平&#xff0c;为 2 的话则会延续上次发送的最后电平&#xff0c;我们发送数据的末尾都是低电平&#xff0c;这样 W…

作者头像 李华
网站建设 2026/4/20 20:40:15

5分钟上手IndexTTS 2.0,中文多音字发音终于准了

5分钟上手IndexTTS 2.0&#xff0c;中文多音字发音终于准了 你有没有被这些声音问题卡住过&#xff1f; “重”字读成“zhng”还是“chng”&#xff1f; “行”在“银行”里发“hng”&#xff0c;在“行动”里却要念“xng”——AI一开口就错&#xff1b; 配音时语速快了&#…

作者头像 李华
网站建设 2026/4/23 20:55:05

Z-Image-Turbo无法访问?7860端口问题排查全流程

Z-Image-Turbo无法访问&#xff1f;7860端口问题排查全流程 1. 问题定位&#xff1a;为什么打不开 http://localhost:7860&#xff1f; 你兴冲冲地执行完 bash scripts/start_app.sh&#xff0c;终端也显示了那行让人安心的提示&#xff1a; 启动服务器: 0.0.0.0:7860 请访问…

作者头像 李华