工作中需要用到cvxopt,cvxopt安装有坑,大家注意下.
1.首先一定要卸载numpy,无论是直接安装的,还是anaconda安装的,主要是必须用whl安装numpy才不会有包的冲突
2.二次规划包的使用
二次规划的标准形式如下

Python 代码如下

from cvxopt import matrix
import cvxopt.solvers as sol
result = sol.qp(P, Q, G, h, A, b)

问题描述:
    在实际生活中,我们经常会遇到一些优化问题,简单的线性规划可以作图求解,但是对于目标函数包含二次项时,则需要另觅它法在金融实践中,马科维茨均方差模型就有实际的二次优化需求

作为金融实践中常用的方法,本篇将对CVXOPT中求解二次规划的问题进行举例详细说明,关于该方法在均方差优化中的实践应用,参见后续发帖

1、二次规划问题的标准形式

min12xTPx+qTx
s.t.Gx≤h
Ax=b

上式中,x为所要求解的列向量,xT表示x的转置
接下来,按步骤对上式进行相关说明:
    上式表明,任何二次规划问题都可以转化为上式的结构,事实上用cvxopt的第一步就是将实际的二次规划问题转换为上式的结构,写出对应的P、q、G、h、A、b目标函数若为求max,可以通过乘以−1,将最大化问题转换为最小化问题Gx≤b表示的是所有的不等式约束,同样,若存在诸如x≥0的限制条件,也可以通过乘以−1转换为"≤"的形式Ax=b表示所有的等式约束

2、以一个标准的例子进行过程说明

min(x,y)12x2+3x+4y
s.t.x,y≥0
x+3y≥15
2x+5y≤100
3x+4y≤80

例子中,需要求解的是x,y,我们可以把它写成向量的形式,同时,也需要将限制条件按照上述标准形式进行调整,用矩阵形式表示,如下所示:

min(x,y)12[x\y]T[10\00][x\y]+[3\4]T[x\y]
[−10 0−1\-1−3 25 34][x\y]≤[0\0\-15\100\80]

如上所示,目标函数和限制条件均转化成了二次规划的标准形式,这是第一步,也是最难的一步,接下来的事情就简单了对比上式和标准形式,不难得出:P=[10\00],q=[3\4],G=[−10 0−1\-1−3 25 34],h=[0\0\-15\100\80]
接下来就是几行简单的代码,目的是告诉计算机上面的参数具体是什么

from cvxopt import solvers, matrix
P = matrix([[1.0,0.0],[0.0,0.0]]) # matrix里区分int和double,所以数字后面都需要加小数点
q = matrix([3.0,4.0])
G = matrix([[-1.0,0.0,-1.0,2.0,3.0],[0.0,-1.0,-3.0,5.0,4.0]])
h = matrix([0.0,0.0,-15.0,100.0,80.0])
sol = solvers.qp(P,q,G,h) # 调用优化函数solvers.qp求解
print sol['x'] # 打印结果,sol里面还有很多其他属性,读者可以自行了解

pcost dcost gap pres dres

0: 1.0780e+02 -7.6366e+02 9e+02 1e-16 4e+01
1: 9.3245e+01 9.7637e+00 8e+01 1e-16 3e+00
2: 6.7311e+01 3.2553e+01 3e+01 6e-17 1e+00
3: 2.6071e+01 1.5068e+01 1e+01 2e-16 7e-01
4: 3.7092e+01 2.3152e+01 1e+01 2e-16 4e-01
5: 2.5352e+01 1.8652e+01 7e+00 8e-17 3e-16
6: 2.0062e+01 1.9974e+01 9e-02 6e-17 3e-16
7: 2.0001e+01 2.0000e+01 9e-04 6e-17 3e-16
8: 2.0000e+01 2.0000e+01 9e-06 9e-17 2e-16
Optimal solution found.
[ 7.13e-07]
[ 5.00e+00]

看了上面的代码,是不是觉得很简单。因为难点不在代码,而是在于将实际优化问题转化为标准形式的过程在上面的例子中,并没有出现等号,当出现等式约束时,过程一样,找到A,b,然后运行代码 sol = solvers.qp(P,q,G,h,A,b) 即可求解
扩展:上述定义各个矩阵参数用的是最直接的方式,其实也可以结合Numpy来定义上述矩阵

from cvxopt import solvers, matrix
import numpy as np
P = matrix(np.diag([1.0,0])) # 对于一些特殊矩阵,用numpy创建会方便很多(在本例中可能感受不大)
q = matrix(np.array([3.0,4]))
G = matrix(np.array([[-1.0,0],[0,-1],[-1,-3],[2,5],[3,4]]))
h = matrix(np.array([0.0,0,-15,100,80]))
sol = solvers.qp(P,q,G,h)

