实验二:用python实现SVM支持向量机并对鸢尾花数据集分类

该博客详细介绍了如何使用Python实现SVM支持向量机,包括原理说明、算法构建过程以及实验结果。在鸢尾花数据集上,博主训练了硬间隔和软间隔的SVM模型,并讨论了实验中遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

实验二:SVM支持向量机

1. 实验内容:

(1)用你熟知的语言(尽量使用python)实现支持向量机的算法,并在给定的数据集上训练。

(2)在测试集上用训练好的支持向量机进行测试,并将预测结果以csv格式保存为一行预测的分类。

(3)简要说明算法原理,记录实验过程的关键步骤,以及实验过程中遇到的问题和解决方法。

2. 实验说明:

数据集为鸢尾花数据集,有三个类别,其中setosa与另外两种之间是线性可分的,因此你需要选择按照setosa和versicolor,或setsosa和virginica,进行训练分类。如果你用的是软间隔可以用两个SVM对全部三类进行测试。

实验过程中可以不可以直接调用第三方库封装好的训练函数,但可以使用基础类和函数,例如numpy的数组以及矩阵内积dot函数等(算法迭代过程必须自己完成)。

算法具体实现方式无要求,函数或是类封装均可,但是要写进实验报告内。不必上交代码,但要有实验过程关键步骤的截图。

可以尝试利用可视化分析实验过程(非必须)。

3. 报告要求:

实验必须独立完成不得抄袭借鉴他人的实验内容。

4. 原理说明:

简要说明感知器算法原理,可以借助伪代码来进行说明。

4.1 文字描述:

