QT上实现SVM进行数据分类

embedded/2025/1/9 12:48:30/

针对不了解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模型

未完待续........


http://www.ppmy.cn/embedded/152041.html

相关文章

国产编辑器EverEdit - 两种删除空白行的方法

1 使用技巧:删除空白行 1.1 应用场景 用户在编辑文档时,可能会遇到很多空白行需要删除的情况,比如从网页上拷贝文字,可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1: 使用编辑主菜单 选择主菜单编辑 …

【清华理想】GaussianAD: Gaussian-Centric 高思中心端到端自动驾驶

论文:https://arxiv.org/pdf/2412.10371 项目:https://wzzheng.net/GaussianAD 0. 摘要 基于视觉的自动驾驶因其令人满意的性能和低成本显示出巨大潜力。大多数现有方法采用密集表示(例如,鸟瞰图)或稀疏表示&#xf…

前端开发中页面优化的方法

前端页面优化是指通过改进网页的加载速度、提高用户体验和SEO优化等手段来优化页面性能的过程。以下是一些常见的前端页面优化方法: 压缩和合并文件:通过压缩CSS和JavaScript文件,并将多个文件合并成一个文件,减少网络传输和HTTP请…

react vscode prettier 格式化代码

在 VSCode 中配置 Prettier 来格式化 React 项目是一个非常实用的方法,它可以帮助你保持代码风格一致并提高可读性。以下是详细的步骤: 步骤 1: 安装 Prettier 打开 VSCode 的终端(快捷键:Ctrl+` )。 安装 Prettier: npm install --save-dev prettier安装 VSCode 的 …

RockyLinux9配置静态ip地址教程

以往我们配置linux系统的ip地址是在 /etc/sysconfig/network-scripts/ifcfg-网卡名 配置文件中编辑的,详情请见 Rocky8.10配置网络和主机名教程_rocky8配置网络-CSDN博客 但是在RockyLinux9系统中弃用了以前的这种方式,改为了新的配置方式。下面我们介绍…

3D内容生成技术:驱动数字世界创新的关键力量

随着大语言模型与生成式AI的迅速发展,3D内容生成技术正迎来其发展的黄金时期。这项技术不仅革新了3D资产的制作手段,也为内容创作模式带来了深刻变革,显著提高了3D数字化内容生产的效率。本文将探讨3D内容生成的主要方法、分类及其广泛应用领域,并展望该技术未来的发展趋势…

基于 gitlab-runner 实现调度GPU的资源

本篇目录 1. 客户需求2. 需求调研3. 实践3.1 方案一:环境变量的方式3.2 方案二:k8s 自身的spec注入机制 4. 效果 该实践来自于客户的一个真实需求 1. 客户需求 客户的某些流水线需要使用GPU资源,但是对于GPU服务器而言,会有多张G…

用python处理Color Uniformity计算

一、说明 用CIEDE2000进行色差分析 关键在点位的定位,根据圆的半径进行定位 二、上部分代码 # 绘制圆形 for radius in r_list: cv2.circle(img_rgb, (width//2, height//2), int(radius), (0, 0, 0), 5) #计算坐标点 for m in range(numSquares): tempAngle 2 *…