《机器学习》 SVM支持向量机 推导、参数解析、可视化实现

目录

一、SVM支持向量机

1、什么是SVM

例如:

2、SVM的主要特点是:

二、SVM方程

1、超平面方程

2、标签问题

3、决策函数:

符号函数:

整合:

4、距离问题

1)点到直线距离

2)点到平面距离

3)点到超平面距离

简写:

改进:加上正确性

分类正确时:

两个衡量指标:

5、如何找到最优超平面

1)找到距离超平面最近点

2)最大化这个距离

6、损失函数求解

7、超平面可视化

8、拉格朗日乘子法

9、整合函数与约束条件

10、修改目标函数

11、修改约束条件

12、整合结果

13、求解目标转化

1)对偶性质:

2)求解方式:

14、求解SVM

三、SVM参数

1、用法

2、参数解析

[1)C :惩罚因子【浮点数,默认为1.】【软间隔】](#1)C :惩罚因子【浮点数,默认为1.】【软间隔】)

[2.)kernel: 核函数【默认rbf(径向基核函数|高斯核函数)】](#2.)kernel: 核函数【默认rbf(径向基核函数|高斯核函数)】)

3)degree:【整型,默认3维】

[4)gamma: 'rbf','poly' 和'sigmoid'的核函数参数。默认是'auto'。](#4)gamma: ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’。)

5)coef0:核函数中的独立项。

[6)probability :是否启用概率估计。](#6)probability :是否启用概率估计。)

[7)cache_size :核函数cache缓存大小,默认为200MB](#7)cache_size :核函数cache缓存大小,默认为200MB)

[8)class_weight :类别的权重,字典形式传递。默认'balanced'](#8)class_weight :类别的权重,字典形式传递。默认’balanced’)

3、属性

[1)support_vectors_ 【支持向量】](#1)support_vectors_ 【支持向量】)

[2)n_support_ 【每个类别支持向量的个数】](#2)n_support_ 【每个类别支持向量的个数】)

[3)coef_ 【参数w】](#3)coef_ 【参数w】)

[4)intercept_ 【偏置项参数b】](#4)intercept_ 【偏置项参数b】)

四、代码实现

1、文件内容格式

2、代码实现

调试模式可以看到:

3、运行结果

4、流程介绍


一、SVM支持向量机

1、什么是SVM

支持向量机 (Support Vector Machine,SVM)是一种监督学习算法 ,用于分类和回归问题

在SVM中,我们将每个样本表示为在高维空间 中的一个点,并尝试找到一个超平面来将不同类别的样本分开。超平面的选择是基于使两个类别之间的间隔最大化的原则。支持向量机通过最大化支持向量与超平面之间的最小间隔来实现这一点。

例如:

很久以前的情人节,公主被魔鬼绑架了,王子要去救公主,魔鬼和他玩了一个游戏。魔鬼在桌子上似乎有规律放了两种颜色的球 ,说:"你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。

后来,我们把这些球叫做**【data->数据】**

把棍子叫做**【classifier->分类器】**

最大间隙trick 叫做**【optimization->最优化】**

拍桌子叫做**【kernelling->核函数】**

这张纸叫做**【hyperplane->超平面】**

核心:选择一个最佳的一条线或者超平面

2、SVM的主要特点是:

SVM可用于线性和非线性问题。对于非线性问题,SVM使用核函数来将样本映射到高维空间中。

SVM是一种较好的分类器,具有较高的准确性。

**•**SVM对于数据维度较高的情况下仍然有效。

**•**SVM对于处理小样本问题也很有效。

**•**SVM在处理具有多个特征的数据时表现良好。

二、SVM方程

1、超平面方程

2、标签问题

在SVM中我们不用0和1来区分 ,使用+1和-1来区分,这样会更严格。假设超平面可以将训练的样本正确分类,那么对于任意样本如果 y= +1,则称为正例,y= -1,则称为负例。

3、决策函数:

符号函数:
整合:

4、距离问题

1)点到直线距离
2)点到平面距离
3)点到超平面距离
简写:
**改进:**加上正确性
分类正确时:
两个衡量指标:

