基于支持向量机的分类预测

本文介绍了支持向量机(SVM)的基本原理和优化问题。内容包括线性可分、最大间隔超平面的概念,支持向量的定义,以及如何通过SVM寻找最大间隔超平面。同时,讨论了软间隔分类和非线性核函数分类,解释了如何通过调整惩罚参数C和使用高斯核函数实现非线性分类。
摘要由CSDN通过智能技术生成

数据及背景

link
基于支持向量机的分类预测

学习目标

了解支持向量机的分类标准;
了解支持向量机的软间隔分类;
了解支持向量机的非线性核函数分类;

理论知识

在这里插入图片描述
1.1线性可分
在二维空间上,两类点被一条直线完全分开叫做线性可分。
在这里插入图片描述

严格的数学定义是:

D0和 D1 是 n 维欧氏空间中的两个点集。如果存在 n 维向量 w 和实数 b,使得所有属于 D0的点xi都有 [公式]
,而对于所有属于D1的点 xj则有 [公式]
,则我们称D0和D1 线性可分。

1.2 最大间隔超平面
从二维扩展到多维空间中时,将D0和 D1 完全正确地划分开的 [公式]
就成了一个超平面。

为了使这个超平面更具鲁棒性,我们会去找最佳超平面,以最大间隔把两类样本分开的超平面,也称之为最大间隔超平面。

两类样本分别分割在该超平面的两侧;
两侧距离超平面最近的样本点到超平面的距离被最大化了。

1.3 支持向量
在这里插入图片描述
样本中距离超平面最近的一些点,这些点叫做支持向量。

1.4 SVM 最优化问题

SVM 想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面可以用下面这个线性方程来描述:
在这里插入图片描述
二维空间点(x,y)到直线 Ax+By+C=0的距离公式是:
在这里插入图片描述
扩展到 n 维空间后,点 [公式]
到直线 [公式]
的距离为:在这里插入图片描述

如图所示,根据支持向量的定义我们知道,支持向量到超平面的距离为 d,其他点到超平面的距离大于 d。
在这里插入图片描述
于是我们有这样的一个公式:
在这里插入图片描述
稍作转化可以得到:
在这里插入图片描述
||w||d 是正数,我们暂且令它为 1(之所以令它等于 1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),故:
在这里插入图片描述
将两个方程合并,我们可以简写为:
在这里插入图片描述
至此我们就可以得到最大间隔超平面的上下两个超平面:
在这里插入图片描述
每个支持向量到超平面的距离可以写为:
在这里插入图片描述
由上述 [公式] 可以得到 [公式] ,所以我们得到:
在这里插入图片描述

支持向量机介绍

我们常常会碰到这样的一个问题,首先给你一些分属于两个类别的数据

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
%matplotlib inline

# 画图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, s=60, cmap=plt.cm.Paired)

在这里插入图片描述
现在需要一个线性分类器,将这些数据分开来。

我们可能会有多种分法:

# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)

x_fit = np.linspace(0, 3)
# 画函数
y_1 = 1 * x_fit + 0.8
plt.plot(x_fit, y_1, '-c')
y_2 = -0.3 * x_fit + 3
plt.plot(x_fit, y_2, '-k')

在这里插入图片描述
那么现在有一个问题,两个分类器,哪一个更好呢?

为了判断好坏,我们需要引入一个准则:好的分类器不仅仅是能够很好的分开已有的数据集,还能对未知数据集进行两个的划分。

假设,现在有一个属于红色数据点的新数据(3, 2.8)

# 画散点图
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired)
plt.scatter([3], [2.8], c='#cccc00', marker='<', s=100, cmap=plt.cm.Paired)

x_fit = np.linspace(0, 3)

# 画函数
y_1 = 1 * x_fit + 0.8
plt.plot(x_fit, y_1, '-c')
y_2 =
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值