目录
简介
全局最优化
局部优化
有约束优化问题
代码实现
简介
凸优化,或叫做凸最优化,凸最小化,是数学最优化的一个子领域,研究定义于凸集中的凸函数最小化的问题。
在金融学和经济学中,凸优化起着重要作用,这方面的例子包括市场数据校准和期权定价模型,或者效用函数的优化。
我们对下列函数fm进行这种优化
- #coding:UTF-8
- import numpy as np
- from mpl_toolkits.mplot3d import Axes3D
- import matplotlib.pyplot as plt
- import matplotlib as mpl
- import scipy.optimize as spo
-
- def fm(*args):
- return (np.sin(args[0])+0.05*args[0]**2+np.sin(args[1])+0.05*args[1]**2)
-
- x = np.linspace(-10,10,50)
- y = np.linspace(-10,10,50)
- x,y = np.meshgrid(x,y)
- z = fm(x,y)
-
- fig = plt.figure(figsize=(9,6))
- ax = fig.gca(projection='3d')
- surf = ax.plot_surface(x,y,z,rstride=2,cstride=2,cmap=mpl.cm.coolwarm,linewidth=0.5,antialiased=True)
- ax.set_xlabel('x')
- ax.set_ylabel('y')
- ax.set_zlabel('f(x,y)')
- fig.colorbar(surf,shrink=0.5,aspect=5)
- plt.show()
全局最优化
- def fo(*args):
- x = args[0][0]
- y = args[0][1]
- z = np.sin(x) + 0.05*x**2 + np.sin(y) + 0.05*y**2
- #print(x,y,z)
- return z
- opt = spo.brute(fo,((-10,10,0.1),(-10,10,0.1)),finish=None)
- print(opt)
- print(fm(opt[0],opt[1]))
-
- [-1.4 -1.4]
- -1.7748994599769203
-
- Process finished with exit code 0
最优化参数现在是x=y=-1.4,全局最小化的最小函数大约-1.7749
局部优化
- opt2 = spo.fmin(fo,(2.0,2.0),maxiter=250)
- print(opt2)
- print(fm(opt2[0],opt2[1]))
- Optimization terminated successfully.
- Current function value: 0.015826
- Iterations: 46
- Function evaluations: 86
- [4.2710728 4.27106945]
- 0.0158257532746805
-
- Process finished with exit code 0
有约束优化问题
现实中的问题往往是有约束条件的,在条件允许内,制定最优的解决方案,从而获得最好的结果。
例如如下情景:你可以选择投资两种证券,如何分配才能取得最大化收益呢?
已知假设如下,两种证券现价格为 =
= 10,收益受到u,d两种状态影响,一年后,u状态下的收益分别为15和5,而d下则为5和12,假设两种状态出现的概率相同,用
=
= 0.5表示,而他们的收益则用
,
表示
你的预算为 = 100,
未知假设:未来财富率的效用函数如下如下 =
,a,b是投资者购买的证券数量,则如下公式成立
总收益公式
总投资收到预算的约束
每种证券的投资数量收到非负数约束
现在我们将数值带入,反向求解
函数1
条件1
条件2
代码实现
- import scipy.optimize as spo
- from math import sqrt
- def Eu(*args): #函数一
- a = args[0][0]
- b = args[0][1]
- return -(0.5*sqrt(a*15+b*5)+0.5*sqrt(a*5+b*12))
-
- cons = ({'type':'ineq','fun':lambda a: 100-a[0]*10-a[1]*10 }) #条件一
- bnds = ((0,1000),(0,1000)) #条件二
- result = spo.minimize(Eu,[5,5],method='SLSQP',bounds=bnds,constraints=cons)
- print(result)
- fun: -9.700883611487832
- jac: array([-0.48508096, -0.48489535])
- message: 'Optimization terminated successfully.'
- nfev: 21
- nit: 5
- njev: 5
- status: 0
- success: True
- x: array([8.02547122, 1.97452878])
-
- Process finished with exit code 0
结果如上,你要购买8个a证券和2个b证券。