1、确信度:点到超平面的距离

2、正确性:分类正确

5、如何找到最优超平面

1)找到距离超平面最近点
2)最大化这个距离

使得离超平面最近的点到超平面的距离越近越好

6、损失函数求解

7、超平面可视化

8、拉格朗日乘子法

求解没有约束条件的极值问题,形式如下:

目标函数:

9、整合函数与约束条件

10、修改目标函数

11、修改约束条件

12、整合结果

13、求解目标转化

1)对偶性质:
2)求解方式:

14、求解SVM

三、SVM参数

1、用法

python 复制代码
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto_deprecated', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', random_state=None)[source]

2、参数解析

1)C :惩罚因子【浮点数,默认为1.】【软间隔】

(1) C越大,对误分类的惩罚增大,希望松弛变量接近0,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱;

(2) C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。

->>建议通过交叉验证来选择

2.) kernel : 核函数【默认rbf(径向基核函数|高斯核函数)】

可以选择线性(linear)、多项式(poly)、sigmoid

->>多数情况下选择rbf

3) degree:【整型,默认3维】

多项式poly 函数的维度,默认是3,选择其他核函数时会被忽略。

->>按默认【选择rbf之后,此参数不起作用】

4 )gamma : 'rbf','poly' 和'sigmoid'的核函数参数。默认是'auto'。

(1) 如果gamma是'auto' ,那么实际系数1 / n_features ,也就是数据如果有10个特征,那么gamma值维0.1。(sklearn0.21版本)

**(2)**在sklearn0.22版本中,默认为'scale',此时gamma=1 / (n_features*X.var())#X.var()数据集所有值的方差。

<1> gamma越大 ,过拟合风险越

<2> gamma越小 ,过拟合风险越

->>建议通过交叉验证来选择

****5)coef0:****核函数中的独立项。

多项式的偏置项。它只在'poly'和'sigmoid'中很重要。

6)probability:是否启用概率估计。

允许在模型训练完成后,使用predict_proba方法来预测每个类别的概率,而不是仅仅给出类别的预测结果。必须在调用fit之前启用它,并且会减慢该方法的速度。默认为False

->>按默认即可【选择rbf之后,不起作用】

7) cache_size:核函数cache缓存大小,默认为200MB

->>不用调整

8) class_weight:类别的权重,字典形式传递。默认'balanced'

->>按默认设置

3、属性

1) support_vectors_ 【支持向量】

->>以数组的形式储存

2)n_support_ 【每个类别支持向量的个数】

->>int类型

3)coef_ 【参数w】

->>数组的形式储存

4)intercept_ 【偏置项参数b】

->>数组的形式储存

四、代码实现

1、文件内容格式

第一列为排序,最后一列为分类结果

2、代码实现

python 复制代码
import pandas as pd

data = pd.read_csv('iris.csv',header=None)  # 导入数据

import matplotlib.pyplot as plt  # 导入绘图库

data1 = data.iloc[:50,:]  # 取出前50行,左右的列
data2 = data.iloc[50:,:]  # 取出后50行,所有的列

plt.scatter(data1[1],data1[3],marker='+')   # 绘制散点图,x轴为前50行的列名1,y轴为列号3,点的标记为+号
plt.scatter(data2[1],data2[3],marker='o')
# plt.show()

from sklearn.svm import SVC   # 导入支持向量机库

x = data.iloc[:,[1,3]]  # 取出原始数据的所有行,列名1和3两列
y = data.iloc[:,-1]  # 取出最后一列的所有数据

svm = SVC(kernel='linear',C=float("inf"),random_state=0)  # 建立分类器,导入参数kernel核函数为线性的,并设置惩罚因子C为无穷大
svm.fit(x,y)  # 训练

# 可视化svm结果
w = svm.coef_[0]   # 表示支持向量机的权重向量。对于线性SVM来说,权重向量可以用来描述决策边界的方向和斜率。
b = svm.intercept_[0]   # 表示支持向量机的截距(或偏差),即决策边界与原点的距离。

