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

支持向量机

线性可分的概念

D0和D1是n维欧氏空间中的两个点集(点的集合)。如果存在n维向量w和实数b,使得所有属于D0的点xi都有 wxi+b>0,而对于所有属于D1的点xj则有wxj+b<0。则我们称D0和D1线性可分。

线性可分支持向量机

线性可分支持向量机就是:以找出线性可分的样本在特征空间中的最大间隔超平面为学习目的的分类模型。

拉格朗日乘子法

目标函数:minf(x,y) s.t.g(x,y)<=0
利用梯度法求得:
在这里插入图片描述

KKT约束条件

将上面拆分开的严格不等式和等式两种情况再整合起来:
a.如果严格不等式成立时得到f()函数的极小值,则有 λ=0,这样才能将拉格朗日函数直接转换为原始函数。则有 λg(x,y)=0,如果等式成立时得到f() 函数的约束条件极小值,则必然存在 λ>0,且同时 g(x,y)=0, 因此也有λg(x,y)=0.于是,对于不等式约束条件 g(x,y)⩽0,最终的约束条件变成了:g(x,y)<=0,λ>=0,λg(x,y)=0

使用对偶算法求解线性可分 SVM 的步骤
  • 步骤1:对主问题构造拉格朗日函数。
  • 步骤2:求拉格朗日函数对于 w,b的极小。
  • 步骤3:求 minw,bL(w,b,α)对 α 的极大。
  • 步骤4:由对偶问题求 α1,α2,…,αm。
  • 步骤5:由 α∗ 求 w。
  • 步骤6:由 w求 b。
  • 步骤7: 求最终结果。
硬间隔和软间隔

线性可分 SVM 正负样本之间的间隔叫做“硬间隔”,也就是说在这个“隔离带”里面,肯定不会出现任何训练样本。即存在一个超平面能够将不同类的样本完全彻底,且无一错漏地分开。

非线性SVM

对于在有限维度向量空间中线性不可分的样本,我们将其映射到更高维度的向量空间里,再通过间隔最大化的方式,学习得到支持向量 机,就是非线性 SVM。

简单理解就是:非线性 SVM = 核技巧 + 线性 SVM。

核函数

对于有限维的原始空间,一定存在更高维度的空间,使得前者中的样本映射到新空间后可分。但是新空间(特征空间)的维度也许很大,甚至可能是无限维的。这样的话,直接计算 ϕ(xi)⋅ϕ(xj)就会很困难。

为了避免计算 ϕ(xi) 和 ϕ(xj) 的内积,我们需要设置一个新的函数——k(xi,xj):k(xi,xj)=ϕ()xi)⋅ϕ(xj)原始空间中的两个样本 xi 和 xj经过 k(⋅,⋅)函数计算所得出的结果,是它们在特征空间中映射成的新向量的内积。如此一来,我们就不必真的计算出 ϕ(xi)点乘 ϕ(xj)的结果,而可以直接用 k(⋅,⋅)函数代替它们。我们把这个 k(⋅,⋅)函数叫做核函数。
核函数的种类:

  • 线性核(Linear Kernel);
  • 多项式核(Polynomial Kernel);
  • RBF 核(Radial Basis Function Kernel);
  • Sigmoid 核(Sigmoid Kernel)等
    在这里插入图片描述
程序实现
## 基础函数库
import numpy as np 
## 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns
## 导入逻辑回归模型函数
from sklearn import svm
##Demo演示LogisticRegression分类
## 构造数据集
x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
y_label = np.array([0, 0, 0, 1, 1, 1])
## 调用SVC模型 (支持向量机分类)
svc = svm.SVC(kernel='linear')
## 用SVM模型拟合构造的数据集
svc = svc.fit(x_fearures, y_label)
## 查看其对应模型的w
print('the weight of Logistic Regression:',svc.coef_)
## 查看其对应模型的w0
print('the intercept(w0) of Logistic Regression:',svc.intercept_)
the weight of Logistic Regression: [[0.33364706 0.33270588]]
the intercept(w0) of Logistic Regression: [-0.00031373]
## 模型预测
y_train_pred = svc.predict(x_fearures)
print('The predction result:',y_train_pred)
The predction result: [0 0 0 1 1 1]
# 最佳函数
x_range = np.linspace(-3, 3)
w = svc.coef_[0]
a = -w[0] / w[1]
y_3 = a*x_range - (svc.intercept_[0]) / w[1]
# 可视化决策边界
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.plot(x_range, y_3, '-c')
plt.show()

结果图:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigCabbageFy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值