python—二次规划求解

  • 一般步骤
  • 引例
  • SVDD求解
    • 单分类
    • 二分类
  • 代码分析

一般步骤

  • 将一般形式的待求解目标函数化成标准形式。
    标准形式如下:

{ min ⁡ x = 1 2 x T P x + q T x s . t . G x ≤ h A x = b \begin{cases} \min \limits_{x} = \frac{1}{2}x^{T}Px + q^{T}x \\ s.t. \ \ \ \ Gx \leq h \\ Ax = b \end{cases} ⎩⎪⎨⎪⎧​xmin​=21​xTPx+qTxs.t.    Gx≤hAx=b​

  • 带入cvxopt包中的solvers方法求解

引例

【例】求如下的二次规划问题
min ⁡ x f ( x ) = 1 2 x 1 2 + x 2 2 − x 1 x 2 − 2 x 1 − 6 x 2 , s . t . { x 1 + x 2 ≤ 2 − x 1 + 2 x 2 ≤ 2 2 x 1 + x 2 ≤ 3 x 1 , x 2 ≥ 0 \min \limits_{x}f(x) = \frac{1}{2}x_{1}^{2} + x_{2}^{2} -x_{1}x_{2} -2x_{1} - 6x_{2},s.t.\ \begin{cases} x_{1} + x_{2} \leq 2\\ -x_{1} + 2x_{2} \leq 2\\ 2x_{1} + x_{2}\leq3\\ x_{1}, x_{2} \geq 0 \end{cases} xmin​f(x)=21​x12​+x22​−x1​x2​−2x1​−6x2​,s.t. ⎩⎪⎪⎪⎨⎪⎪⎪⎧​x1​+x2​≤2−x1​+2x2​≤22x1​+x2​≤3x1​,x2​≥0​
首先,我们将上式化成标准形式。
向量 x \boldsymbol{x} x 很容易写出来,因为 f ( x ) f(x) f(x) 包含两个变量 x 1 x_{1} x1​, x 2 x_{2} x2​,因此
x = [ x 1 x 2 ] x = \begin{bmatrix} x_{1} \\ x_{2} \end{bmatrix} x=[x1​x2​​]
向量 q q q只与两个变量 x 1 x_{1} x1​, x 2 x_{2} x2​的一次项有关,所以 q T x = − 2 x 1 − 6 x 2 q^T \boldsymbol{x} = -2x_{1} - 6x_{2} qTx=−2x1​−6x2​,因此
q = [ − 2 − 6 ] q = \begin{bmatrix} -2 \\ -6 \end{bmatrix} q=[−2−6​]
最后,矩阵 P P P 只与两个变量 x 1 x_{1} x1​, x 2 x_{2} x2​的二次项有关,所以 1 2 x T P x = 1 2 x 1 2 + x 2 2 − x 1 x 2 \frac{1}{2}x^TPx = \frac{1}{2}x_{1}^2 + x_{2}^2 - x_{1}x_{2} 21​xTPx=21​x12​+x22​−x1​x2​,这里要注意的是不同于二次型,这里有个系数 1 2 \frac{1}{2} 21​,所以矩阵 P P P的元素是二次型中的矩阵元素大小的两倍。给出一个规律:设矩阵 P P P第 i i i行第 j j j列的元素大小为 P ( i , j ) P(i, j) P(i,j),二次项 x i , y j x_{i}, y_{j} xi​,yj​的系数为 a ( i , j ) a(i, j) a(i,j),
P ( i , j ) = { 2 a ( i , j ) , i = j a ( i , j ) , i ≠ j P(i, j) = \begin{cases} 2a(i, j), i = j \\ a(i, j), i \neq j \end{cases} P(i,j)={2a(i,j),i=ja(i,j),i​=j​
本例中, P ( i , j ) = [ 1 − 2 − 2 2 ] P(i, j ) = \begin{bmatrix} 1 &-2\\ -2&2 \end{bmatrix} P(i,j)=[1−2​−22​],这是由于 x 1 x_{1} x1​的平方项(即 x 1 2 x_{1}^2 x12​),所以第1行的第1列的元素为 1 = 2 ∗ ( 1 2 ) 1 = 2*(\frac{1}{2}) 1=2∗(21​), x 2 x_{2} x2​的平方项(即 x 2 2 x_{2}^2 x22​)系数为1,所以第2行第2列的元素为 2 = 2 ∗ 1 2 = 2*1 2=2∗1, x 1 x 2 x_{1}x_{2} x1​x2​即( x 2 x 1 x_{2}x_{1} x2​x1​)的系数为-1,所以第1行第2列和第2行第1列的元素均为-2。

再看约束条件部分,约束条件应该写成以下标准形式:
{ G x ≤ h A x = b \begin{cases} Gx \leq h \\ Ax = b \end{cases} {Gx≤hAx=b​

本例中约束条件只有不等式约束,因此 A = ∅ A = \emptyset A=∅,对于 G G G 和 h h h很容易就看得出来:
G = [ 1 1 − 1 2 2 1 − 1 0 0 − 1 ] , h = [ 2 2 3 0 0 ] G = \begin{bmatrix} 1 & 1\\ -1 & 2\\ 2 & 1\\ -1 & 0\\ 0 & -1 \end{bmatrix}, h = \begin{bmatrix} 2\\ 2\\ 3\\ 0\\ 0 \end{bmatrix} G=⎣⎢⎢⎢⎢⎡​1−12−10​1210−1​⎦⎥⎥⎥⎥⎤​,h=⎣⎢⎢⎢⎢⎡​22300​⎦⎥⎥⎥⎥⎤​
注意,当 x ≤ 0 x \leq 0 x≤0时,乘以一个 − 1 -1 −1,变成 − x ≥ 0 -x \geq 0 −x≥0。

python 代码求解:1)要是约束条件中有的没有,则不输入给qb函数即可,比如此例子中的A,b。2)输入必须是float类型,所以用tc=‘d’,转一下数据类型。

def sqp(paraP, paraq, paraG, parah):P = matrix(np.array(paraP), tc='d')q = matrix(np.array(paraq), tc='d')G = matrix(np.array(paraG), tc='d')h = matrix(np.array(parah), tc='d')# A = matrix(np.array(paraA), tc='d')# b = matrix(np.array(parab), tc='d')result = solvers.qp(P, q, G, h)print('x\n', result['x'])P = [[1, -1], [-1, 2]]
q = [-2, 6]
G = [[1, 1], [-1, 2], [2, 1], [-1, 0], [0, -1]]
h = [2, 2, 3, 0, 0]sqp(P, q, G, h)

求解结果:

SVDD求解

SVDD原理是在特征空间寻找一个体积最小的超球体,为了构造这样一个最小体积的超球体,SVDD需要解决以下优化问题:
{ min ⁡ x , R , ξ R 2 + C ∑ i = 1 n ξ i s . t . ∣ ∣ ϕ ( x i ) − a ∣ ∣ 2 ≤ R + ξ i , ξ i ≥ 0 , ∀ i = 1 , 2 , ⋯ , n \begin{cases} \min \limits_{x, R, \xi} R^2 + C\sum\limits_{i = 1}^n\xi_{i} \\ s.t. \ \ \ \ ||\phi(x_{i}) - a ||^2 \leq R + \xi_{i}, \xi_{i} \geq 0, \forall i = 1, 2, \cdots , n \end{cases} ⎩⎨⎧​x,R,ξmin​R2+Ci=1∑n​ξi​s.t.    ∣∣ϕ(xi​)−a∣∣2≤R+ξi​,ξi​≥0,∀i=1,2,⋯,n​
式中, R R R 是超球体半径, a a a 是超球体的球心, ξ \xi ξ 是松弛因子, C C C 是一个权衡超球体体积和误分率的惩罚参数, C C C 大,则表示惩罚越大,为了使目标函数最小,则 ξ \xi ξ 变小,同时 R R R 变大。相反, C C C 越小, R R R 越小。

单分类

对于单分类来说,结合拉格朗日乘子法(具体过程详见参考文献),原问题的对偶问题为:
{ min ⁡ α i ∑ i = 1 n ∑ j = 1 n α i α j K ( x i , x j ) − ∑ i = 1 n α i K ( x i , x j ) s . t . 0 ≤ α i ≤ C , ∑ i = 1 n α i = 1 \begin{cases} \min \limits_{\alpha_{i}}\sum\limits_{i=1}^n\sum\limits_{j=1}^n\alpha_{i}\alpha_{j} K(x_{i}, x_{j}) - \sum\limits_{i = 1}^n\alpha_{i}K(x_{i}, x_{j})\\ s.t. \ \ \ \ 0 \leq \alpha_{i} \leq C, \ \ \sum\limits_{i =1}^n\alpha_{i} = 1 \end{cases} ⎩⎪⎪⎨⎪⎪⎧​αi​min​i=1∑n​j=1∑n​αi​αj​K(xi​,xj​)−i=1∑n​αi​K(xi​,xj​)s.t.    0≤αi​≤C,  i=1∑n​αi​=1​

把所有的 α i , α j \alpha_{i}, \alpha_{j} αi​,αj​ 看成是一个向量 α \boldsymbol{\alpha} α,根据二次规划的标准形式可以得到:
P = 2 ∑ i = 1 n ∑ j = 1 n K ( x i , x j ) , q = ( − ∑ i = 1 n K ( x i , x i ) ) T G = [ 1 0 0 ⋯ 0 0 1 0 ⋯ 0 ⋮ ⋱ ⋱ ⋱ ⋮ 0 0 0 ⋯ 1 − 1 0 0 ⋯ 0 0 − 1 0 ⋯ 0 ⋮ ⋱ ⋱ ⋱ ⋮ 0 0 0 ⋯ − 1 ] , h = [ C ⋮ C 0 ⋮ 0 ] A = [ 1 1 ⋯ 1 ] b = 1 P = 2\sum\limits_{i = 1}^n\sum\limits_{j = 1}^nK(x_{i}, x_{j}),\ q =(-\sum\limits_{i =1}^nK(x_{i}, x_{i}))^T\\ G = \begin{bmatrix} 1 & 0 &0 &\cdots &0\\ 0 & 1& 0&\cdots &0\\ \vdots & \ddots& \ddots&\ddots & \vdots\\ 0 & 0& 0&\cdots &1\\ -1 & 0 &0 &\cdots &0\\ 0 & -1& 0&\cdots &0\\ \vdots & \ddots& \ddots&\ddots & \vdots\\ 0 & 0& 0&\cdots &-1 \end{bmatrix}, \ h = \begin{bmatrix} C \\ \vdots\\ C\\ 0\\ \vdots\\ 0\end{bmatrix}\\ A = \begin{bmatrix} 1 & 1& \cdots &1 \end{bmatrix} \ b =1 P=2i=1∑n​j=1∑n​K(xi​,xj​), q=(−i=1∑n​K(xi​,xi​))TG=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​10⋮0−10⋮0​01⋱00−1⋱0​00⋱000⋱0​⋯⋯⋱⋯⋯⋯⋱⋯​00⋮100⋮−1​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​, h=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​C⋮C0⋮0​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​A=[1​1​⋯​1​] b=1
设样本总数是 n n n,其中 G G G 大小是 2 n ∗ n 2n * n 2n∗n, h h h 的大小是 2 n ∗ 1 2n * 1 2n∗1, A A A 的大小是 1 ∗ n 1 * n 1∗n, b b b 的大小时1。

二分类

对于二分类,在正类训练集中加入了少数的负类样本来防止过拟合情况,假设正样例和负样例的标签分别是 y i = + 1 y_{i} = +1 yi​=+1 和 y j = − 1 y_{j} = -1 yj​=−1,则原优化问题的对偶问题变为:
{ min ⁡ α i ∑ i = 1 n ∑ j = 1 n y i y j α i α j K ( x i , x j ) − ∑ i = 1 n y i α i K ( x i , x j ) s . t . 0 ≤ α i ≤ C 1 , 0 ≤ α i ≤ C 2 , ∑ i = 1 n y i α i = 1 \begin{cases} \min \limits_{\alpha_{i}}\sum\limits_{i=1}^n\sum\limits_{j=1}^n y_{i}y_{j} \alpha_{i}\alpha_{j} K(x_{i}, x_{j}) - \sum\limits_{i = 1}^ny_{i}\alpha_{i}K(x_{i}, x_{j})\\ s.t. \ \ \ \ 0 \leq \alpha_{i} \leq C_{1}, \ 0 \leq \alpha_{i} \leq C_{2}, \ \ \sum\limits_{i =1}^ny_{i}\alpha_{i} = 1 \end{cases} ⎩⎪⎪⎨⎪⎪⎧​αi​min​i=1∑n​j=1∑n​yi​yj​αi​αj​K(xi​,xj​)−i=1∑n​yi​αi​K(xi​,xj​)s.t.    0≤αi​≤C1​, 0≤αi​≤C2​,  i=1∑n​yi​αi​=1​
两类比一类会多一个 y y y,此时可以的到:
P = 2 ∑ i = 1 n ∑ j = 1 n y i y j K ( x i , x j ) , q = ( − ∑ i = 1 n y i K ( x i , x i ) ) T G = [ 1 0 0 ⋯ 0 0 1 0 ⋯ 0 ⋮ ⋱ ⋱ ⋱ ⋮ 0 0 0 ⋯ 1 − 1 0 0 ⋯ 0 0 − 1 0 ⋯ 0 ⋮ ⋱ ⋱ ⋱ ⋮ 0 0 0 ⋯ − 1 ] , h = [ C 1 ⋮ C 2 ⋮ 0 ] A = [ y 1 , y 2 , ⋯ , y n ] , b = 1 P = 2\sum\limits_{i = 1}^n\sum\limits_{j = 1}^n y_{i} y_{j}K(x_{i}, x_{j}),\ q =(-\sum\limits_{i =1}^ny_{i}K(x_{i}, x_{i}))^T\\ G = \begin{bmatrix} 1 & 0 &0 &\cdots &0\\ 0 & 1& 0&\cdots &0\\ \vdots & \ddots& \ddots&\ddots & \vdots\\ 0 & 0& 0&\cdots &1\\ -1 & 0 &0 &\cdots &0\\ 0 & -1& 0&\cdots &0\\ \vdots & \ddots& \ddots&\ddots & \vdots\\ 0 & 0& 0&\cdots &-1 \end{bmatrix}, \ h = \begin{bmatrix}C_{1} \\ \vdots\\ C_{2} \\ \vdots\\ 0\end{bmatrix}\\ A = \begin{bmatrix} y_{1}, y_{2}, \cdots, y_{n} \end{bmatrix}, \ b =1 P=2i=1∑n​j=1∑n​yi​yj​K(xi​,xj​), q=(−i=1∑n​yi​K(xi​,xi​))TG=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​10⋮0−10⋮0​01⋱00−1⋱0​00⋱000⋱0​⋯⋯⋱⋯⋯⋯⋱⋯​00⋮100⋮−1​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​, h=⎣⎢⎢⎢⎢⎢⎢⎡​C1​⋮C2​⋮0​⎦⎥⎥⎥⎥⎥⎥⎤​A=[y1​,y2​,⋯,yn​​], b=1
与单分类不同的是 h h h 的前 n n n 部分的 C C C 是对应于正负样本的 C 1 , C 2 C_{1}, C_{2} C1​,C2​,总大小和单分类一样为 2 n ∗ 1 2n *1 2n∗1。 A A A 等于标签的值。

代码分析

        label = np.mat(label)K = np.multiply(label*label.T, K)# Pn = K.shape[0]P = K+K.T# qq = -np.multiply(label, np.mat(np.diagonal(K)).T)# GG1 = -np.eye(n)G2 = np.eye(n)G = np.append(G1, G2, axis=0)# hh1 = np.mat(np.zeros(n)).T # lbh2 = np.mat(np.ones(n)).Tif self.labeltype == 'single':h2[label == 1] = self.parameters["positive penalty"]if self.labeltype == 'hybrid':h2[label == 1] = self.parameters["positive penalty"]h2[label == -1] = self.parameters["negative penalty"]h = np.append(h1, h2, axis=0)# A, bA = np.mat(np.ones(n) * np.array(label).reshape(1, n))#A = np.mat(np.ones(n))b = 1.#P = matrix(P)q = matrix(q)G = matrix(G)h = matrix(h)A = matrix(A)b = matrix(b)#sol =solvers.qp(P, q, G, h, A, b)alf = np.array(sol['x'])print(alf)

python—二次规划求解相关推荐

  1. python解一元二次方程步骤-Python实现求解一元二次方程的方法示例

    Python实现求解一元二次方程的方法示例 本文实例讲述了Python实现求解一元二次方程的方法.分享给大家供大家参考,具体如下: 1. 引入math包 2. 定义返回的对象 3. 判断b*b-4ac ...

  2. 2021-04-24 Python 最小二乘法求解线性回归模型

    Python 最小二乘法求解线性回归模型 机器学习线性回归模型 线性回归(linear regression)是一种线性模型,它假设输入变量 x 和单个输出变量 y 之间存在线性关系 具体来说,利用线 ...

  3. 利用python来求解网络的平均路径长度和聚类系数

    利用python来求解网络的平均路径长度和聚类系数 # -*- coding: utf-8 -*- """ Created on Mon Aug 19 13:14:12 ...

  4. 深度学习————如何在Python中求解函数的解析表达式

    1 致谢 感谢杨老师的教导! 2 在Python中求解函数的解析表达式 首先写出函数的表达式,然后使用SymPy函数库求解函数偏导数的解析表达式(符号微分),然后再使用SymPy库将求得的符号微分转换 ...

  5. python如何求解微分方程_用Python数值求解偏微分方程

    1 引言 微分方程是描述一个系统的状态随时间和空间演化的最基本的数学工具之一,其在物理.经济.工程.社会等各方面都有及其重要的应用.然而,只有很少的微分方程可以解析求解,尤其对于偏微分方程,能解析求解 ...

  6. 如何用python简单求解一元二次方程方程

    python:求解一元二次方程 工具:spyder3 环境:Windows10.python3.6 目的:对基本数据类型.输入输出进行基础复习 #coding=utf8 import math a=i ...

  7. 大M法的python编程求解和python包求解

    大M法的python编程求解和python包求解 一.大M算法的求解步骤讲解 二.python编程求解 三.利用python包scipy的优化包optimize 四.用excel求解 五.分析结果 一 ...

  8. python迭代法求解非线性方程_荐【数学知识】非线性方程求解的二分法以及牛顿迭代法...

    [数学知识]非线性方程求解的二分法以及牛顿迭代法 本博客不谈及理论推导,只提供代码实现,关于理论推导,大家可以查看其它博客文章. 导入包 import sys import math import s ...

  9. python 方程组 整数解_用Python语言求解线性整数方程组

    我在寻找一种用Python求解线性方程组的方法. 特别是,我在寻找大于所有零的最小整数向量,并解出给定的方程. 例如,我有以下等式: 想解决 .在 在这种情况下,求解该方程的最小整数向量为 .在 但是 ...

最新文章

  1. 企业微信 接收消息服务器,接收消息与事件
  2. torch.nn.BCELoss用法
  3. 数据结构源码笔记(C语言):快速排序
  4. word List39
  5. VS设置程序启动权限为管理员权限
  6. jQuery each、节点操作、动画演示、尺寸操作、扩展方法
  7. 红橙Darren视频笔记 缓存方案 缓存到数据库(数据库操作) 上
  8. echarts年龄饼图_解决echarts饼图显示百分比,和显示内容字体及大小
  9. 二叉树节点为某一值的路径
  10. c++ 开发虚拟摄像头_开发板有了,但我们要怎么玩?
  11. css3中3d旋转中rotatex,rotatey,rotatez的旋转正方向
  12. linux内核装载vfs过程
  13. CentOS6.5下安装Open vSwitch
  14. 会计实务综合模拟计算机实训心得,模拟企业会计实训心得体会
  15. android模拟qq进场动画,Android用ViewPager仿QQ实现多页面滑动及动画效果
  16. 33个CadQuery程序化建模实例
  17. git checkout切换分支报错解决办法
  18. Wireshark----wmem 内存池、内存管理的学习--README.wmem 翻译
  19. Cordova--IOS打包问题汇总
  20. idea IntelliJ IDEA 2018.2.5 x64 破解

热门文章

  1. $ is not a function
  2. Java开发培训班该怎样选择?
  3. 最简单的讲解:梯度下降法
  4. maple linux 远程,Maplesoft Maple Linux版下载
  5. 2种js动态绑定事件方法
  6. mpAndroidchart 坐标和图表距离_小O地图-互联网地图数据挖掘|处理|分析|图表软件...
  7. nodejs与JAVA应对高并发的对比
  8. css如何添加模糊效果,css动态模糊效果
  9. 八皇后 拉斯维加斯算法
  10. 干货来袭:抖音定位的重要性及抖音四步曲丨国仁网络资讯