机器学习实验——支持向量机

基本概念

概念

支持向量机(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),意味着,允许支持向量机在一定程度上出错

损失函数

基本思路:最大化间隔的同时 , 让不满足约束的样本应尽可能少

缺点:

0/1 损失函数非凸、非连续 , 不易优化!

替代损失

支持向量回归

特点:允许模型输出和实际输出间存在2ε的偏差

 

损失函数 

落入中间 2 ε 间隔带的样本不计算损失 , 从而使得模型获得稀疏性 .

代码实现:

# -*- 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训练数据集

利用多项式内核:

参考文献: 

支持向量机与对偶问题 - 知乎 (zhihu.com)

机器学习支持向量机垃圾邮件 - 搜索 (bing.com)

机器学习(三):支持向量机SVM(含代码和注释)_虚拟向量机svm代码-CSDN博客

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值