支持向量机(SVM): 从理论到实践的指南(2)
葡萄酒数据集经常被用于机器学习、模式识别和统计分类算法的测试中。由于其特征维度较高,非常适合于验证特征选择和降维方法,例如主成分分析(PCA)或线性判别分析(LDA)的效果。同时,由于数据集包含多个分类,它也经常被用作分类算法(如决策树、随机森林、支持向量机等)的标准测试集。
前篇我们讲述了用SVM做鸢尾花二分类识别器,本篇我们用前篇相似的代码,更换一个维度更高的数据进行测试。
 葡萄酒分类:葡萄酒数据集是另一个分类问题,但特征数量增至13个。任务是根据化学组份将葡萄酒分为两个不同的类别。
数据示例:用SVM做葡萄酒二分类识别器
问题和数据说明
这里数据截取自wine数据,根据13维的描述数值,识别葡萄酒的类别。由于本文讲述二分类,我们在3种类别中选取两种类别,标签变更为1和-1,整理得到数据data/wine_data.csv。
 部分数据如下:
| label | f1 | f2 | f3 | f4 | f5 | f6 | f7 | f8 | f9 | f10 | f11 | f12 | f13 | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 14.23 | 1.71 | 2.43 | 15.6 | 127 | 2.8 | 3.06 | 0.28 | 2.29 | 5.64 | 1.04 | 3.92 | 1065 | 
| 1 | 13.2 | 1.78 | 2.14 | 11.2 | 100 | 2.65 | 2.76 | 0.26 | 1.28 | 4.38 | 1.05 | 3.4 | 1050 | 
| 1 | 13.16 | 2.36 | 2.67 | 18.6 | 101 | 2.8 | 3.24 | 0.3 | 2.81 | 5.68 | 1.03 | 3.17 | 1185 | 
| … | … | … | … | … | … | … | … | … | … | … | … | … | … | 
| -1 | 13.27 | 4.28 | 2.26 | 20 | 120 | 1.59 | 0.69 | 0.43 | 1.35 | 10.2 | 0.59 | 1.56 | 835 | 
| -1 | 13.17 | 2.59 | 2.37 | 20 | 120 | 1.65 | 0.68 | 0.53 | 1.46 | 9.3 | 0.6 | 1.62 | 840 | 
| -1 | 14.13 | 4.1 | 2.74 | 24.5 | 96 | 2.05 | 0.76 | 0.56 | 1.35 | 9.2 | 0.61 | 1.6 | 560 | 
源码
MindOpt团队开发的代数建模语言MAPL(MindOpt Algebra Programming Language, MindOptAPL,简称为MAPL),可以用来编码上面的问题,并且调用求解器进行求解。
 MAPL的V2.4版本上新了向量化建模的语法,可以方便地实现矩阵的转置、矩阵乘法等功能,详情>>。
 完整代码如下:
clear model;####################################################
#
#   Vectorization Modeling Example
#   Linear SVM
#
####################################################option modelname svm_03; #定义存储文件名# ----------建模--------Start----
# svm_02.mapl# 1.读取iris的用于构建SVM模型的训练数据
param data_dir = "./data/wine_data-train.csv"; 
param X = read_csv( data_dir, use_col="1,2,3,4,5,6,7,8,9,10,11,12,13",skip=1);
param y = read_csv( data_dir, use_col=0,skip=1);
param dataNum = X.row;
param dataDim = X.col;
print "总共有{}个数据,每个数据有{}维"%dataNum,dataDim;# 2.LinearSVM问题建模
param C_rho = 0.2;
print "Param C is :{}"%C_rho;print "Start modeling-------";var w(dataDim) >= -1 <= 1; # Bounded Model Parameter
var b; #
var eps(dataNum) >= 0;minimize 1/2 * w' * w + C_rho * sum(eps); #'是转置,目标函数subto constraint:eps >= 1 - (X*w +b).*y; #注意是向量化建模,因此相当于多条维度的约束# 3.调用求解器求解
print "Start solving-------";
option solver mindopt;
solve;# 4. 超平面的w取值
print "- Optimal w is:";
print w;
print "- Optimal b is:";
print b;
print "- eps is:";
forall { i in 0..dataNum-1 with eps[i] > 0.001}print "  - eps[{}] = {} "%i,eps[i];param obj_total_loss = 1/2 *  w' * w + C_rho * sum(eps); #'是转置
print "- obj of total loss is : {}"%obj_total_loss;# 5.验证并分析结果print "";
print "验证结果:-----";param correctNum = sum{i in 0..dataNum-1} if((sum{j in 0..dataDim-1}w[j]*X[i, j]) +b )* y[i] > 0 then 1 else 0 end;
param precision = correctNum / dataNum;
print "- Precision for train data is : {:.2f}" % precision;#
print "";
print "导入测试数据验证效果:-----";param data_dir_test = "./data/wine_data-test.csv"; 
param X_test = read_csv( data_dir_test, use_col="1,2,3,4,5,6,7,8,9,10,11,12,13",skip=1);
param y_test = read_csv( data_dir_test, use_col=0,skip=1);
param dataNum_test = X_test.row;
param dataDim_test = X_test.col;
print "- 总共有{}个数据,每个数据有{}维"%dataNum_test,dataDim_test;print "|测试数据ID|实际标签|SVM预测标签是|";
print "|--|--|--|";
forall {i in 0..dataNum_test-1}
print "|{}|{}|{}|"%i,y_test[i], if((sum{j in 0..dataDim_test-1}w[j]*X_test[i, j]) +b ) > 0 then 1 else -1 end;
 
