【问题标题】:Parameter Optimization Using Minimize in Python在 Python 中使用 Minimize 进行参数优化
【发布时间】:2021-11-19 00:58:51
【问题描述】:

我编写了以下两个函数来校准模型:

主要功能是:

def function_Price(para,y,t,T,tau,N,C):  
# y= price array
# C = Auto and cross correlation array
# a= paramters need to be calibrated
    a=para[0:]
    temp=0
    for j in range(N):
        price_j = a[j]*C[j]*P[t:T-tau,j]
        temp=temp+price_j
        Price=temp
        return Price 

目标函数是:

def GError_function_Price(para,y,k,t,T,tau,N,C):
# k is the price need to be fitted
   return sum((function_Price(para,y,t,T,tau,N,C)-k[t+tau:T]) ** 2)

现在,我调用这两个函数来做模型的优化:

import numpy as np
from scipy.optimize import minimize
 
# Prices (example)
y = np.array([[1,2,3,4,5,4], [4,5,6,7,8,9], [6,7,8,7,8,6], [13,14,15,11,12,19]])

# Correaltion (example)
Corr= np.array([[1,2,3,4,5,4], [4,5,6,7,8,9], [6,7,8,7,8,6], [13,14,15,11,12,19],[1,2,3,4,5,4],[6,7,8,7,8,6]])

# Define 
tau=1
Size = y.shape
N = Size[1]
T = Size[0]
t=0

# initial Values
para=np.zeros(N) 

# Bounds
B = np.zeros(shape=(N,2)) 
for n in range(N):
    B[n][0]= float('-inf')
    B[n][1]= float('inf')

# Calibration 
A = np.zeros(shape=(N,N))  
for i in range (N):
    k=y[:,i] #fitted one
    C=Corr[i,:]
    parag=minimize(GError_function_Price,para,args=(y,Y,t,T,tau,N,C),method='SLSQP',bounds=B)
    A[i,:]=parag.x

一旦我运行模型,它应该会生成一个 N 乘 N 的优化参数值数组。但是,除了第一列,其余部分保持零。出了点问题。

你能帮我解决这个问题吗?

我知道如何在 Matlab 中做到这一点。

以下是 Matlab 代码: 主要功能

function Price=function_Price(para,P,t,T,tau,N,C)  
        a=para(:,:);
        temp=0;
       for j=1:N
        price_j = a(j).*C(j).*P(t:T-tau,j);
        temp=temp+price_j;
       end
      Price=temp;
end

目标函数:

function gerr=GError_function_Price(para,P,Y,t,T,tau,N,C)
gerr=sum((function_Price(para,P,t,T,tau,N,C)-Y(t+tau:T)).^2);
end

现在,我按以下方式调用这两个函数:

P = [1,2,3,4,5,4;4,5,6,7,8,9;6,7,8,7,8,6;13,14,15,11,12,19];
AutoAndCrossCorr= [1,2,3,4,5,4;4,5,6,7,8,9;6,7,8,7,8,6;13,14,15,11,12,19;1,2,3,4,5,4;6,7,8,7,8,6];

tau=1;
Size = size(P);
N =6;
T =4;
t=1;   

for i=1:N
Y=P(:,i); % fitted one
C=AutoAndCrossCorr(i,:);
para=zeros(1,N);
lb= repmat(-inf,N,1);
ub= repmat(inf ,N,1);
parag=fminsearchbnd(@(para)abs(GError_function_Price(para,P,Y,t,T,tau,N,C)),para,lb,ub);
a(i,:)=parag;
end

【问题讨论】:

    标签: python matlab optimization scipy minimize


    【解决方案1】:

    问题似乎在于您将函数调用的结果传递给minimize,而不是函数本身。参数由 args 参数传递。所以而不是:

    minimize(GError_function_Price(para,y,k,t,T,tau,N,C),para,method='SLSQP',bounds=B)
    

    以下应该可以工作

    minimize(GError_function_Price,para,args=(y,k,t,T,tau,N,C),method='SLSQP',bounds=B)
    

    【讨论】:

    • 嗨@eeegnu,谢谢你的建议。按照您所说的更正参数后,现在出现以下错误:ValueError: Objective function must return a scalar
    • @MMKarim 我注意到您没有在发布的目标函数中添加 return 语句。您是否返回 gerr(如果没有返回 None)?
    • 嗨@eeegnu,再次感谢您。我已按照您的建议编辑了代码。您可以在我的问题的编辑版本中看到代码。它现在运行。但是,它应该给我一个包含优化值的 (N x N) 数组的优化参数。但是,除了第一列之外,其他列都为零。出了点问题。
    • @MMKarim,您可能应该在提交的内容中保留错误,以免将来的读者对您的问题感到困惑!很难说出是什么导致了您的问题,但一种猜测是您在每一步都传递了相同的 x0(para),这看起来像是一个问题。
    • 嗨@eeegnu。我发现了这个问题。问题是缩进。主函数最后一行return Price位置应该和for-loop一样。现在,我将它放在Price=temp 的下方,因为它重复相同的结果而不是遵循 for 循环。 Matlab没有这个问题,我不知道缩进问题。
    猜你喜欢
    • 2018-07-31
    • 2018-09-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2022-01-07
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多