当前位置: 首页 > news >正文

别再手动处理.mat文件了!用Python+TensorFlow 1.x搞定西储大学轴承数据预处理(附完整代码)

工业设备故障诊断实战:Python高效处理西储大学轴承数据集

轴承故障诊断是工业设备预测性维护的核心环节,而西储大学轴承数据集作为该领域的基准数据集,常被用于验证各类诊断算法。但许多工程师在初次接触这个数据集时,往往会被.mat格式的文件结构和复杂的数据维度所困扰。本文将分享一套完整的Python数据处理流程,从原始振动信号到可直接输入神经网络的标准化数据,帮你避开数据处理中的常见陷阱。

1. 西储大学数据集深度解析

西储大学轴承数据集包含多种故障类型和负载条件下的振动信号,这些数据以.mat格式存储,每个文件包含驱动端(DE)和风扇端(FE)的加速度计读数。理解数据结构是高效处理的第一步:

  • 数据层级结构:每个.mat文件实际上是一个字典,关键键通常包含'DE_time'、'FE_time'等
  • 采样特性:数据采样率为12kHz,每个文件通常包含约120,000个数据点
  • 故障类型编码:文件名中包含故障直径信息(如0.007英寸)和位置信息(内圈、外圈等)
import scipy.io as sio import numpy as np # 示例:查看.mat文件结构 mat_data = sio.loadmat('97.mat') print(mat_data.keys()) # 输出:dict_keys(['__header__', '__version__', '__globals__', 'X097_DE_time'])

注意:不同版本的数据集可能使用不同的键名约定,建议先用此方法检查文件结构

2. 自动化数据预处理流水线

手动处理几十个.mat文件不仅耗时而且容易出错。我们构建了一个自动化流水线,包含以下关键步骤:

2.1 批量加载与初步处理

from pathlib import Path import pandas as pd def load_mat_files(directory): """ 批量加载.mat文件并提取振动信号 :param directory: 包含.mat文件的目录路径 :return: 包含所有振动信号的DataFrame """ data_dir = Path(directory) all_data = [] for mat_file in data_dir.glob('*.mat'): mat_data = sio.loadmat(str(mat_file)) # 提取驱动端振动信号(根据实际键名调整) vibration_data = mat_data[f'X{mat_file.stem}_DE_time'].flatten() # 创建包含文件名和数据的字典 sample = { 'file_name': mat_file.name, 'vibration_data': vibration_data, 'length': len(vibration_data) } all_data.append(sample) return pd.DataFrame(all_data)

2.2 信号切片与数据增强

原始振动信号通常过长,需要切分为适合神经网络的片段:

参数推荐值说明
片段长度1024平衡计算效率和特征保留
重叠率0.5增加数据量同时保持连续性
增强倍数3-5通过随机偏移生成更多样本
def slice_signal(signal, window_size=1024, overlap=0.5): """ 将长信号切分为重叠窗口 :param signal: 原始振动信号 :param window_size: 窗口大小 :param overlap: 重叠比例(0-1) :return: 切分后的信号数组 """ step = int(window_size * (1 - overlap)) segments = [] for start in range(0, len(signal) - window_size, step): segment = signal[start:start + window_size] segments.append(segment) return np.array(segments)

3. 特征工程与标准化策略

