西储大学CWRU轴承数据集进行SVM分类

 从头开始摸索,从完全没学过python和强化学习相关知识,到最终实现SVM分类的一路艰辛,记录一下!

1月13号补档:已经实现了基于QT软件的SVM和CNN模型训练和分类

 具体功能详见:支持深度学习的数据采集软件2.0版本,它来了!_哔哩哔哩_bilibili

一、数据集准备

关于数据集的介绍可以看这两篇文章 

西储大学(CWRU)数据集_西储大学轴承数据集-优快云博客

超级小白级入门—凯斯西储大学(CWRU)滚动轴承数据中心_西储大学轴承数据集-优快云博客

 通过网盘分享的文件:CWRU
链接: https://pan.baidu.com/s/1YTrrqP8sYN8S2rfJ48h6dw?pwd=jup6 提取码: jup6

二、数据集处理 

 这个地方涉及到python的语法,以及一些库函数的调用方法

这里分享以下思路吧(个人觉得思考的过程比较重要):

1.拿到数据集后,知道数据的类型是mat格式,如何去读取这种格式的数据?

这里不详细介绍如何去搭建自己的pytorch环境,可以去b站上找教程。

首先读入数据,看看里面是什么样的,找一下mat文件的读取方式,打印一下看看

file_path = r'D:\download\CWRU\Data\CWRU\NormalBaseline\1730\Normal.mat'
# 读取 .mat 文件
data = scipy.io.loadmat(file_path)

# DE是驱动端,FE是风扇端
X100_DE_time = data['X100_DE_time']#X100_DE_time 的形状: (485643, 1)
X100_FE_time = data['X100_FE_time']
X100RPM = data['X100RPM']# 转速1725

# print("X100_DE_time 前 10 行:")
# print(X100_DE_time[:10])

# print("\nX100_FE_time 前 10 行:")
# print(X100_FE_time[:10])

# print("\nX100RPM 前 10 行:")
# print(X100RPM[:10])

# # 打印读取的数据结构
# print(data.keys())

2.读取数据后,先用简单的代码测试一下,数据有没有问题,先来个FFT变换看看,使用的是normal部分的数据集,因为是FFT变换,变换后的横坐标和你的采样点数是一样的,FFT这个函数会默认归一化[-0.5,0.5],因此需要设置采样频率,并且需要去掉负频率。有条件的朋友可以用其他软件验证一下,FFT是否正确,我这里用的是自己开发的数采软件测试的,结果一样

3、数据读取进来没问题后,下一步就是提取特征,因为SVM是强化学习有监督的,需要人为打上标签。有以下几个部分需要处理:

(1)将数据分段处理,一组数据采样率是48k,转速1725,一秒转28.75圈,每一圈可以采到1,723.5个数据,因此将数据分为1500份以下的时候,都可以采集到完整的一圈的数据,但是这样不太好,建议一组数据含有多圈数据,分为100段既可。

(2)特征值的选取:计算数据的特征向量,包括均值、方差、峰值、有效值、峰值因子、脉冲因子、波形因子、裕度因子和峭度。将这些参数都作为(1)中每一段信号的特征,组成一个向量,还要打上标签。eg:我有一个normal信号,分成100份,每一个都要计算这些参数,作为特征拼成一个数组,存放起来

def calculate_features(data):
    """
    计算数据的特征向量,包括均值、方差、峰值、有效值、峰值因子、脉冲因子、波形因子、裕度因子和峭度。

    :param data: 输入数据
    :return: 特征向量
    """
    mean_val = calculate_mean(data)
    variance_val = calculate_variance(data)
    peak_val = calculate_peak(data)
    rms_val = calculate_rms(data)
    peak_factor_val = calculate_peak_factor(data)
    pulse_factor_val = calculate_pulse_factor(data)
    waveform_factor_val = calculate_waveform_factor(data)
    margin_factor_val = calculate_margin_factor(data)
    kurtosis_val = calculate_kurtosis(data)
    
    features = np.array([
        mean_val,
        variance_val,
        peak_val,
        rms_val,
        peak_factor_val,
        pulse_factor_val,
        waveform_factor_val,
        margin_factor_val,
        kurtosis_val
    ])
    
    return features

4.如何划分数据进行训练,python的语法比较灵活,主要是两个嵌套

def prepare_dataset(file_paths, labels, num_groups=500):
    """
    准备用于 SVM 训练的数据集。

    :param file_paths: 文件路径列表
    :param labels: 对应的类别标签列表
    :param num_groups: 分割成的组数
    :return: 特征向量矩阵和标签向量
"""
    for path, label in zip(file_paths, labels):
        for i in range(num_groups):

5、如何训练的,首先要知道SVM的原理,可以看一下下面的课程:

6.机器学习课程(六)支持向量机(线性模型)问题_哔哩哔哩_bilibili

SVM知道原理后,主要使用库,没有太多操作

def train_and_evaluate_svm(X, y):
    """
    训练和评估 SVM 模型。

    :param X: 特征向量矩阵
    :param y: 标签向量
    """
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    
    # 创建 SVM 分类器
    svm_classifier = SVC(kernel='rbf', random_state=42)
    
    # 训练模型
    svm_classifier.fit(X_train, y_train)
    
    # 预测
    y_pred = svm_classifier.predict(X_test)
    
    # 评估模型
    print("准确率:", accuracy_score(y_test, y_pred))
    print("分类报告:\n", classification_report(y_test, y_pred))

 效果展示:正常和故障的二分类的准确率高达100%,故障之间的分类混淆严重,特征选取有问题(猜测)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值