簡體   English   中英

紙漿線性優化,目標函數為矩陣乘法

[英]Pulp Linear optimization with objective function as Matrix multiplication

我有一個目標函數,可使用var-協方差矩陣和加權矢量找到標准差。

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

我經歷了很多例子,線性方程組都有解決方案。 對於這個特定問題的解決方案將是極大的贊賞。 謝謝。

感謝@Rodrigo de Azevedo的提示。 是的,我可以使用cvxpy包解決問題。 使用cvxpy庫的條件多種多樣,如下所示:

  1. 目標函數最小化或最大化應遵循有紀律的凸規划(DCP) 看這里
  2. 如果問題是最大化或最小化,則應當心。 我有一個sqrt()方法來查找標准偏差,它不是DCP,而且使我的問題成為最大化問題。

解決方法如下,

對象功能:

(eq_wt_vector.transpose() @ var_cov_matrix) @ eq_wt_vector

在DCP中表示為

Minimize(quad_form(a, b))

其中quad(a,b)= aT * 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM