针对不了解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 rcParamsrcParams['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])
eg:
data_per_class = [(np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]), np.array([[0.7, 0.8, 0.9]])),(np.array([[1.0, 1.1, 1.2], [1.3, 1.4, 1.5], [1.6, 1.7, 1.8]]), np.array([[1.9, 2.0, 2.1]])),(np.array([[2.2, 2.3, 2.4], [2.5, 2.6, 2.7], [2.8, 2.9, 3.0], [3.1, 3.2, 3.3]]), np.array([[3.4, 3.5, 3.6], [3.7, 3.8, 3.9]]))
]#执行后
np.array([[0.1, 0.2, 0.3],[0.4, 0.5, 0.6],[1.0, 1.1, 1.2],[1.3, 1.4, 1.5],[1.6, 1.7, 1.8],[2.2, 2.3, 2.4],[2.5, 2.6, 2.7],[2.8, 2.9, 3.0],[3.1, 3.2, 3.3]
])
对没学过pyhon的同学(例如我)举个例子:
列表推导式是从左到右进行嵌套的,按方框进行遍历,最后得到x,返回x*x,类似于C++std的遍历,形式比较简洁
这样逻辑就清楚多了
后续就是进行训练SVM模型
未完待续........