import numpy as np

x1 = np.linspace(0,7,300)  # 使用numpy中的函数linspace, 生成0到7之间300个连续数值的数组

x2 = -(w[0]*x1+b)/w[1]   # x2 表示决策边界的 y 坐标值,通过计算得到。具体计算方法是使用决策边界的系数 w[0] 和 w[1],以及截距 b,根据决策边界的方程 w[0]*x + w[1]*y + b = 0 求解出 y 值。

x3 = (1-(w[0]*x1+b))/w[1]  # x3和x4是决策边界上下两条辅助线的y坐标值,用于绘制支持向量。

x4 = (-1-(w[0]*x1+b))/w[1]


plt.plot(x1,x2,linewidth=2,color='r')   # 绘制折线图,x、y为坐标,线宽度为2,颜色为red
plt.plot(x1,x3,linewidth=1,color='r',linestyle='--')  # 在上述绘制的图像上方画条虚线
plt.plot(x1,x4,linewidth=1,color='r',linestyle='--')  # 在下方绘制虚线

plt.xlim(4,7)  # x轴范围
plt.ylim(0,5)  # y轴范围

vets = svm.support_vectors_  # 获取支持向量的坐标点
plt.scatter(vets[:,0],vets[:,1],c='b',marker='x')  # 绘制散点图,vets[:,0] 和 vets[:,1] 表示支持向量的 x 和 y 坐标,c='b' 设置颜色为蓝色,marker='x' 表示使用 X 做为散点标记。
plt.show()
调试模式可以看到:

3、运行结果

途中的圆点和+号点表示每个数据点,而在两条虚线上点叫支持向量,红实线和虚线是决策边界的直线和辅助线。

4、流程介绍

使用SVM算法对鸢尾花数据集进行二分类 ,并绘制出决策边界支持向量的可视化图

首先,通过pandas库读取名为"iris.csv "的数据集文件,存储在变量data中。然后,使用matplotlib.pyplot库绘制散点图,将数据集中前50个样本和后50个样本分别用不同的标记("+"和"o")表示。

接下来,从数据集中取出特征列1和特征列3 作为样本特征X ,及最后一列作为标签y 。然后,创建一个SVC分类器对象svm,使用线性核函数,并设置C参数为无穷,random_state为0,初始化支持向量机分类器。

进行模型训练,调用svm的fit方法,传入特征数据X和标签数据y。获取模型的权重向量w和截距b,分别存储在变量w和b中

接着,使用numpy库生成300个连续的数值,存储在变量x1中。根据决策边界的数学表达式 计算x2,x3和x4的值。利用matplotlib.pyplot库的plot函数绘制决策边界的直线和辅助线 。通过设置坐标轴的范围,使得图像能够更好地显示。获取支持向量的坐标 ,存储在变量vets中。使用scatter函数绘制支持向量的散点图。

最后,调用show方法将图像显示出来。

相关推荐
chenziang110 分钟前
leetcode hot100
算法·leetcode·职场和发展
执着的小火车18 分钟前
02-18.python入门基础一基础算法
数据结构·python·算法·排序算法
梦茹^_^19 分钟前
排序算法(系列)
数据结构·python·算法·排序算法·希尔排序·基数排序·计数排序和桶排序
花开盛夏^.^25 分钟前
Timsort算法
数据结构·算法·排序算法
code monkey.27 分钟前
【排序算法】—— 计数排序
c++·算法·排序算法
云青山水林28 分钟前
2024.12.21 周六
c++·算法·贪心算法
chenziang133 分钟前
leetcode hot二叉树的层序遍历
数据结构·算法
pianmian11 小时前
完全平方数
数据结构·算法
A_Tai23333331 小时前
贪心算法解决用最少数量的箭引爆气球问题
算法·贪心算法
dundunmm1 小时前
机器学习之PCA降维
机器学习·信息可视化·数据挖掘·数据分析