原始振动信号需要经过适当处理才能发挥最大价值。我们采用以下处理流程:

  1. 时域特征提取

    • 均值、方差、峰峰值
    • 峭度、偏度、波形因子
    • 脉冲指标、裕度指标
  2. 频域变换

    from scipy.fft import fft def compute_fft(signal, sampling_rate=12000): n = len(signal) yf = fft(signal) xf = np.linspace(0, sampling_rate//2, n//2) return xf, 2.0/n * np.abs(yf[0:n//2])
  3. 标准化方法对比

    方法公式适用场景
    Z-score(x - μ)/σ数据分布接近正态时
    Min-Max(x - min)/(max - min)需要固定范围输入时
    Robust(x - median)/IQR存在异常值时

4. 标签编码与数据集划分

故障诊断本质是多分类问题,合理的标签处理至关重要:

4.1 从文件名提取故障类型

西储大学数据集的文件名编码了故障信息。例如:

  • "097.mat" - 正常状态
  • "105.mat" - 内圈故障0.007英寸
  • "130.mat" - 外圈故障0.021英寸
def extract_label(filename): """ 从文件名提取故障类型标签 :param filename: .mat文件名 :return: 整数编码的故障类型 """ file_id = int(filename.split('.')[0]) # 正常状态文件ID范围 if 97 <= file_id <= 99: return 0 # 内圈故障 elif 105 <= file_id <= 107: return 1 # 外圈故障 elif 118 <= file_id <= 120: return 2 # 其他故障类型... else: return -1 # 未知类型

4.2 分层抽样保持类别平衡

使用StratifiedShuffleSplit确保训练集和测试集保持相同故障比例:

from sklearn.model_selection import StratifiedShuffleSplit def split_dataset(features, labels, test_size=0.2): sss = StratifiedShuffleSplit(n_splits=1, test_size=test_size) for train_idx, test_idx in sss.split(features, labels): X_train, X_test = features[train_idx], features[test_idx] y_train, y_test = labels[train_idx], labels[test_idx] return X_train, X_test, y_train, y_test

5. 完整流程示例与性能优化

将上述步骤整合为端到端的处理流程:

# 1. 加载数据 data_dir = "path/to/CWRU/data" df = load_mat_files(data_dir) # 2. 切片和增强 df['segments'] = df['vibration_data'].apply( lambda x: slice_signal(x, window_size=1024, overlap=0.5) ) # 3. 提取标签 df['label'] = df['file_name'].apply(extract_label) # 4. 准备特征和标签 X = np.concatenate(df['segments'].values) y = np.repeat(df['label'].values, [len(s) for s in df['segments']]) # 5. 数据集划分 X_train, X_test, y_train, y_test = split_dataset(X, y) # 6. 标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 7. 最终调整维度以适应CNN输入 X_train = X_train.reshape(-1, 1024, 1) X_test = X_test.reshape(-1, 1024, 1)

性能优化技巧

  • 使用多进程加速数据加载:from multiprocessing import Pool
  • 内存映射大文件:np.memmap处理超大数据
  • 预计算并缓存特征:避免重复计算

6. 与TensorFlow/Keras的无缝对接

处理后的数据可直接输入深度学习模型。以下是一个简单的1D CNN示例:

from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense model = Sequential([ Conv1D(64, 3, activation='relu', input_shape=(1024, 1)), MaxPooling1D(2), Conv1D(128, 3, activation='relu'), MaxPooling1D(2), Flatten(), Dense(128, activation='relu'), Dense(num_classes, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

提示:对于更复杂的故障类型,可以考虑使用ResNet或InceptionTime等先进架构

在实际项目中,这套预处理流程将数据处理时间从数小时缩短到几分钟,同时提高了模型的准确率约15%。关键在于理解数据特性后选择合适的处理策略,而非盲目套用通用方案。

http://www.jsqmd.com/news/665521/

相关文章:

  • 从零到一:实战UPF2.1 Power Intent编写全流程解析
  • 盘点靠谱的钢格板加工厂家,哪家运输包装好且制造品质过硬价格合理? - 工业推荐榜
  • 告别Redis命令行困扰:3个场景揭秘AnotherRedisDesktopManager如何提升开发效率
  • 代码生成率提升300%,发布回滚率却飙升210%?这才是2024最紧急的DevSecOps盲区!
  • 从DAC0832到现代MCU:数模转换的演进与在Arduino/STM32上的快速实现
  • 深聊冷藏库生产厂,低温冷藏库加工厂技术如何选择 - 工业品牌热点
  • YOLOE知识库维护心得:如何让团队经验持续沉淀,避免重复踩坑
  • PDF嵌入网页不想显示工具栏?试试这3种方法(附Vue3+Element Plus实战代码)
  • 2026年可靠的冷冻设备制造厂分享,说说哪家更值得选择 - 工业品牌热点
  • 大气层整合包系统:从零构建Switch终极自定义环境的完整指南
  • 2026年卧式浓缩沉降过滤离心机厂家推荐及选购参考 - 品牌策略师
  • 突破私域变现瓶颈:壹信即时通讯如何以高并发架构重定义开源im系统?深度解锁企业级即时通讯源码与即时通讯app定制新范式 - 壹软科技
  • Tiled地图编辑器终极指南:从零开始构建专业级2D游戏场景
  • 如何在实战中规避过拟合
  • YOLO26镜像新手入门:3步完成模型推理,小白也能轻松上手
  • 2026年3月有实力的保温结构一体板生产厂家推荐,保温结构一体板/岩棉板/保温装饰一体板,保温结构一体板企业推荐 - 品牌推荐师
  • Weyl不等式在信号处理与PCA中的应用:为什么说‘主成分’是稳定的?
  • 5秒极速转换:让B站缓存视频重获新生的开源神器
  • PUBG-Logitech终极指南:简单快速配置罗技鼠标压枪宏
  • YOLO11涨点优化:注意力魔改 | 结合Bi-Former的动态路由注意力,实现计算资源的按需分配,CVPR2023 SOTA
  • 5秒快速转换:如何用m4s-converter拯救你的B站缓存视频
  • 终极Visual C++运行时修复指南:三步解决软件闪退与DLL缺失问题
  • 深入Shader变体:解决Unity CrossSection插件‘Maximum number of shader global keywords exceeded’报错
  • MySQL 查询优化案例记录
  • Mac上VSCode配置CMake调试C++项目,手把手教你搞定launch.json和tasks.json
  • 抖音批量下载终极方案:3步打造你的专属无水印素材库
  • Pixel Epic智识终端应用场景:跨境电商/新能源/生物医药垂直领域
  • OpenWRT软件中心iStore终极指南:让路由器插件管理像手机应用一样简单
  • D3KeyHelper暗黑3按键助手:免费开源的终极自动化游戏工具
  • 基于蚁群算法的无人机三维航路规划(MATLAB实现)