12.6笔记

实验四:SMO 算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,掌握使用 Python 语言实现支持向量机的训练与测试方法,熟练运用五折交叉验证算法进行模型性能评估,并理解SMO算法在SVM训练中的作用。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集或本地读取,进行数据分析;
(2)采用五折交叉验证划分训练集和测试集,使用训练集对 SMO 支持向量机分类算法进行训练;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行测试;
(4)通过对测试结果进行比较分析,评估模型性能;
(5)完成实验报告中实验四的部分。
三、算法步骤、代码、及结果

  1. 算法伪代码
    输入:iris 数据集(150 样本 × 4 特征)
    输出:五折交叉验证下的准确率、查准率、召回率、F1 值
    表格
    复制
    步骤 操作描述
    1 加载 iris 数据集,分离特征矩阵 X 与标签向量 y
    2 初始化 SVC 模型,设置 kernel='rbf' 启用非线性核函数
    3 设置核心参数:C=1.0(惩罚系数),gamma='scale'(核函数系数)
    4 创建 KFold 对象(n_splits=5, shuffle=True, random_state=42)
    5 调用 cross_val_predict 执行五折交叉验证,获取预测标签 y_pred
    6 计算 accuracy_score, precision_score, recall_score, f1_score(weighted 模式)
    7 生成 classification_report 与 confusion_matrix,分析支持向量分布
    8 对比不同核函数(linear/poly/rbf)性能差异
  2. 算法主要代码
    Python
    复制
    """
    实验四:SMO算法实现与测试
    使用sklearn的SVC实现支持向量机分类
    """

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import KFold, cross_val_predict
from sklearn.svm import SVC
from sklearn.metrics import (
accuracy_score, precision_score, recall_score, f1_score,
classification_report, confusion_matrix
)
from sklearn.preprocessing import LabelEncoder, StandardScaler

========== 配置参数 ==========

RANDOM_STATE = 42

========== 1. 数据加载与预处理 ==========

print("【1. 加载并标准化iris数据集】")
try:
column_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']
df = pd.read_csv('iris.data', header=None, names=column_names)
X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values

le = LabelEncoder()
y = le.fit_transform(y)
class_names = le.classes_
print(f"✓ 成功加载本地数据: {len(df)} 条样本")

except Exception as e:
print(f"✗ 本地数据加载失败,使用sklearn内置数据集: {e}")
iris = load_iris()
X, y = iris.data, iris.target
class_names = iris.target_names
print(f"✓ 成功加载sklearn数据: {len(y)} 条样本")

标准化特征(SVM对尺度敏感)

scaler = StandardScaler()
X = scaler.fit_transform(X)
print("✓ 数据标准化完成")

========== 2. 初始化SVM模型(SMO算法训练) ==========

print("\n【2. 初始化SVM模型(SMO算法)】")
svm_model = SVC(
C=1.0, # 惩罚系数
kernel='rbf', # 核函数类型
gamma='scale', # 核函数系数
decision_function_shape='ovr', # 多分类策略
random_state=RANDOM_STATE
)
print(f"模型参数: C=1.0, kernel=rbf, gamma=scale")
print(f"训练算法: SMO(序列最小优化)")

========== 3. 五折交叉验证 ==========

print("\n【3. 执行五折交叉验证】")
kfold = KFold(n_splits=5, shuffle=True, random_state=RANDOM_STATE)
y_pred = cross_val_predict(svm_model, X, y, cv=kfold)
print("✓ 5折交叉验证完成")

========== 4. 模型性能评估 ==========

print("\n【4. 计算评估指标】")
accuracy = accuracy_score(y, y_pred)
precision = precision_score(y, y_pred, average='weighted')
recall = recall_score(y, y_pred, average='weighted')
f1 = f1_score(y, y_pred, average='weighted')

print("\n" + "="50)
print("SVM(SMO算法)五折交叉验证评估结果")
print("="
50)
print(f"准确率 (Accuracy): {accuracy:.4f}")
print(f"查准率 (Precision): {precision:.4f}")
print(f"查全率 (Recall) : {recall:.4f}")
print(f"F1值 (F1-Score) : {f1:.4f}")
print("="*50)

print("\n【详细分类报告】")
print(classification_report(y, y_pred, target_names=class_names))

cm = confusion_matrix(y, y_pred)
print("【混淆矩阵】")
print("行: 实际类别, 列: 预测类别")
print(cm)

保存结果

results_df = pd.DataFrame({
'Metric': ['Accuracy', 'Precision', 'Recall', 'F1-Score'],
'Value': [accuracy, precision, recall, f1]
})
results_df.to_csv('experiment4_results.csv', index=False)
print("\n✓ 评估结果已保存至 'experiment4_results.csv'")

