滚动轴承振动序列的预处理--CWRU数据集
下文的是一些关键数据处理的实现代码,整体代码见我的Github
-----------------------------分割线---------------------------------
试验中发现对返回数据的shape进行如下改进会更好一些:
- 对iteror_raw_data()中的返回值data维度降为1维。从而使得data_augment()部分返回值X变为二维数据,进而使得可以对X进行数据标准化
- 修改标准化部分内容
- 其余内容见我的Github
1.内容
对CWRU轴承数据集中12kDriveEndBearingFaultData进行:
- 读取指定的.mat文件;
- 标签标注和数据提取;
- 数据增强处理;
- 标准化设计;
- 对标签为"normal"的数据进行降采样;
2.读取mat文件和数据标注
这部分的思路是,通过scipy.io.loadmat 载入指定的mat文件("FE"或者“DE”数据),然后设计一个(X,y)的生成器来返回数据和数据标签;其中,X表示数据data, y是数据标签label。
import os
from scipy.io import loadmatdef iteror_raw_data(data_path,data_mark):""" 打标签,并返回数据的生成器:标签,样本数据。:param data_path:.mat文件所在路径:param data_mark:"FE" 或 "DE" :return iteror:(标签,样本数据)""" # 标签数字编码labels = {"normal":0, "IR007":1, "IR014":2, "IR021":3, "OR007":4,"OR014":5, "OR021":6}# 列出所有文件filenams = os.listdir(data_path)# 逐个对mat文件进行打标签和数据提取for single_mat in filenams: single_mat_path = os.path.join(data_path, single_mat)# 打标签label = Nonefor key, _ in labels.items():if key in single_mat:label = labels[key]# 数据提取file = loadmat(single_mat_path)for key, _ in file.items():if data_mark in key:data = file[key].ravel() # seriesif label is None:raise ValueError("标签没有打上,label 不应该是None")yield label, data
3.数据增强处理
本部分在哈工大张伟的硕士论文《基于卷积神经网络的轴承故障诊断算法研究》的基础上进行了改进:(1)以时间长度s来度量数据的长度、滑动窗口的长度、重叠量的长度。目的是为了使程序适应不同采样频率的数据集。(2)将数据标准化设计为可选操作,这样满足对原始数据和标准化后数据的同时查看的需求,使得数据的处理更加灵活。
import numpy as np
import random
from sklearn.preprocessing import scale, StandardScaler, MinMaxScaler
from collections import Counter
def data_augment(fs, win_tlen, overlap_rate, data_iteror):""":param win_tlen: 滑动窗口的时间长度:param overlap_rate: 重叠部分比例, [0-100],百分数;overlap_rate*win_tlen*fs//100 是论文中的重叠量。:param fs: 原始数据的采样频率:param data_iteror: 原始数据的生成器格式:return (X, y): X, 切分好的数据, y数据标签X[0].shape == (win_len,)X.shape == (N, win_len)"""overlap_rate = int(overlap_rate)# 窗口的长度,单位采样点数win_len = int(fs*win_tlen)# 重合部分的时间长度,单位采样点数overlap_len = int(win_len * overlap_rate / 100)# 步长,单位采样点数step_len = int(win_len - overlap_len) # 滑窗采样增强数据 X = []y = []for iraw_data in data_iteror: single_raw_data = iraw_data[1].ravel()lab = iraw_data[0]len_data = single_raw_data.shape[0]for start_ind, end_ind in zip(range(0, len_data-win_len, step_len), range(win_len, len_data, step_len)):X.append(single_raw_data[start_ind:end_ind].ravel())y.append(lab)X = np.array(X) y = np.array(y)return X, y
4. 数据降采样
这部分程序的鲁棒性不是很好,只能适应于CWRU数据集,其他数据集上慎用。在本文所采用的数据集上,经过上述程序操作后,得到的数据有两个特征:(1)数据是按标签有序排列。(2)normal标签(0)的增强处理后数据数量是其他标签的两倍,而其他标签数据数量基本相等。
基于上述事实,所以该部分采取的降采样策略是,将增强处理后的normal标签(0)数据随机删除一半。代码如下:
def under_sample_for_c0(X, y, low_c0, high_c0, random_seed):""" 使用非0类别数据的数目,来对0类别数据进行降采样。:param X: 增强后的振动序列:param y: 类别标签0-9:param low_c0: 第一个类别0样本的索引下标:param high_c0: 最后一个类别0样本的索引下标:param random_seed: 随机种子:return X,y"""np.random.seed(random_seed)to_drop_ind = random.sample(range(low_c0, high_c0), (high_c0 - low_c0 + 1) - len(y[y==3])) # 按照行删除 X = np.delete(X,to_drop_ind,0)y = np.delete(y,to_drop_ind,0)return X, y
5. 整体处理流程
def preprocess(path, data_mark, fs, win_tlen, overlap_rate, random_seed, **kargs):data_iteror = iteror_raw_data(path, data_mark)X, y = data_augment(fs, win_tlen, overlap_rate, data_iteror, **kargs)# 降采样,随机删除类别0中一半的数据low_c0 = np.min(np.argwhere(y==0))high_c0 = np.max(np.argwhere(y==0))X, y = under_sample_for_c0(X, y, low_c0, high_c0, random_seed)print("-> 数据位置:{}".format(path))print("-> 原始数据采样频率:{0}Hz,\n-> 数据增强和0类数据降采样后共有:{1}条," .format(fs, X.shape[0]))print("-> 单个数据长度:{0}采样点,\n-> 重叠量:{1}个采样点,".format(X.shape[1], int(overlap_rate*win_tlen*fs // 100)) )print("-> 类别数据数目:", sorted(Counter(y).items()))return X, y
代码在jupyter notebook中调用和结果:
6. 写在最后
刚入手这个项目的时候,我从一个小白开始点滴积累和学习,网络上的资料繁多,搜集、整理、甄别、消化到最后应用到项目中,前期的过程花费了太多的时间和心力。现在回头看,常常这样想,如果当初有现成的数据处理或者是特征处理的流程和代码可供参考的话,今天这个项目应该会有更多的不一样。为了弥补这个遗憾,也为了想做这个项目的同学少走弯路,能够尽早地进入实质性的工作中,于是我将项目内容整理并分享在这里。由于受个人能力水平的限制,其中难免会有不当和错误,非常欢迎各位修改的意见,希望在彼此的交流中,大家能共同进步。附上该部分的GitHub链接。(项目没更新完全,因为有些东西还在试验中)
滚动轴承振动序列的预处理--CWRU数据集相关推荐
- 使用DL4J对CWRU数据集进行简单分类
目录 0. 前言 1. 关于CWRU数据集 2. 数据读取 3.数据预处理 4. 训练 0. 前言 最近开始搞智能故障诊断方面的工作,一上来面对的就是要各种炼丹.虽然众所周知在炼丹方面是python比 ...
- python实战故障诊断之CWRU数据集(一):数据集初识
文章目录 1. 概述 2. CWRU数据集简介 2.1. 试验设施简介 2.2. 试验数据简介 3. 轴承数据初步探索 4. 轴承的故障特征频率探索 1. 概述 在完成了振动信号处理的基础篇与高级 ...
- 凯斯西储轴承数据CWRU数据集制作十分类
凯斯西储轴承数据CWRU数据集制作 问题描述 解决办法 问题描述 凯斯西储轴承数据CWRU数据集制作预处理代码. 解决办法 基于开源代码的改进. import os from scipy.io imp ...
- criteo 点击率预估_预处理criteo数据集以预测广告的点击率
criteo 点击率预估 Amany Abdelhalim阿曼尼·阿卜杜勒哈林 Follow跟随 Sep 18 九月18 Preprocessing Criteo Dataset for Predic ...
- 【地图匹配(ST-matching)】GPS 轨迹数据预处理——T-Driver数据集【持续更新中】
一.数据介绍 1.数据链接 https://download.csdn.net/download/skyman30/87432266?spm=1001.2014.3001.5503https://do ...
- 【Scikit-Learn 中文文档】34 预处理数据 - 数据集转换 - 用户指南 | ApacheCN
中文文档: http://sklearn.apachecn.org/cn/stable/modules/preprocessing.html 英文文档: http://sklearn.apachecn ...
- python实现序列数据预处理_Python笔记:序列处理函数
len() : 返回字符串长度 a = "123456789" len(a) 1 2 a="123456789" len(a) 返回 9 ,即为a字符串的长度 ...
- python实战故障诊断之CWRU数据集(五):线性判别模型及二次判别模型的应用
文章目录 1. 概述 2. 相关原理 2.1 Fish_score 2.2 线性判别模型和二次判别模型 3. 代码实现过程 4. Tips 1. 概述 本章节通过分析轴承振动数据得到了系列信号特征 ...
- python实战故障诊断之CWRU数据集(二):异常数据剔除及包络解调初步探索
文章目录 1. 概述 2. 异常数据探索 2.1. 电噪声干扰 2.2. 驱动端与风扇端传感器信号混淆 2.3. 分段采集信号整合 3. 正常信号的平方包络解调分析 1. 概述 在完成了CWRU数 ...
最新文章
- Windows Server 2016-Netdom Join加域并指定OU (一)
- 深入理解CPU的调度原理
- 飞鸽传书文件传输实现原理
- luaL_setfunc设置upvalue的用法示例
- 音视频开发(13)---视频监控系统必须知道的一些基础知识
- 全程回顾|罗永浩直播带货首秀
- html5中的web storage的用法
- 机器人系统辨识——基于MATLAB的非线性系统辨识
- 人脸识别技术已成考勤门禁行业发展趋势
- PHP解密PHP加密sg11加密sg11解密全网最厚道的SG11解密方法sg11解密 php解密 SourceGuardian解密sg_load解密去除域名IP授权
- thinkpad e480安装win7
- Swift游戏实战-跑酷熊猫 08 产生源源不断的移动平台
- 仿百度文库文档上传页面的多级联动分类选择器
- git本地库案例-找回删除的文件
- 模拟双色球系统判断中奖情况
- 快速集成微信支付和支付宝支付
- 这心态也太好了!阿水赛前与kid双排狂说骚话:赢了血赚输了不亏
- 获取大麦网孟鹤堂演出数据并播报和在右下角弹窗提示
- UE4中的玩家类UPlayer、ULocalPlayer 和 UNetConnection
- Vue.js 响应式原理