运行上述代码结果如下:
总共有87个数据,每个数据有13维
Param C is :0.2
Start modeling-------
Start solving-------
Running mindoptampl
wantsol=1
MindOpt Version 1.2.1 (Build date: 20240428)
Copyright (c) 2020-2024 Alibaba Cloud.Start license validation (current time : 29-APR-2024 17:51:15).
License validation terminated. Time : 0.007sModel summary.- Num. variables     : 101- Num. constraints   : 87- Num. nonzeros      : 1305- Bound range        : [1.0e+00,1.0e+00]- Quad. bound range  : [1.0e+00,1.0e+00]- Objective range    : [2.0e-01,2.0e-01]- Quad. obj. range   : [1.0e+00,1.0e+00]- Matrix range       : [1.7e-01,1.7e+03]Presolver started.
Presolver terminated. Time : 0.001sInterior point method started.Iter         PrimObj         DualObj PrimFea DualFea  GapFea      Mu   Time0 +3.80399778e-01 -7.55707692e-01 1.9e-02 1.1e-02 1.1e+00 4.6e-03   0.02s1 +1.79640739e-01 -2.13996063e-01 8.2e-03 5.0e-03 3.9e-01 1.5e-03   0.03s2 +1.17952681e-01 -1.13914883e-01 5.2e-03 2.0e-02 2.3e-01 7.1e-04   0.03s3 +3.61389193e-02 -2.62084850e-02 1.5e-03 5.8e-03 6.2e-02 2.0e-04   0.04s4 +3.41691834e-02 -2.09031242e-02 1.4e-03 5.1e-03 5.5e-02 1.9e-04   0.04s5 +3.40036247e-02 +5.83432924e-02 1.3e-03 2.2e-02 4.6e-02 2.3e-04   0.04s6 +8.36408587e-02 -4.76077416e-01 8.4e-04 7.9e-02 5.6e-01 2.1e-04   0.04s7 +1.25803855e-01 +1.83665783e-01 5.0e-04 1.8e-02 5.8e-02 2.9e-04   0.05s8 +2.08232448e-01 +3.51342692e-01 1.1e-04 1.7e-02 1.4e-01 9.2e-05   0.05s9 +2.24640702e-01 +3.15349667e-01 5.2e-05 1.6e-02 9.1e-02 5.4e-05   0.05s10 +2.38702568e-01 +2.37176375e-01 1.4e-07 3.5e-04 2.6e-03 1.3e-05   0.05s11 +2.36599665e-01 +2.36546454e-01 4.5e-10 2.0e-06 6.0e-05 3.0e-07   0.05s12 +2.36550609e-01 +2.36550442e-01 1.2e-12 5.5e-09 1.8e-07 9.2e-10   0.06s13 +2.36550464e-01 +2.36550464e-01 1.5e-16 1.3e-11 4.3e-11 3.5e-14   0.06s
Terminated.- Method             : Interior point method.- Primal objective   : 2.3655046415330E-01- Dual objective     : 2.3655046419623E-01- Num. threads       : 4- Num. iterations    : 13- Solver details     : Solver terminated with a primal/dual optimal status.Interior point method terminated. Time : 0.046sOPTIMAL; objective 0.24
0 simplex iterationsCompleted.
- Optimal w is:
[[ 0.04857],[ 0.01247],[ 0.05512],[-0.13231],[ 0.02318],[ 0.27035],[ 0.46883],[-0.01722],[ 0.13966],[-0.17157],[ 0.06461],[ 0.32124],[ 0.00143]]
- Optimal b is:
-3.307435311971387
- eps is:
- obj of total loss is : 0.23655046415329972验证结果:-----
- Precision for train data is : 1.00导入测试数据验证效果:-----
- 总共有20个数据,每个数据有13维
|测试数据ID|实际标签|SVM预测标签是|
|--|--|--|
|0|1|1|
|1|1|1|
|2|1|1|
|3|1|1|
|4|1|1|
|5|1|1|
|6|1|1|
|7|1|1|
|8|1|1|
|9|1|1|
|10|-1|-1|
|11|-1|-1|
|12|-1|-1|
|13|-1|-1|
|14|-1|-1|
|15|-1|-1|
|16|-1|-1|
|17|-1|-1|
|18|-1|-1|
|19|-1|-1|
 