支持向量机(SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,即在分类面扩展为一个具有间隔的空间,可以看成是感知机的升级版;另外SVM还包括核方法,从而使它成为非线性分类器。

SVM的学习策略就是间隔最大化,因此相比于感知机,它有唯一的解,可以形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题,整体来看是一个求解凸函数的最优化问题

4.2 数学抽象:
4.2.1 硬间隔支持向量机

给定线性可分的训练数据集 D = { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , … … , ( x ( N ) , y ( N ) ) } D = \{(\mathbf x^{(1)},y^{(1)}),(\mathbf x^{(2)},y^{(2)}),……,(\mathbf x^{(N)},y^{(N)})\} D={ (x(1),y(1)),(x(2),y(2)),,(x(N),y(N))} ,其中 ( x ( n ) , y ( n ) ) (\mathbf x^{(n)}, y^{(n)}) (x(n),y(n)) 为第 n n n个样本, x ( n ) ∈ R D \mathbf x^{(n)} \in \mathbb R^D x(n)RD 为该样本的特征向量。

对于给定的训练数据集 D D D和超平面 ( w , b ) (\mathbf w,b) (w,b),任一样本 x ( n ) \mathbf x^{(n)} x(n) 到超平面 ( w , b ) (\mathbf w,b) (w,b)的距离是
r ( n ) = ∣ w T x ( n ) + b ∣ ∥ w ∥ r^{(n)}=\frac {|\mathbf {w^T x^{(n)}}+b|}{\|\mathbf w\|} r(n)=wwTx(n)+b
一般来说,一个点距离超平面的远近可以表示分类预测的确信程度。在超平面 w T x ( n ) + b = 0 \mathbf {w^T x^{(n)}}+b=0 wTx(n)+b=0 确定的情况下, ∣ w T x ( n ) + b ∣ |\mathbf {w^T x^{(n)}}+b| wTx(n)+b 能够相对地表示点 x ( n ) \mathbf x^{(n)} x(n) 距离超平面的远近,而 w T x ( n ) + b \mathbf {w^T x^{(n)}}+b wTx(n)+b 的符号与类标记 y ( n ) y^{(n)} y(n) 的符号是否一致能够表示分类是否正确。在这个阶段之前,与感知机部分的推导是一致的。为了计算方便,我们将类标记设置为 { − 1 , + 1 } \{-1,+1\} { 1,+1} ,因此,可以使用 y ( n ) ( w T x ( n ) + b ) y^{(n)} (\mathbf {w^T x^{(n)}}+b) y(n)(wTx(n)+b) 表示分类的正确性及确信程度。当所有样本被正确分类时, r ( n ) r^{(n)} r(n) 可以写为
r ( n ) = ∣ w T x ( n ) + b ∣ ∥ w ∥ = y ( n ) ( w T x ( n ) + b ) ∥ w ∥ r^{(n)}=\frac {|\mathbf {w^T x^{(n)}}+b|}{\|\mathbf w\|}=\frac {y^{(n)} (\mathbf {w^T x^{(n)}}+b)}{\|\mathbf w\|} r(n)=wwTx(n)+b=wy(n)(wTx(n)+b)
假设超平面能将训练样本正确分类,即对于 ( x ( n ) , y ( n ) ) ∈ D (\mathbf x^{(n)}, y^{(n)}) \in D (x(n),y(n))D,若 y ( n ) = + 1 y^{(n)}=+1 y(n)=+1,则有 w T x ( n ) + b > 0 \mathbf {w^T x^{(n)}}+b \gt 0 wTx(n)+b>0;若 y ( n ) = − 1 y^{(n)}=-1 y(n)=1,则有 w T x ( n ) + b < 0 \mathbf {w^T x^{(n)}}+b \lt 0 wTx(n)+b<0 ,令
w T x ( n ) + b ≥ 0 , y ( n ) = + 1 ; w T x ( n ) + b ≤ 0 , y ( n ) = − 1 ; \mathbf {w^T x^{(n)}}+b \ge 0,y^{(n)}=+1;\\ \mathbf {w^T x^{(n)}}+b \le 0,y^{(n)}=-1; wTx(n)+b0y(n)=+1;wTx(n)+b0y(n)=1;
在线性可分的情况下,距离超平面最近的训练样本会使等号成立,被称为支持向量。即
y ( n ) ( w T x ( n ) + b ) − 1 = 0 y^{(n)}(\mathbf {w^T x^{(n)}}+b)-1=0 y(n)(wTx

在C++中,我们可以使用一些机器学习库如Dlib、MLPACK或是Shogun来实现支持向量机SVM)模型的分类任务,例如针对鸢尾花数据集鸢尾花数据集是一个经典的数据科学示例,它包含150个样本,每个样本有4个特征(花瓣长度、花瓣宽度、萼片长度和萼片宽度),用于区分三种鸢尾花类别。 以下是使用C++和Scikit-Learn风格API(尽管Scikit-Learn本身不是C++库,但有一些C++接口提供相似的功能)实现基本步骤的一个简化概述: 1. **数据加载和预处理**:首先需要将数据从文件或CSV读取并转换成适合模型输入的格式。通常会包括特征缩放或标准化。 ```cpp #include <mlpack/core.hpp> arma::mat data; // 维矩阵表示数据 arma::Row<size_t> labels; // 存储标签 // 加载数据... ``` 2. **分割数据**:训练集和测试集通常是70%的数据用于训练,30%用于验证模型性能。 ```cpp arma::mat trainData = data.subset(0, static_cast<int>(trainSize)); arma::Row<size_t> trainLabels = labels.subset(0, static_cast<int>(trainSize)); arma::mat testData = data.subset(trainSize, -1); arma::Row<size_t> testLabels = labels.subset(trainSize, -1); ``` 3. **创建SVM模型**:使用mlpack或其他库提供的SVM类实例化模型,并配置参数(如核函数类型和惩罚参数C)。 ```cpp mlpack::regression::LinearSVM svm; svm.SetLearningRate(0.01); // 示例设置线性SVM svm.Train(trainData, arma::rowvec(trainLabels)); ``` 4. **预测和评估**:对测试集应用模型,计算准确率等指标。 ```cpp arma::Row<size_t> predictions = svm.Predict(testData); double accuracy = arma::accu(predictions == testLabels) / (double)testLabels.n_elem; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值