当前位置: 首页 > news >正文

教程网站建设做风帆网站需要多少钱

教程网站建设,做风帆网站需要多少钱,备案的网站每年都要备案么,跨境外贸网文章目录 前言分析数据集线性可分情况下的支持向量机原始问题凸优化包解法对偶问题凸优化包解法 数据集线性不可分情况下的线性支持向量机与软间隔最大化 前言 在支持向量机中,理论逻辑很简单:最大化最小的几何间隔。但是实际编写代码过程中有一个小点需…

文章目录

  • 前言
  • 分析
  • 数据集线性可分情况下的支持向量机
    • 原始问题凸优化包解法
    • 对偶问题凸优化包解法
  • 数据集线性不可分情况下的线性支持向量机与软间隔最大化

前言

  • 在支持向量机中,理论逻辑很简单:最大化最小的几何间隔。但是实际编写代码过程中有一个小点需要注意。总是把二分类的类别分为01,这样就导致我的目标函数跟算法描述的就不一样,所以求解结果就不正确。
  • 同时还有第二个要注意的就是凸优化包cvxpy中各种运算的表示方法,比如凸优化中常见的二次方程的表示,变量的默认形状等,要查看官方文档才能熟悉。变量的默认形状为列向量。

参考:

  • 李航:统计学习方法
  • CVXPY

分析

支持向量机算法中,我们的训练数据除了是两种类别以外,类别的编号也有要求,分别是1-1,只有这样,我们才能求每个样本所对应的函数间隔 D = y i ( w x i + b ) D=y_i(wx_i+b) D=yi(wxi+b)和几何间隔 D = y i w x i + b ∥ w ∥ 2 D=y_i\frac{wx_i+b}{\|w\|_2} D=yiw2wxi+b,在这种类别标签的情况下,预测值 w x i + b wx_i+b wxi+b与真实值 y i y_i yi之间的乘积才有意义。
预测与真实相同,乘积才会是大于0的;预测与真实相反,乘积就是小于0的。只有这样后面的目标函数最大化几何间隔才有意义。
重新表述一下可分数据集上支持向量机的目标函数和约束条件:
max λ s.t. y i w x i + b ∥ w ∥ 2 ≥ λ \begin{align*} &\textbf{max}&\lambda \\ &\textbf{s.t.} &y_i\frac{wx_i+b}{\|w\|_2}\ge\lambda \end{align*} maxs.t.λyiw2wxi+bλ

如果我们使用类别标签为01,那么当错误分类时,几何间隔为0,无法指导参数修改。所以必须要使用1-1

数据集线性可分情况下的支持向量机

此时有两种求法,一种是用原始算法,直接用cvxpy函数包求解原始的这个凸优化问题,并把问题变为下述形式:
max t ∥ w ∥ 2 s.t. y i ( w x i + b ) ≥ t \begin{align*} &\textbf{max}&\frac{t}{\|w\|_2} \\ &\textbf{s.t.} &y_i{(wx_i+b)}\ge t \end{align*} maxs.t.w2tyi(wxi+b)t

由于通过同比例放大w,b可以实现条件中左边的乘积大小的任意变换,所以我们修改t 1 1 1。上述凸优化问题就变为:
min ∥ w ∥ 2 s.t. y i ( w x i + b ) ≥ 1 \begin{align*} &\textbf{min}&{\|w\|_2} \\ &\textbf{s.t.} &y_i{(wx_i+b)}\ge 1 \end{align*} mins.t.w2yi(wxi+b)1

第二种方法就是将原始问题使用拉格朗日乘子法变换为对偶问题,将加入条件和拉格朗日乘子的拉格朗日函数进行求导,并将求导得到的关系式带入拉格朗日函数,这样就可以得到对偶问题。

原始问题凸优化包解法