结果解析
运行结果如下:
总共有87个数据,每个数据有13维 Param C is :0.2
 ……
- Optimal w is: [[ 0.04857], [ 0.01247], [ 0.05512], [-0.13231], [ 0.02318], [ 0.27035], [ 0.46883], [-0.01722], [ 0.13966], [-0.17157], [ 0.06461], [ 0.32124], [ 0.00143]]
 - Optimal b is: -3.3074353121126
 - eps is:
 - obj of total loss is : 0.23655046414945333
 
验证结果:-----
- Precision for train data is : 1.00
 
导入测试数据验证效果:-----
- 总共有20个数据,每个数据有13维
 
| 测试数据ID | 实际标签 | SVM预测标签是 | 
|---|---|---|
| 0 | 1 | 1 | 
| 1 | 1 | 1 | 
| 2 | 1 | 1 | 
| 3 | 1 | 1 | 
| 4 | 1 | 1 | 
| 5 | 1 | 1 | 
| 6 | 1 | 1 | 
| 7 | 1 | 1 | 
| 8 | 1 | 1 | 
| 9 | 1 | 1 | 
| 10 | -1 | -1 | 
| 11 | -1 | -1 | 
| 12 | -1 | -1 | 
| 13 | -1 | -1 | 
| 14 | -1 | -1 | 
| 15 | -1 | -1 | 
| 16 | -1 | -1 | 
| 17 | -1 | -1 | 
| 18 | -1 | -1 | 
| 19 | -1 | -1 | 
可以看到,我们使用通用MindOpt求解器,也能实现SVM“训练”葡萄酒的分类器。
相关文章:
支持向量机(SVM): 从理论到实践的指南(2)
葡萄酒数据集经常被用于机器学习、模式识别和统计分类算法的测试中。由于其特征维度较高,非常适合于验证特征选择和降维方法,例如主成分分析(PCA)或线性判别分析(LDA)的效果。同时,由于数据集包…...
PDF格式分析(八十六)——修订注释(Redaction)
修订注释(PDF 1.7及其以上版本),该注释的做用是标识要从文档中删除的内容。 修订注释启用的步骤如下: 1、内容标识。PDF编辑器可指定应删除的文档内容片段或区域,在执行下一个步骤前,用户可以看到、移动和重新定义这些注释。 2、内容移除。PDF阅读器应删除修订注释指…...
【python】flask中Session忽然取不到存储内容怎么办?
尚未确定,后续更新,先别以此为准。 【背景】 用flask写的Web应用,运行不正常,查看原因,发现视图函数a中设定的session内容在视图函数b忽然拿不到了。 【分析】 这个应用在两个服务器间互相Hook,因此可能涉及跨域的问题。 视图函数a设置的session,再次从前端调用视图…...
05-腾讯云Copilot及 向量数据库AI套件介绍
1 Andon Copilot核心功能介绍 2 Andon Copilot覆盖腾讯云售后、售前场景 3 腾讯云向量数据库– AI套件效果 AI 套件是腾讯云向量数据库(Tencent Cloud VectorDB)提供的一站式文档检索解决方案,包含自动化文档解析、信息补充、向量化、内容检…...
软件版本库管理工具
0 Preface/Foreword 常用代码版本管理工具包括如下几种: Git,最基本管理工具,由Linux kernel开发者开发Repo,主要用于管理Android SDK,由Google开发Gerrit,代码审查软件 1 Git 最基本的代码版本库管理工…...
LVS负载均衡集群企业级应用实战-LVS/NAT模式(三)
目录 LVS/NAT模式 一. 环境准备 二. 对虚拟服务器操作 三. 对真实服务器操作 四. 打开网站验证 LVS/NAT模式 一. 环境准备 统一关闭防火墙和selinux,时间同步,配置好YUM源系统发行版选择会用就可以,这里也是两种一起使用学习。用的不同系…...
在Spring中如何手动开启事务(使用编程式事务)
这里写自定义目录标题 一、使用 transactionManager1、向容器中注入事务管理器2、使用 transactionManager 提交事务3、测试 二、使用TransactionTemplate1、向容器中注入 TransactionTemplate2、开启事务 一、使用 transactionManager 1、向容器中注入事务管理器 Configurat…...
cv的优势
计算机视觉(CV)技术是一种通过计算机对图像、视频等视觉数据进行分析和理解的技术。它在多个领域有着广泛的应用,包括图像识别、目标检测、人脸识别、无人驾驶等。下面是一些计算机视觉技术的优势和挑战的例子: 优势:…...
基于某评论的TF-IDF下的LDA主题模型分析
完整代码: import numpy as np import re import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocationdf1 pd.read_csv(小红书评论.csv) # 读取同目录下csv文件…...
四、Nginx配置文件-负载均衡
目录 一、负载均衡的作用 二、负载均衡状态 三、负载均衡的指令 1、upstream 指令 2、server指令 四、负载均衡几种方式 1、轮询(Round Robin 常用) 2、IP Hash (较少) 3、最少连接数(Least Connections 较少&…...
ofd文件预览
文件列表 <template><div><div classfile v-if$myUtils.coll.isNotEmpty(filesList)><div classfile-view><div classfile-view-item :style{justifyContent: align } v-for(item, index) in filesList :keyindex><img classfile-view-item-…...
浅浅了解下Spring中生命周期函数(Spring6全攻略)
你好,这里是codetrend专栏“Spring6全攻略”。 Spring框架设计生命周期回调函数的主要目的是为了提供一种机制,使开发人员能够在对象创建、初始化和销毁等生命周期阶段执行特定的操作。这种机制可以帮助开发人员编写更加灵活和可维护的代码。 举个例子…...
建议收藏!亚马逊卖家必须知道的37个常用术语解释
运营亚马逊,经常会看到很多个专业术语,想必大部分新手卖家都比较陌生,熟悉这些常用术语的含义有助于你更好地运营亚马逊。下面为各位整理了37个在亚马逊跨境电商中常见的术语及其解释,建议收藏! 1、SKU Stock Keeping…...
黑苹果睡眠总是自动唤醒(RTC)
黑苹果睡眠总是自动唤醒【RTC】 1. 问题2. 解决方案2.1. 查看重启日志2.2. 配置Disable RTC wake scheduling补丁 3. 后续4. 参考 1. 问题 黑苹果EFI 更换后,总是在手动 睡眠后,间歇性重启,然后再次睡眠,然后再重启。原因归结为&…...
【代码随想录训练营】【Day 49+】【动态规划-8】| Leetcode 121, 122, 123
【代码随想录训练营】【Day 49】【动态规划-8】| Leetcode 121, 122, 123 需强化知识点 买卖股票系列 题目 121. 买卖股票的最佳时机 动态规划贪心:记录左侧的最小值 class Solution:def maxProfit(self, prices: List[int]) -> int:# n len(prices)# # 0…...
k8s metrics-server服务监控pod 的 cpu、内存
项目场景: 需要开启指标服务,依据pod 的 cpu、内存使用率进行自动的扩容或缩容 pod 的数量 解决方案: 下载 metrics-server 组件配置文件: wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/…...
电脑自带录屏在哪?电脑录屏,4个详细方法
在现代社会中,越来越多的人需要在电脑上录制视频,比如录制游戏操作、制作教学视频、演示文稿等等。因此,电脑录屏成为了一项非常重要的功能。那么电脑自带录屏在哪?本文将带领大家看看可以使用哪些方法进行录屏。 录屏方法一&…...
[Cloud Networking] Layer3 (Continue)
文章目录 1. DHCP Protocol1.1 DHCP 三种分配方式1.2 DHCP Relay (中继) 2. 路由协议 (Routing Protocol)2.1 RIP (Routing Information Protocol)2.2 OSPF Protocol2.2.1 OSPF Area2.2.2 Route ID / DR / BDR2.2.3 LSA / OSPF 邻居表 / LSDB / OSPF路由表 2.3 BGP Protocol2.4…...
missing authentication credentials for REST request
1、报错截图 2、解决办法 将elasticsearch的elasticsearch.yml的 xpack.security.enabled: true 改为 xpack.security.enabled: false...
Unity 从0开始编写一个技能编辑器_02_Buff系统的生命周期
工作也有一年了,对技能编辑器也有了一些自己的看法,从刚接触时的惊讶,到大量工作时觉得有一些设计的冗余,在到特殊需求的修改,运行效率低时的优化,技能编辑器在我眼中已经不再是神圣不可攀的存在的…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...
