滚动轴承振动序列的预处理--CWRU数据集
下⽂的是⼀些关键数据处理的实现代码,整体代码见
-----------------------------分割线---------------------------------
试验中发现对返回数据的shape进⾏如下改进会更好⼀些:
对iteror_raw_data()中的返回值data维度降为1维。从⽽使得data_augment()部分返回值X变为⼆维数据,进⽽使得可以对X进⾏数据标准化
修改标准化部分内容
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 loadmat
def 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 =None
for 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()# ries
if label is None:
rai 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_ed):
""" 使⽤⾮0类别数据的数⽬,来对0类别数据进⾏降采样。
:param X: 增强后的振动序列
:param y: 类别标签0-9
:param low_c0: 第⼀个类别0样本的索引下标
:param high_c0: 最后⼀个类别0样本的索引下标
:param random_ed: 随机种⼦
:return X,y
"""
np.random.ed(random_ed)
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_ed,**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_ed)
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中调⽤和结果:
图1 在jupyter notebook中调⽤和结果
6. 写在最后
刚⼊⼿这个项⽬的时候,我从⼀个⼩⽩开始点滴积累和学习,⽹络上的资料繁多,搜集、整理、甄别、消化到最后应⽤到项⽬中,前期的过程花费了太多的时间和⼼⼒。现在回头看,常常这样想,如果当初有现成的数据处理或者是特征处理的流程和代码可供参考的话,今天这个项⽬应该会有更多的不⼀样。为了弥补这个遗憾,也为了想做这个项⽬的同学少⾛弯路,能够尽早地进⼊实质性的⼯作中,于是我将项⽬内容整理并分享在这⾥。由于受个⼈能⼒⽔平的限制,其中难免会有不当和错误,⾮常欢迎各位修改的意见,希望在彼此的交流中,⼤家能共同进步。附上。(项⽬没更新完全,因为有些东西还在试验中)