import numpy as np
import cvxpy as cp
#生成符合要求的样本数据
np.random.seed(3)
train_x=np.random.randn(2,2)
weight_x=np.random.randn(2)
bias_x=np.random.randn(1)
train_y=np.where(train_x@weight_x+bias_x<0,-1,1).reshape(2,-1)
print(train_x,train_y)
#求解对偶凸优化问题
w=cp.Variable(2)
b=cp.Variable(1)
obj=cp.Minimize(1/2*cp.sum_squares(w))
cons=[train_y[0]*(train_x@w+b)[0]>=1,train_y[1]*(train_x@w+b)[1]>=1]
prob=cp.Problem(obj,cons)
result=prob.solve()
#输出拉格朗日乘子的和最优化的目标函数值以及权重w
print(f'w.value,result,b.value:{w.value,result,b.value}')

结果如下:

[[ 1.78862847  0.43650985][ 0.09649747 -1.8634927 ]] [[-1][ 1]]
w.value,result,b.value:(array([-0.41507783, -0.56418804]), 0.24529887505030906, array([-0.01130633]))

对偶问题凸优化包解法

本例子中我们使用了小规模的数据,只有两个样本,所以这两个样本肯定都是支持向量,也就是对应的拉格朗日乘子都不为0,对于大规模样本数据的情况,如果不在分界面上,那么对应的拉格朗日乘子为0,也就不是支持向量。拉格朗日乘子不为0的肯定就是支持向量。

import numpy as np
import cvxpy as cp
#生成符合要求的样本数据
np.random.seed(3)
train_x=np.random.randn(2,2)
weight_x=np.random.randn(2)
bias_x=np.random.randn(1)
train_y=np.where(train_x@weight_x+bias_x<0,-1,1).reshape(2,-1)
print(train_x,train_y)
#求解对偶凸优化问题
alpha=cp.Variable(2)
obj=cp.Minimize(1/2*cp.quad_form(alpha,(train_x@train_x.T)*(train_y@train_y.T))-cp.sum(alpha))
cons=[alpha>=0,train_y.T@alpha>=0,train_y.T@alpha<=0]
prob=cp.Problem(obj,cons)
result=prob.solve()
#输出拉格朗日乘子的和最优化的目标函数值以及权重w
print(f'alpha.value,result,w:{alpha.value,result,np.array(alpha.value.reshape(2,-1)*train_y*train_x).sum(axis=0)}')
#检验支持向量机求出的分离面是否与这两个样本之间的连线垂直
w=np.array(alpha.value.reshape(2,-1)*train_y*train_x).sum(axis=0)
np.array(train_x[0,:]-train_x[1,:]).reshape(1,-1)@np.array([-w[1]/w[0],1]).reshape(2,-1)

结果如下:

[[ 1.78862847  0.43650985][ 0.09649747 -1.8634927 ]] [[-1][ 1]]
alpha.value,result,w:(array([0.24529888, 0.24529888]), -0.24529887505030898, array([-0.41507783, -0.56418804]))
array([[-4.4408921e-16]])

至于参数b,我们可以通过支持向量所对应的等式求出。
我们可以观察一下原始问题与对偶问题的解答是否一致。

数据集线性不可分情况下的线性支持向量机与软间隔最大化

软间隔顾名思义就是给原来的间隔留下一点宽容量,给那些不容易分正确的留一点余地。同时对于这些余地进行惩罚所得到的分割面,以上面线性可分的数据做演示。

import numpy as np
import cvxpy as cp
#生成符合要求的样本数据
np.random.seed(3)
train_x=np.random.randn(2,2)
weight_x=np.random.randn(2)
bias_x=np.random.randn(1)
train_y=np.where(train_x@weight_x+bias_x<0,-1,1).reshape(2,-1)
print(train_x,train_y)
#求解对偶凸优化问题
w=cp.Variable(2)
b=cp.Variable(1)
softgap=cp.Variable(2)
obj=cp.Minimize(1/2*cp.sum_squares(w)+100*cp.sum(softgap))
cons=[train_y[0]*(train_x@w+b)[0]>=1-softgap[0],train_y[1]*(train_x@w+b)[1]>=1-softgap[1],softgap>=0]
prob=cp.Problem(obj,cons)
result=prob.solve()
#输出拉格朗日乘子的和最优化的目标函数值以及权重w
print(f'w.value,result,b.value,softgap.value:{w.value,result,b.value,softgap.value}')

