Python中解决线性规划和二次型规划问题的CVXOPT模块

Python CVXOPT模块

Python中支持Convex Optimization(凸规划)的模块为CVXOPT,能够解决线性规划和二次型规划问题,其应用场景如SVM中的Hard Margin SVM。

Creating matrices

CVXOPT has separate dense and sparse matrix objects.

A dense matrix is created using the matrix() function; it can be created from a list (or iterator):

>>>from cvxopt import matrix
>>>A = matrix([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], (2,3))
>>>print(A)
[ 1.00e+00  3.00e+00  5.00e+00]
[ 2.00e+00  4.00e+00  6.00e+00]
>>>A.size
(2, 3)

or from a list of lists, where each inner list represents a column of the matrix:

>>>B = matrix([ [1.0, 2.0], [3.0, 4.0] ])
>>>print(B)
[ 1.00e+00  3.00e+00]
[ 2.00e+00  4.00e+00]

More generally, the inner lists can represent block-columns.

>>>print(matrix([ [A] ,[B] ]))
[ 1.00e+00  3.00e+00  5.00e+00  1.00e+00  3.00e+00]
[ 2.00e+00  4.00e+00  6.00e+00  2.00e+00  4.00e+00]

The spmatrix() function creates a sparse matrix from a (value, row, column) triplet description.

>>>from cvxopt import sparse
>>>E = sparse([ [B, B], [D] ])
>>>print(E)
[ 1.00e+00  3.00e+00  1.00e+00     0    ]
[ 2.00e+00  4.00e+00     0      2.00e+00]
[ 1.00e+00  3.00e+00     0         0    ]
[ 2.00e+00  4.00e+00     0         0    ]

Sparse block-diagonal matrices can be constructed using the spdiag() function.

>>>from cvxopt import spdiag
>>>print(spdiag([B, -B, 1, 2]))
[ 1.00e+00  3.00e+00     0         0         0         0    ]
[ 2.00e+00  4.00e+00     0         0         0         0    ]
[    0         0     -1.00e+00 -3.00e+00     0         0    ]
[    0         0     -2.00e+00 -4.00e+00     0         0    ]
[    0         0         0         0      1.00e+00     0    ]
[    0         0         0         0         0      2.00e+00]

Solving a linear program

Linear programs can be specified via the solvers.lp() function. As an example, we can solve the problem

>>>from cvxopt import matrix, solvers
>>>A = matrix([ [-1.0, -1.0, 0.0, 1.0], [1.0, -1.0, -1.0, -2.0] ])
>>>b = matrix([ 1.0, -2.0, 0.0, 4.0 ])
>>>c = matrix([ 2.0, 1.0 ])
>>>sol=solvers.lp(c,A,b)
     pcost       dcost       gap    pres   dres   k/t
 0:  2.6471e+00 -7.0588e-01  2e+01  8e-01  2e+00  1e+00
 1:  3.0726e+00  2.8437e+00  1e+00  1e-01  2e-01  3e-01
 2:  2.4891e+00  2.4808e+00  1e-01  1e-02  2e-02  5e-02
 3:  2.4999e+00  2.4998e+00  1e-03  1e-04  2e-04  5e-04
 4:  2.5000e+00  2.5000e+00  1e-05  1e-06  2e-06  5e-06
 5:  2.5000e+00  2.5000e+00  1e-07  1e-08  2e-08  5e-08
>>>print(sol['x'])
[ 5.00e-01]
[ 1.50e+00]

Solving a quadratic program

二次型规划问题

>>>from cvxopt import matrix, solvers
>>>Q = 2*matrix([ [2, .5], [.5, 1] ])
>>>p = matrix([1.0, 1.0])
>>>G = matrix([[-1.0,0.0],[0.0,-1.0]])
>>>h = matrix([0.0,0.0])
>>>A = matrix([1.0, 1.0], (1,2))
>>>b = matrix(1.0)
>>>sol=solvers.qp(Q, p, G, h, A, b)
     pcost       dcost       gap    pres   dres
 0:  0.0000e+00  0.0000e+00  3e+00  1e+00  0e+00
 1:  9.9743e-01  1.4372e+00  5e-01  4e-01  3e-16
 2:  1.8062e+00  1.8319e+00  5e-02  4e-02  5e-16
 3:  1.8704e+00  1.8693e+00  6e-03  2e-03  1e-15
 4:  1.8749e+00  1.8748e+00  2e-04  6e-05  6e-16
 5:  1.8750e+00  1.8750e+00  2e-06  6e-07  7e-16
 6:  1.8750e+00  1.8750e+00  2e-08  6e-09  1e-15
>>>print(sol['x'])
[ 2.50e-01]
[ 7.50e-01]
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值