纸浆线性优化,目标函数为矩阵乘法

时间:2018-01-31 05:08:47

标签: python linear-programming pulp

我有一个目标函数,使用var-covariance矩阵和加权向量找到标准差。

In [388]: equal_weights
Out[388]: 
array([ 3.57142857,  3.57142857,  3.57142857,  3.57142857,  3.57142857,
    3.57142857,  3.57142857,  3.57142857,  3.57142857,  3.57142857,
    3.57142857,  3.57142857,  3.57142857,  3.57142857,  3.57142857,
    3.57142857,  3.57142857,  3.57142857,  3.57142857,  3.57142857,
    3.57142857,  3.57142857,  3.57142857,  3.57142857,  3.57142857,
    3.57142857,  3.57142857,  3.57142857])

我有形状为28,28的var-cov矩阵

var_cov_matrix
Out[389]: 
array([[  6.71849405e-04,   1.07026673e-04,   6.79182814e-04,
      5.92496081e-04,   6.76905450e-04,   5.68079259e-04,
      2.22977933e-04,   6.27305383e-04,   1.93215258e-04,
      7.58978339e-04,   6.04280523e-04,   6.76028095e-04,
      5.56815379e-04,   7.24121343e-04,   1.29104023e-04,
      5.65809917e-04,   2.21988437e-04,   7.96973235e-05,
      6.22684153e-04,   7.24716154e-04,   7.34006960e-04,
      8.06120887e-04,   7.00056878e-04,   6.61041132e-04,
      1.43439814e-04,   2.27692364e-04,   4.44174103e-04,
      4.52772521e-04],
   [  1.07026673e-04,......]]

我必须通过运行纸浆优化器找到优化的重量。目标函数是,

math.sqrt((eq_wt_vector.transpose() @ var_cov_matrix) @ eq_wt_vector)

目标是通过约束

最小化上述函数生成的值
sum(equal_weights) - 1 == 0

我经历了很多例子,解决方案可用于线性方程。非常感谢这个特定问题的解决方案。感谢。

1 个答案:

答案 0 :(得分:0)

感谢@Rodrigo de Azevedo提示。 是的,我能够使用cvxpy包解决问题。使用cvxpy库有各种条件,如下所示,

  1. 最小化或最大化的目标函数应遵循纪律凸规划(DCP)look here
  2. 如果问题是最大化或最小化问题,应该小心。我有一个sqrt()方法来查找标准差,这不是DCP,也是我的问题最大化。
  3. 解决方案如下,

    Obj功能:

    (eq_wt_vector.transpose() @ var_cov_matrix) @ eq_wt_vector
    

    在DCP中表示为

    Minimize(quad_form(a, b))
    

    其中quad(a,b)= a.T * b * a

    解决方案:

    from cvxpy import Variable,Problem,Minimize,sum_entries,quad_form
    a = Variable(var_cov_matrix.shape[0]) #vector of column length = matrix length
    b = np.matrix(var_cov_matrix)
    objective = Minimize(quad_form(a, b))
    constraints = [sum_entries(a) == 100,  0<=a, a<=100] #constraints for vector - sum of elements = 100, lies between 0,100
    prob = Problem(objective, constraints)
    
    optimized_deviation = prob.solve()