工业数据分析应用
1.实验内容:
标记数据记录了正常轴承和受损轴承的转速信号波动情况,请用傅里叶变换构建分类特征,实现对轴承受损的分类识别
首先介绍一下要用到的原理👇
- 傅里叶变换的原理
傅里叶变换是一种数学工具,用于将一个时间域信号变换到频率域。它可以将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。傅里叶变换的基本原理是将一个复 杂的周期信号分解为若干个简单的正弦或余弦信号的叠加,这些简单的正弦或余弦信号的频率就是原信号的各个频率分量。
- 傅里叶变换应用
信号处理:傅里叶变换可以将-个时间域信号变换到频率域,使得我们可以更容易地观察和理解信号的特性。例如,有些信号在时间域上很难看出特征,但是当转换到频率域一些特 征就会变得明显。
2.思路:
1.读取数据:从文件中读取了异常信号和正常信号的数据
2.使用傅里叶变换提取特征:对转速信号进行傅里叶变换,并取其幅度作为特征。
3.构建特征集和标签集:将提取的特征与标签整合在一起
4.划分训练集和测试集:将特征集和标签集划分为训练集和测试集
5.训练决策树模型:使用训练集训练出决策树分类模型
6.预测并计算准确率:使用测试集对模型进行评估,计算模型准确率
3.代码实现:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
X = []
y = []
#异常信号
plt.figure(figsize=(15,8))
for i in range(10):
df1 = pd.read_csv('FAULT_'+str(i)+'.csv')
plt.plot(df1['转速']+np.random.randint(2,10))
X.append(df1['转速'].values+np.random.randint(2,10))
y.append(1)
plt.show()
#正常信号
plt.figure(figsize=(15,8))
for i in range(10):
df2 = pd.read_csv('NOFAULT_'+str(i)+'.csv')
plt.plot(df2['转速']+np.random.randint(2,10))
X.append(df2['转速'].values+np.random.randint(2,10))
y.append(0)
plt.show()
X = np.array(X)
y = np.array(y)
X.shape,y.shape
from scipy import fftpack
F = fftpack.fft(X)
F.shape
XF = (np.abs(F)[:,1:360])
plt.plot((XF[y==0,1:360]).T)
plt.ylim([0,140])
plt.show()
plt.plot((XF[y==1,1:360]).T)
plt.ylim([0,140])
plt.show()
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import LinearSVC
from sklearn.svm import SVC
from warnings import simplefilter
#各种模型
knn_clf = KNeighborsClassifier(n_neighbors=3)#KNN
gnb_clf = GaussianNB()#贝叶斯
dt_clf = DecisionTreeClassifier(min_samples_leaf=5)#决策树
rf_clf = RandomForestClassifier(n_estimators=5,random_state=666,oob_score=True)#随机森林
lsvc_clf = LinearSVC(C=1) #线性SVM
rbf_svc_clf = SVC(C=1,kernel='rbf',gamma=1)#高斯核函数SVM
clfs = {
'KNN':knn_clf,
'贝叶斯':gnb_clf,
'决策树':dt_clf,
'随机森林':rf_clf,
'LinearSVC':lsvc_clf,
'高斯核SVC':rbf_svc_clf,
}
for model in clfs:
clfs[model].fit(XF,y)
print(model,clfs[model].score(XF,y))