结果如下:

[[ 1.78862847  0.43650985][ 0.09649747 -1.8634927 ]] [[-1][ 1]]
w.value,result,b.value,softgap.value:(array([-0.41507783, -0.56418804]), 0.24529887505030906, array([-0.01130633]), array([-2.90746355e-22,  1.53881391e-22]))

可以看出在线性可分的的情况下软间隔不起作用。
那么我们制造一些线性不可分的数据,来测试一下。

import numpy as np
import cvxpy as cp
#生成符合要求的样本数据
np.random.seed(3)
train_x=np.array([[0,0],[1,0],[2,0]])
train_y=np.array([-1,1,-1]).reshape(3,-1)
print(train_x,train_y)
#求解对偶凸优化问题
w=cp.Variable(2)
b=cp.Variable(1)
softgap=cp.Variable(3)
obj=cp.Minimize(1/2*cp.sum_squares(w)+0.1*cp.sum(softgap))
cons=[train_y[0]*(train_x@w+b)[0]>=1-softgap[0],train_y[1]*(train_x@w+b)[1]>=1-softgap[1],train_y[2]*(train_x@w+b)[2]>=1-softgap[2],softgap>=0]
prob=cp.Problem(obj,cons)
result=prob.solve()
#输出拉格朗日乘子的和最优化的目标函数值以及权重w
print(f'w.value,result,b.value,softgap.value:{w.value,result,b.value,softgap.value}')

结果如下:

[[0 0][1 0][2 0]] [[-1][ 1][-1]]
w.value,result,b.value,softgap.value:(array([9.07653476e-18, 0.00000000e+00]), 0.2, array([-1.]), array([ 8.59013373e-23,  2.00000000e+00, -8.59013423e-23]))
http://www.yayakq.cn/news/32049/

相关文章:

  • 公司建设网站的可行性分析市场调研报告怎么写的
  • 网站建设最新活动网站开发常用开发语言
  • iis编辑网站绑定招聘网站怎么做市场
  • 网站改版方案ppt影视传媒广告公司网站模板
  • 大型网站的例子在哪个网站可以学做甜点
  • 现在建网站赚钱吗网站如何注销
  • 浙江省建设业协会网站wordpress主题修改软件
  • 网站建设摊销wordpress 网络验证
  • 长沙机械网站建设网站后台如何修改密码
  • 建站合同模板网站建设的费用报价
  • 外贸家具网站首页设计html个人主页源代码
  • 诗人做的网站wordpress apache
  • 门头沟网站建设长春网站建设公司哪个好
  • 深圳如何优化网站华为开发者联盟
  • 免费发布信息网站大全注册杭州做邮票的公司网站
  • 中国建设银行企业网站首页广东水利建设与管理信息网站
  • 手机笑话网站模板做网站设计注意什么细节
  • 泉州网站建设报价网站建设与管理的条件
  • 做门户网站的思路成都住房和城乡建设官网
  • 一级做爰片c视频网站wordpress带手机端
  • metro 导航网站个人 可以做网站备案吗
  • 临泽县建设局网站网络营销上市公司
  • 数据库如何导入wordpress绵阳网站搜索优化
  • 网站开发入门ppt网络品牌营销
  • 天河网站 建设seo信科分公司网站平台搭建
  • 专门卖医疗器械的网站wordpress中文版支持繁体
  • 二级网站收录潮州营销型网站建设推广
  • 深圳做网站小程序南京市网站开发
  • 织梦调用网站类型制作小程序的流程
  • 柳州制作网站网站设计制作报价