基本概念
概念
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
算法原理
SVM的基本思想是找到一个超平面,使得不同类别的数据在该超平面两侧,并且距离超平面最近的点到超平面的距离(即间隔)最大化。
如图:
现在有一个二维平面,平面上有两种不同的数据,分别用圈和叉表示。由于这些数据是线性可分的,所以可以用一条直线将这两类数据分开,这条直线就相当于一个超平面,超平面一边的数据点所对应的y全是 -1 ,另一边所对应的y全是1 。
这个超平面可以用分类函数表示,当f(x) 等于0的时候,x便是位于超平面上的点,而f(x)大于0的点对应 y=1 的数据点,f(x)小于0的点对应y=-1的点:
如图:
几个部分
最大间隔与分类
对一个数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也越大。所以,为了使得分类的确信度尽量高,需要让所选择的超平面能够最大化这个“间隔”值
什么是超平面?
超平面的选择与数据存在平面有关,如果数据点都在二维平面上,那么一条直接就可以分隔数据。如果所给的数据集是三维的,那么此时用来分隔数据的就是一个平面。显而易见,更高维的情况可以依此类推。当数据集是N维时,需要一个N-1维的某某对象来对数据进行分隔。N-1维的该对象被称为超平面,也就是分类的决策边界。 分布在超平面一侧的所有数据都属于某个类别,而分布在另一侧的所有数据则属于另一个类别。
如图:
当超平面方程等于0的时候,x便是位于超平面上的点,而f(x)大于0的点对应 y=1 的数据点,f(x)小于0的点对应y=-1的点。 也就是正样本在分隔超平面“上方”,负样本在分隔超平面”下方“。这也就意味着超平面函数需要等于0,SVM就是能将两类数据正确划分并且间隔最大的直线。
最优化:
对偶问题
约束条件
对偶问题外层的优化目标参数是拉格朗日参数,然后通过求得的拉格朗日参数,间接得到我们最终要求的超平面的参数 x 。而原始问题外层的优化目标参数直接是 x,无法直接去优化得到这个参数,因为还存在着其他未知的拉格朗日参数。
软间隔
以上的推导形式都是建立在样本数据线性可分的基础上,如果样本数据中线性不可分(你中有我,我中有你),应该如何处理呢?这里我们引入软间隔(Soft Margin),意味着,允许支持向量机在一定程度上出错。
损失函数
![](https://img-blog.csdnimg.cn/direct/9953bd5b8fae4ea295920953e5ca0511.png)
缺点:
替代损失
支持向量回归
特点:允许模型输出和实际输出间存在2ε的偏差
损失函数
![](https://img-blog.csdnimg.cn/direct/132b061d5807423cbf0db6303f66c384.png)
代码实现:
# -*- coding: utf-8 -*-
"""
Created on Sat Dec 9 03:44:25 2023
@author: HP_USER
"""
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('C:\Users\HP_USER\Desktop')
df.head()
#SVC: Supprt Vector Classifier支持向量分类器
from sklearn.svm import SVC
#准备数据
y = df['Virus Present']
X = df.drop('Virus Present',axis=1)
#定义模型
model = SVC(kernel='linear', C=1000)
#训练模型
model.fit(X, y)
# 绘制图像
# 定义绘制SVM边界方法
def plot_svm_boundary(model,X,y):
X = X.values
y = y.values
# Scatter Plot
plt.scatter(X[:, 0], X[:, 1], c=y, s=30,cmap='coolwarm')
# plot the decision function
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# create grid to evaluate model
xx = np.linspace(xlim[0], xlim[1], 20)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = model.decision_function(xy).reshape(XX.shape)
# plot decision boundary and margins
ax.contour(XX, YY, Z, colors='y', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
# plot support vectors
ax.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=100,
linewidth=1, facecolors='none', edgecolors='k')
plt.show()
plot_svm_boundary(model,X,y)
model = SVC(kernel='rbf', C=1,gamma=0.01)
model.fit(X, y)
plot_svm_boundary(model,X,y)
使用SVM训练数据集
![](https://img-blog.csdnimg.cn/direct/4c97c107be314f88903452d569a460d5.png)
利用多项式内核:
![](https://img-blog.csdnimg.cn/direct/5e09aeb4c9254f58b812b67f2795df89.png)