基于时域特征和频域特征组合的敏感特征集,再利用SVM或KNN传统分类器进行轴承故障诊断(python编程,代码有详细注释)

该文介绍了使用CWRU数据集对轴承故障进行诊断的过程,通过时域分析和频域分析提取特征,如均值、标准差和FFT。然后利用SVM和KNN分类器,基于选定的敏感特征(方差评价指标)进行故障分类,测试集准确率高,证明所选特征有效。
摘要由CSDN通过智能技术生成

1.文件夹介绍(使用的是CWRU数据集)

0HP-3HP四个文件夹装载不同工况下的内圈故障、外圈故障、滚动体故障和正常轴承数据。

这里以打开0HP文件为例进行展示,creat_data.py是处理原始数据的脚本,负责将原始数据切不重叠割成1024的固定长度的样本,切割完,生成的每类故障下有100个样本,一共400个样本。(样本被保存在data_0HP.npy文件里,对应的标签保存在label.npy文件)

code_SVM.py是SVM诊断的脚本,首先利用时域分析和频域分析的方法,获取11种时域特征,12种频域特征


# 计算时域特征
def calculate_time_domain_features(signal):
    features = []
    
    # 均值
    features.append(np.mean(signal))
    
    # 标准差
    features.append(np.std(signal))
    
    # 方根幅值
    features.append(np.sqrt(np.mean(np.square(signal))))
    
    # 均方根值
    features.append(np.sqrt(np.mean(np.square(signal))))
    
    # 峰值
    features.append(np.max(signal))
    
    # 波形指标
    features.append(np.mean(np.abs(signal)) / np.sqrt(np.mean(np.square(signal))))
    
    # 峰值指标
    features.append(np.max(np.abs(signal)) / np.mean(np.abs(signal)))
    
    # 脉冲指标
    features.append(np.max(np.abs(signal)))
    
    # 裕度指标
    features.append(np.max(np.abs(signal)) / np.sqrt(np.mean(np.square(signal))))
    
    # 偏斜度
    features.append(skew(signal))
    
    # 峭度
    features.append(kurtosis(signal))
    
    return features

 12种频域特征



# 计算频域特征
def calculate_frequency_domain_features(signal, sample_rate):
    features = []
    
    # 快速傅里叶变换
    spectrum = fft(signal)
    spectrum = np.abs(spectrum)[:len(spectrum)//2] # 取一半频谱
    
    #频域指标1
    features.append(np.mean(spectrum))
    
    # 频域指标2
    features.append(np.var(spectrum))
    
    # 频域指标3
    features.append(np.sqrt(np.mean(np.square(spectrum))))
    
    # 频域指标4
    features.append(np.max(spectrum) / np.sqrt(np.mean(np.square(spectrum))))
    
    # 频域指标5
    features.append(kurtosis(spectrum))
    
    # 频域指标6
    features.append(skew(spectrum))
    
    # 频域指标7
    features.append(np.max(spectrum))
    
    # 频域指标8
    features.append(np.min(spectrum))
    
    # 频域指标9
    features.append(np.max(spectrum) - np.min(spectrum))
    
    # 频域指标10
    features.append(np.max(np.abs(spectrum)) / np.mean(np.abs(spectrum)))
    
    # 频域指标11
    features.append(np.max(np.abs(spectrum)) / np.sqrt(np.mean(np.square(spectrum))))
    
    # 频域指标12
    peak_index = np.argmax(spectrum)
    peak_frequency = peak_index * sample_rate / len(spectrum)
    features.append(peak_frequency)
    
    return features

 .构建评价指标,从时域和频域一共23个指标中选出对故障特征最敏感的前4个特征,这里用的是方差评价指标,也可以选用其它的评价指标



# 选择前4个敏感特征
import numpy as np
from sklearn.model_selection import train_test_split

# 将特征集转换为NumPy数组
feature_set = np.array(feature_set)

# 计算评价指标(这里以方差为例)
scores = np.var(feature_set, axis=0)

# 选出最敏感的4个特征
selected_indices = np.argsort(scores)[-4:]
selected_features = feature_set[:, selected_indices]

2.分类器

获取前4种敏感特征后,输给SVM或KNN等传统分类器,以看效果

基于时域特征和频域特征组合的敏感特征集,再利用SVM或KNN传统分类器进行轴承故障诊断(python编程,代码有详细注释)_哔哩哔哩_bilibili

测试集准确率:

模型0HP1HP2HP3HP
SVM100%100%96.25%100%
KNN100%100%97.50%100%

 从测试集结果可以看出挑选出来的特征可以很好表征故障。

代码及数据放在压缩包里,解压缩可以直接运行

import numpy as np
from scipy.fft import fft
from scipy.stats import kurtosis, skew
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import MinMaxScaler
# -*- coding: utf-8 -*-

import numpy as np
from scipy.fft import fft
from scipy.stats import kurtosis, skew

import numpy as np
from keras.utils import np_utils
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'  # 设置字体为黑体
import numpy as np
from scipy.fft import fft
from scipy.stats import kurtosis, skew
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
#可以关注:https://mbd.pub/o/bread/ZJuZm5Zr

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个基本的SVM分类器代码,用于CWRU数据集中使用时域特征信号进行故障诊断。在这个例子中,我们将数据集中的每个样本表示为一个大小为1xN的向量,其中N是时域信号的长度。我们还将使用10倍交叉验证来评估SVM分类器的性能。 ```matlab % 读取数据集 load('cwru.mat'); % 设置参数 num_folds = 10; % 10倍交叉验证 num_classes = 4; % 类别数 num_features = size(X,2); % 特征数 % 初始化变量 accuracy = zeros(num_folds,1); confusion_matrix = zeros(num_classes,num_classes,num_folds); % 执行交叉验证 indices = crossvalind('Kfold',Y,num_folds); for fold = 1:num_folds % 将数据分为训练集和测试集 test_idx = (indices == fold); train_idx = ~test_idx; X_train = X(train_idx,:); Y_train = Y(train_idx,:); X_test = X(test_idx,:); Y_test = Y(test_idx,:); % 特征提取 % 这里我们将使用RMS、峭度和峰值因子作为时域特征 feats_train = [rms(X_train,2), kurtosis(X_train,0,2), max(abs(X_train),[],2)./rms(X_train,2)]; feats_test = [rms(X_test,2), kurtosis(X_test,0,2), max(abs(X_test),[],2)./rms(X_test,2)]; % 训练SVM分类器 svm_model = fitcecoc(feats_train,Y_train); % 预测标签 Y_pred = predict(svm_model,feats_test); % 计算准确率和混淆矩阵 accuracy(fold) = sum(Y_pred == Y_test)/length(Y_test); confusion_matrix(:,:,fold) = confusionmat(Y_test,Y_pred); end % 打印平均准确率和平均混淆矩阵 fprintf('Average accuracy: %.2f%%\n', mean(accuracy)*100); fprintf('Confusion matrix:\n'); mean_confusion_matrix = mean(confusion_matrix,3); disp(mean_confusion_matrix); ``` 请注意,上面的代码只是一个基本的示例,可以使用更复杂的特征提取方法来提高SVM分类器的性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度学习的奋斗者

你的鼓励是我努力的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值