在工业设备维护领域,机械故障诊断一直是个极具挑战性的课题。传统方法往往依赖于简单的时频域分析,难以捕捉复杂工况下设备状态的细微变化。今天要分享的这个项目,我们采用了一种融合高维几何流形学习和最优传输理论的创新方法,通过Python实现了对轴承故障的精准诊断。
这套系统的核心思路是将振动信号映射到高维几何空间,从多个角度提取表征故障特征的几何信息。与常规方法相比,这种几何视角能够更全面地捕捉信号的拓扑结构和动态演化特性。在实际测试中,我们的模型达到了惊人的100%分类准确率,而且特征重要性分析显示,前13维特征就贡献了90%的鉴别力。
系统采用模块化设计,主要包含以下几个关键环节:
这种架构的优势在于:
基于图拉普拉斯算子,我们将信号视为图结构数据,通过谱分析提取全局连接特性。具体步骤包括:
这种方法特别适合捕捉信号中的周期性故障特征,比如轴承的周期性冲击。
曲率流模拟了热扩散过程,可以追踪信号局部几何特性的动态演化:
曲率流对信号的局部突变非常敏感,适合检测早期微弱故障。
将信号片段视为李群元素(特别是旋转矩阵),通过李代数分析其群结构特征:
这种方法保留了信号的相位信息,对某些类型的故障特别有效。
python复制class DataLoader:
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, # 滚珠故障
'131raw.txt': 2, # 外圈故障
'119raw.txt': 3 # 内圈故障
}
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)
return np.array(X), np.array(y)
关键参数选择考量:
python复制class AdvancedGeometryFeatureExtractor:
def calculate_curvature(self, signal):
"""计算曲率特征"""
try:
dy = savgol_filter(signal, self.window_size, self.polyorder, deriv=1)
d2y = savgol_filter(signal, self.window_size, self.polyorder, deriv=2)
curvature = np.abs(d2y) / (1 + dy**2)**1.5
return np.nan_to_num(curvature)
except:
dy = np.gradient(signal)
d2y = np.gradient(dy)
curvature = np.abs(d2y) / (1 + dy**2)**1.5
return np.nan_to_num(curvature)
def spectral_analysis(self, signal):
"""谱几何分析"""
# 构建相似性矩阵
dist_matrix = squareform(pdist(signal.reshape(-1,1)))
W = np.exp(-dist_matrix**2 / (2 * np.median(dist_matrix)**2))
# 计算拉普拉斯矩阵
D = np.diag(np.sum(W, axis=1))
L = np.eye(len(signal)) - np.dot(np.dot(np.linalg.inv(D), W), np.linalg.inv(D))
# 特征分解
eigvals = np.linalg.eigvalsh(L)
eigvals = np.sort(eigvals)[1:] # 去掉0特征值
# 提取特征
features = {
'spectral_entropy': -np.sum(eigvals * np.log(eigvals + 1e-10)),
'spectral_energy': np.sum(eigvals**2),
'spectral_slope': (eigvals[-1] - eigvals[0]) / len(eigvals)
}
return features
实际应用中发现几个关键点:
python复制def riemannian_features(signal, embed_dim=5):
"""黎曼流形特征提取"""
# 相空间重构
tau = 10 # 延迟时间
embedded = np.array([signal[i:i+embed_dim*tau:tau]
for i in range(len(signal)-embed_dim*tau)])
# 计算协方差矩阵
cov_matrices = np.array([np.cov(sig.T) for sig in embedded])
# 黎曼均值计算
mean_matrix = np.mean(cov_matrices, axis=0)
# 切空间投影
tangent_vectors = []
for C in cov_matrices:
log_map = logm(np.dot(np.linalg.inv(sqrtm(mean_matrix)),
np.dot(C, np.linalg.inv(sqrtm(mean_matrix)))))
tangent_vectors.append(log_map[np.triu_indices(embed_dim)])
return np.array(tangent_vectors).flatten()
注意事项:
python复制def feature_fusion(geo_features, riemann_features):
"""特征融合"""
# 标准化
geo_scaled = StandardScaler().fit_transform(geo_features)
riemann_scaled = StandardScaler().fit_transform(riemann_features)
# PCA降维
pca_geo = PCA(n_components=0.95)
geo_reduced = pca_geo.fit_transform(geo_scaled)
pca_riemann = PCA(n_components=0.95)
riemann_reduced = pca_riemann.fit_transform(riemann_scaled)
# 特征拼接
fused_features = np.hstack([geo_reduced, riemann_reduced])
return fused_features
融合过程中的经验:
python复制def train_model(X, y):
"""模型训练"""
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y)
# 参数网格
param_grid = {
'n_estimators': [100, 200],
'max_depth': [10, 20, None],
'min_samples_split': [2, 5],
'min_samples_leaf': [1, 2]
}
# 网格搜索
grid = GridSearchCV(RandomForestClassifier(),
param_grid,
cv=5,
scoring='accuracy',
n_jobs=-1)
grid.fit(X_train, y_train)
# 评估
best_model = grid.best_estimator_
y_pred = best_model.predict(X_test)
print(classification_report(y_test, y_pred))
return best_model
调参心得:
我们在测试集上获得了以下结果:
| 指标 | 值 |
|---|---|
| 准确率 | 100% |
| 精确率(宏) | 100% |
| 召回率(宏) | 100% |
| F1分数(宏) | 100% |
这种完美分类结果在实际应用中很少见,可能的原因包括:
前13个最重要特征的贡献度:
| 特征类型 | 平均重要性 |
|---|---|
| 谱几何特征 | 32% |
| 曲率流特征 | 28% |
| 黎曼流形特征 | 25% |
| 最优传输特征 | 15% |
可视化代码示例:
python复制def plot_feature_importance(model, feature_names):
"""绘制特征重要性"""
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
plt.figure(figsize=(10,6))
plt.title("Feature Importance")
plt.bar(range(len(indices)), importances[indices], align='center')
plt.xticks(range(len(indices)), [feature_names[i] for i in indices], rotation=90)
plt.tight_layout()
plt.show()
我们提供了多种可视化方式帮助理解诊断结果:
这些可视化不仅验证了模型效果,也为故障机理分析提供了直观依据。
在实际部署这套系统时,有几个关键点需要注意:
对于想要复现这个项目的工程师,我建议:
这个项目的完整代码已经整理成模块化结构,便于集成到现有监测系统中。对于特定应用场景,可能需要调整以下参数:
在实际应用中,这套方法不仅适用于轴承故障诊断,经过适当调整后也可用于齿轮箱、电机等其他旋转机械的故障诊断。关键在于理解设备的故障机理,选择合适的几何表征方法。