pcost dcost gap pres dres

0: 1.0780e+02 -7.6366e+02 9e+02 1e-16 4e+01
1: 9.3245e+01 9.7637e+00 8e+01 1e-16 3e+00
2: 6.7311e+01 3.2553e+01 3e+01 6e-17 1e+00
3: 2.6071e+01 1.5068e+01 1e+01 2e-16 7e-01
4: 3.7092e+01 2.3152e+01 1e+01 2e-16 4e-01
5: 2.5352e+01 1.8652e+01 7e+00 8e-17 3e-16
6: 2.0062e+01 1.9974e+01 9e-02 6e-17 3e-16
7: 2.0001e+01 2.0000e+01 9e-04 6e-17 3e-16
8: 2.0000e+01 2.0000e+01 9e-06 9e-17 2e-16
Optimal solution found.

先写到这吧,关于二次规划在均方差优化中的实践应用,参见后续发帖,欢迎交流~~出处
发布于 2018-05-11

在Python中利用CVXOPT求解二次规划问题的更多相关文章

  1. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  2. python中利用matplotlib绘图可视化知识归纳

    python中利用matplotlib绘图可视化知识归纳: (1)matplotlib图标正常显示中文 import matplotlib.pyplot as plt plt.rcParams['fo ...

  3. Python中利用原始套接字进行网络编程的示例

    Python中利用原始套接字进行网络编程的示例 在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构 ...

  4. python中利用队列asyncio.Queue进行通讯详解

    python中利用队列asyncio.Queue进行通讯详解 本文主要给大家介绍了关于python用队列asyncio.Queue通讯的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细 ...

  5. (数据科学学习手札145)在Python中利用yarl轻松操作url

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在诸如网络爬虫.web应用开发 ...

  6. Python中利用LSTM模型进行时间序列预测分析

    时间序列模型 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征.这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺 ...

  7. python中利用正则表达式匹配ip地址

    现在有一道题目,要求利用python中re模块来匹配ip地址,我们应如何着手? 首先能想到的是ip地址是数字,正则表达式是如何匹配数字的呢? \d或[0-9] 对于这个问题,不要一下子上来就写匹配模式 ...

  8. 「Python实用秘技11」在Python中利用ItsDangerous快捷实现数据加密

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第11 ...

  9. python中利用redis构建任务队列(queue)

    Python中的使用标准queue模块就可以建立多进程使用的队列,但是使用redis和redis-queue(rq)模块使这一操作更加简单. Part 1. 比如首先我们使用队列来简单的储存数据:我们 ...

随机推荐

  1. C++学习之普通函数指针与成员函数指针

    函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...

  2. 【RefactoringCode】The description of the refactoring book

    Last night the book named [Data Structure with Java Hubbed] was closed. When talked about the advant ...

  3. 【剑指offer】合并两有序单链表

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25739727 九度OJ上AC,採用归并的思想递归实现. 题目描写叙述: 输入两个单调递增的 ...

  4. 双logo

    from aip import AipSpeech bd_k_l = ['11059852', '5Kk01GtG2fjCwpzEkwdn0mjw', 'bp6Wyx377Elq7RsCQZzTBgG ...

  5. 第十四章 netlink机制--基于Linux3.10【转】

    本文转载自:http://blog.csdn.net/shichaog/article/details/44682613 Netlink基于网络的消息机制,能够让用户和内核空间进行通信,12.3节提到 ...

  6. 华为FusionSphere概述——计算资源、存储资源、网络资源的虚拟化,同时对这些虚拟资源进行集中调度和管理

    华为FusionSphere概述 FusionSphere是华为自主知识产权的云操作系统,集虚拟化平台和云管理特性于一身,让云计算平台建设和使用更加简捷,专门满足企业和运营商客户云计算的需求.华为云操 ...

  7. 58. Extjs grid CheckboxSelectionModel 单选

    转自:https://kabuka.iteye.com/blog/581823 默认的 new Ext.grid.CheckboxSelectionModel 都是可以多选的,但是有时候需要控制单选时 ...

  8. PCB MS SQL 标量函数(CLR) 实现DataTable转Json方法

    一.准备需转为json字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的JSON字符串的效果 [{"TechName":"开料",& ...

  9. [Swift通天遁地]三、手势与图表-(8)制作股市中常用的蜡烛图表

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. asp.net MVC ajax 请求参数前台加密后台解密

    最近有一个需求要求页面查询数据库,查询内容保存到excel里面作为附件加密打包下载.查询的sql作为参数传入后台,实现加密提交.这里做个记录,后面用到直接来拿. 控制器 public ActionRe ...