QT故障诊断(SVM、CNN)进行数据分类(已实现)

发布于:2025-02-10 ⋅ 阅读:(18) ⋅ 点赞:(0)

目录

一、QT实现SVM的方法

二、python代码

三、QT实现SVM分类


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

针对不了解SVM的原理的同学强推下面这个课程:

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

一、QT实现SVM的方法

1.调用SVM的C语言库:麻烦,要专门去找库,cmake可能方便一点,我的QT用的qmake,加起来比较麻烦

2.QT调用Python文件:简单,有现成的代码

我这里使用的方法2,环境配置参考我的这篇文章:

QT运行导入python(pytorch)程序进行深度学习(qmake)_qt 引入python-CSDN博客

二、python代码

主要框架有一下几个部分:注意SVM模型的选择,我这里是非线性的选择的rbf

import numpy as np
from sklearn import svm
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, accuracy_score
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from matplotlib import rcParams

rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False

# 加载数据
data = np.load('data.npy')  # 替换为你的数据路径
labels = np.load('label.npy')  # 替换为你的标签路径
# 划分数据
data_per_class = []
n_classes = 7
# 按类别划分数据
for label in range(n_classes):
    class_data = data[labels == label]
    X_train, X_test = train_test_split(class_data, test_size=0.1, random_state=42)
    data_per_class.append((X_train, X_test))

# 合并所有类别的训练和测试数据
X_train_all = np.concatenate([train for train, _ in data_per_class])
X_test_all = np.concatenate([test for _, test in data_per_class])

# 生成对应的标签
y_train_all = np.concatenate([np.full(train.shape[0], label) for label, (train, _) in enumerate(data_per_class)])
y_test_all = np.concatenate([np.full(test.shape[0], label) for label, (_, test) in enumerate(data_per_class)])

# 使用最佳参数的SVC模型
best_svc = svm.SVC(C=1, gamma=0.03, kernel='rbf')
best_svc.fit(X_train_all, y_train_all)

# 使用最佳参数的模型进行预测
y_pred_train = best_svc.predict(X_train_all)
y_pred_test = best_svc.predict(X_test_all)

# 计算准确率
train_accuracy = accuracy_score(y_train_all, y_pred_train)
test_accuracy = accuracy_score(y_test_all, y_pred_test)
print(f'Train Accuracy: {train_accuracy:.4f}')
print(f'Test Accuracy: {test_accuracy:.4f}')

# 绘制测试集混淆矩阵
label_names = ['正常', '短路', '缺相', '轴弯曲', '不对中', '不平衡', '断条']
conf_matrix = confusion_matrix(y_test_all, y_pred_test)
disp = ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=label_names)
disp.plot(cmap=plt.cm.Blues)
plt.title('测试集混淆矩阵')
plt.show()

部分语法:

#是一个列表推导式,用于提取 data_per_class 中每个元组的第一个元素,即每个类别的训练集 X_train
X_train_all = np.concatenate([train for train, _ in data_per_class])
#是一个列表推导式,用于提取 data_per_class 中每个元组的第二个元素,即每个类别的测试集 X_test
X_test_all = np.concatenate([test for _, test in data_per_class])

对没学过pyhon的同学(例如我)举个例子

列表推导式是从左到右进行嵌套的,按方框进行遍历,最后得到x,返回x*x,类似于C++std的遍历,形式比较简洁

 这样逻辑就清楚多了

后续就是进行训练SVM模型,在python上已经成功,下一步就是C与python之间的交互

西储大学CWRU轴承数据集进行SVM分类-CSDN博客

三、QT实现SVM分类和预测

1、分类导入数据并打上标签,每个文件分为40组进行训练

训练结果:

2、预测,导入数据分为30组进行预测

 预测结果正确率100%


网站公告

今日签到

点亮在社区的每一天
去签到