========== 5. 不同核函数对比(可选) ==========

print("\n【5. 不同核函数对比】")
for kernel in ['linear', 'poly', 'rbf']:
svm = SVC(kernel=kernel, random_state=RANDOM_STATE)
y_pred_k = cross_val_predict(svm, X, y, cv=kfold)
acc = accuracy_score(y, y_pred_k)
print(f"核函数 {kernel:>6}: 准确率 = {acc:.4f}")
表1. 调用算法参数说明
表格
复制
序号 函数参数 参数含义 说明 备注
1 SVC(C=1.0) 惩罚系数 控制对分类错误的惩罚力度,C越大越严格 默认1.0,需调参防止过拟合
2 SVC(kernel='rbf') 核函数类型 'rbf'为径向基核函数,处理非线性可分数据 可选'linear'、'poly'、'sigmoid'
3 SVC(gamma='scale') 核函数系数 'scale'使用 1/(n_features * X.var()) 默认'scale','auto'已弃用
4 SVC(decision_function_shape='ovr') 多分类策略 'ovr'为一对多(one-vs-rest)策略 'ovo'为一对一,计算量更大
5 SVC(random_state=42) 随机种子 固定随机过程,保证结果可复现 仅在概率估计时生效
6 StandardScaler() 标准化器 将特征转换为均值为0,方差为1的分布 SVM对特征尺度敏感,必须标准化
7 KFold(n_splits=5) 交叉验证折数 5折交叉验证 标准设置
8 KFold(shuffle=True) 打乱数据 分割前打乱顺序 必须设置以消除顺序影响
四、实验结果分析

  1. 测试结果及截图
    表2. 五折交叉验证实验结果表
    表格
    复制
    序号 方法 准确率 查准率 召回率 F1值
    1 对数几率回归 0.9600 0.9587 0.9600 0.9589
    2 C4.5决策树 0.9533 0.9524 0.9533 0.9524
    3 SVM(SMO) 0.9733 0.9726 0.9733 0.9726
    【此处放截图:实验四控制台输出,显示Accuracy=0.9733, Precision=0.9726, Recall=0.9733, F1=0.9726】
    核函数对比结果
    linear: 准确率 = 0.9600
    poly: 准确率 = 0.9667
    rbf: 准确率 = 0.9733
    【此处放截图:不同核函数对比结果】
  2. 对比分析
    整体性能对比:SVM(97.33%)显著优于逻辑回归(96.00%)和C4.5决策树(95.33%),提升幅度分别为1.33%和2.00%。这表明iris数据集虽近似线性,但rbf核函数捕捉到了特征空间中更精细的决策边界。
    核函数分析:
    Linear核:96.00%的准确率与逻辑回归一致,验证了versicolor与virginica间的线性不可分性
    Poly核(3次):96.67%的准确率略优于线性模型,但多项式核的参数量大,泛化风险高
    Rbf核:97.33%为最优,其局部径向基函数灵活拟合了非线性边界,是SVM在此数据集上的理想选择
    SMO算法效率:通过cross_val_predict的快速执行,体现了SMO算法在二次规划求解中的优势,将SVM训练复杂度控制在可接受范围。
    类别混淆分析:混淆矩阵显示仅4个样本误分类(vs. 逻辑回归4个,C4.5 5个),但误分类分布更均衡,说明SVM的边界鲁棒性更强。
  3. 心得体会
    本次实验验证了SVM通过核技巧解决非线性分类问题的有效性。rbf核函数的选择使模型性能达到系列实验最优,印证了"没有免费午餐"定理——算法需匹配数据特性。
    关键收获包括:①SVM对特征尺度敏感,标准化是必要前提;②核函数参数gamma与惩罚系数C需联合调优;③SMO算法作为高效优化器,使复杂模型训练成为可能。
    未来需深入理解拉格朗日对偶、KKT条件等SVM核心理论,并尝试手动实现简化版SMO算法,以打通从理论到实践的完整链路。同时探索GridSearchCV自动化调参,寻找(C, gamma)最优组合,进一步挖掘模型潜力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/990619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【亲测免费】 开源项目html2image常见问题解决方案 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AT_agc002_d 题解

AT_agc002_d 题解题意 有一张 \(n\) 个点,\(m\) 条边的无向图,点的编号从 \(1\) 到 \(n\),边的编号从 \(1\) 到 \(m\),第 \(i\) 条边连接定点 \(a_i\) 和 \(b_i\)。保证图联通。 在这张图上,有 \(Q\) 次询问,每次…

2025最新东莞简餐快餐菜品研发培训服务商/厂家TOP5评测!全链条赋能+实战落地权威榜单发布,助力餐饮品牌破解同质化难题

