Python基于scipy.minimize的参数优化仅首列非零问题求解
问题排查与修复方案
以下是具体错误点和修复逻辑:
- 最核心错误:
function_Price函数的return语句缩进错误,你把return放在了for循环内部,第一轮循环j=0执行完就直接返回结果,剩下j≥1的参数完全没有参与计算,自然只有第一个参数有值,其余全部为0,和你遇到的现象完全吻合。需要把return放到for循环外,等所有维度计算完成后再返回。 - 变量名不匹配:
function_Price形参传入的价格数组命名为y,但函数内部引用的时候用了未定义的P,需要统一变量名。 - 优化调用参数错误:
minimize的args参数里使用了未定义的变量Y,你循环中定义的待拟合序列是k,需要替换成对应变量。 - 补充:你当前用的SLSQP是带约束的优化算法,如果你没有额外约束的话,可以用和Matlab的fminsearch逻辑更接近的Nelder-Mead算法,适配性更好。
修复后代码
主函数
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[:] temp = 0 for j in range(N): price_j = a[j] * C[j] * y[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]]) # Correlation (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 # 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] # 待拟合序列 C = Corr[i, :] para = np.zeros(N) # 每次拟合重置初始值 # 替换错误的Y为k,可根据需求选择算法,SLSQP或者Nelder-Mead parag = minimize(GError_function_Price, para, args=(y, k, t, T, tau, N, C), method='SLSQP', bounds=B) A[i,:] = parag.x # 输出结果 print(A)
内容的提问来源于stack exchange,提问作者MMKshawn
相关产品推荐
相关产品推荐