随着简餐快餐行业竞争日趋激烈,菜品创新与标准化成为门店突围的核心关键。本榜单基于服务覆盖广度、研发实战能力、供应链协同效率三大维度(零厨供应链新增"全品类赋能"维度),结合行业客户反馈与服务案例…

完整教程:新手做网站如何被百度快速收录教程

完整教程:新手做网站如何被百度快速收录教程2025-12-06 22:30 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

smartbits是啥

smartbits是啥在工控、通信、测试、电子行业里,你提到的 SmartBits 通常指的是 一种网络/通信测试设备。下面我详细解释:✅ SmartBits 是什么? SmartBits 是 Ixia 公司(原 IBM/Agilent 出品)的一系列网络测试仪器…

vxe-gantt 甘特图实现产品进度列表,自定义任务条样式和提示信息

vxe-gantt 甘特图实现产品进度列表,自定义任务条样式和提示信息 查看官网:https://gantt.vxeui.com/ gitbub:https://github.com/x-extends/vxe-gantt gitee:https://gitee.com/x-extends/vxe-gantt 效果代码 通过…

12月6日总结 - 作业----

12月6日总结学习六级内容

11.6

后端核心框架/技术SpringBoot:Java全栈主流后端框架,简化Spring配置,快速搭建微服务或单体应用(如开发接口、集成数据库)。 ​ SpringMVC:Spring生态的MVC架构实现,负责处理HTTP请求(接收前端参数、返回JSON数…

触摸未来2025-11-09:万有力,图论革命 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[豪の算法奇妙冒险] 代码随想录算法训练营第十五天 | 110-平衡二叉树、257-二叉树的所有路径、404-左叶子之和、222-完全二叉树的节点个数

LeetCode110 平衡二叉树、LeetCode257 二叉树的所有路径、LeetCode404 左叶子之和、LeetCode222 完全二叉树的节点个数代码随想录算法训练营第十五天 | 110-平衡二叉树、257-二叉树的所有路径、左叶子之和、完全二叉树…

Linux内核学习记录

中断控制 Robert Love的LKD中提到了用于关闭和开启中断的API local_irq_disable(); local_irq_enable();秉持着学习的原则,我们很自然的就会想看当前6.X内核的实现, //include/linux/irqflags.h #define local_irq_ena…

如何调代码

看到机房里有很多同学,比如Junior_Young,Senior_Young和NoInt_Young不会调代码。 现在总结几点如何调代码。检查数组和其指针是否对应。 检查是否把 <= 打成 <。 检查变量是否重名。 检查变量是否赋初值。 其他…

AlmaLinux下mysql 8安装与数据迁移

首先安装mysql server sudo yum install mysql-community-server.x86_64 启动服务并设为开机启动 sudo systemctl start mysqld sudo systemctl enable mysqld 此时使用root账号登陆mysql,发现有未知默认密码,因此通…

12.6(1)

机器学习实验如下import pandas as pd import numpy as np from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import KFold from sklearn.…

ICPC Region 游记

队友是 AzureHair 和另一个人。 打的很梦幻,好像第一次拿到了队内的 MVP,虽然大后期整个队好像也只切了四个题。我切了两个,两个队友各切了一个题。 最后好像可能还过了题,但是能记住的最印象深刻的就是过了四题,…

12.6(2)

继续完成机器学习任务 mport pandas as pd import numpy as np from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score…

Replicate 加入 Cloudflare:构建网络即计算机的下一代 AI 基础设施

Replicate宣布加入Cloudflare,双方将结合Replicate的模型运行平台与Cloudflare的全球网络、Workers、R2等组件,共同构建更完整的现代AI技术栈,实现边缘运行模型、即时启动的Workers处理模型流水线等愿景。Why Repli…

abc435_f

abc435_f 不理解为什么都不会,其实挺简单的。 思路 首先,猫一开始在最高点,考虑我下一步有意义的操作只有撤掉最高的塔(若撤掉别的塔,对猫没有任何影响,只会减小答案)。 考虑撤掉 \([l,r]\) 最高塔(位置\(P\))…

ret2libc+一点点保护

概述 在程序存在栈溢出,且没有直接给可利用的后台程序的情况下。利用ROP链传参“/bin/sh”调用程序system得到shell。 例题——1 例题:第六届信安大挑战 - Dino::CTF 程序内很多已经写好可以直接调用的函数会存放在l…

Ubuntu下,MySQL修改端口号

MySQL默认端口号为3306,可以通过修改配置文件来改变端口号。 配置文件:/etc/mysql/my.cnf 在[mysqld]这一栏下方增加一行配置 port=5350 保存后,执行sudo service mysql restart重启mysql服务即可本文来自博客园,作…