首页 > 解决方案 > Python中for循环方程中的优化参数

问题描述

我需要将具有两个参数的模型拟合到数据中。但是,模型是以递归方式计算的(当前计算是根据之前的计算计算的),并且应该 >= 0。

我使用了几个大约 180 列和 365 行的熊猫框架,但为了正确构建它,我在这里只给出简单的例子。

代码是这样的:

A = {'col1': [1, 2, 3, 4], 'col2': [3, 4, 5, 6]} #model variables

B = {'col1': [0, 50, 156, 318], 'col2': [0, 182, 427, 735]} #data for model fitting

a = {'col1': [1], 'col2': [3]} #parameter to be optimized
b = {'col1': [4], 'col2': [5]} #parameter to be optimized

X.loc[0] = 0

for index in range(1,364):
    X.loc[index]=np.where(
        X.loc[index-1]-(a-(b*7*(1-A.loc[index])))<0,0,
        X.loc[index-1]-(a-(b*7*(1-A.loc[index])))

中的列应通过更改参数和X来适应列。我试过了,但它不起作用。Babscipy.curve_fit

def Y(A,a,b):
    return #this is where it gets tricky#
    for index in range(1,364):
    X.loc[index]=np.where(
        X.loc[index-1]-(a-(b*7*(1-A.loc[index])))<0,0,
        X.loc[index-1]-(a-(b*7*(1-A.loc[index])))

popt, pcov = curve_fit(X, A, B,p0=([1, 3],[4, 5])) 

有谁知道如何解决这个等式?或者建议优化这个方程的最佳方法?

谢谢你。

标签: pythonrecursionoptimization

解决方案


看看这个,把它看作是一个具有单个自变量的模板,但它考虑了以前的目标值。我们的目标函数是goal(). 我们将所有目标值保存在一个列表中,以便我们可以使用任何给定点的先前值。

import random

from scipy.optimize import curve_fit


best = None
N = 6  # available data sample

def goal(x, a, b):
    global best

    # In the beginning we don't have previous best value so we set it to zero or so.
    if best is None:
        prev_best = list(0 for _ in range(N))
        best = []
        print(f'init_best: {prev_best}')
    else:
        prev_best = best[len(best) - 1]
        print(f'prev_best: {prev_best}')

    y = prev_best - (a - (b * 7 * (1 - x)))
    print(f'curr best: {y}')
    
    # Modify elements of y, replace negative value with zero.
    y[y < 0] = 0
    print(f'modified best: {y}')

    # Backup our best because we will use it in the next call.
    best.append(y.tolist())
    print(f'saved best: {best}')

    return y


def optim():
    x = [random.randint(-10, 10) for i in range(N)]  # independent
    y = [random.randint(-1, 100) for i in range(N)]  # dependent

    popt, _ = curve_fit(goal, x, y)
   
    a, b = popt
    print(f'a: {a:0.2f}, b: {b:0.2f}')


# Start
optim()

输出

从一开始我们还没有以前的值,所以我把它设置为零。然后我们计算目标值,curr best: [-29. 55. 55. -50. 6. 6.]如果值低于零,我们将值设置为零modified best: [ 0. 55. 55. 0. 6. 6.],最后我们将值保存在中,saved best: [[0.0, 55.0, 55.0, 0.0, 6.0, 6.0]]因为我们下次将使用它。

init_best: [0, 0, 0, 0, 0, 0]
curr best: [-29.  55.  55. -50.   6.   6.]
modified best: [ 0. 55. 55.  0.  6.  6.]
saved best: [[0.0, 55.0, 55.0, 0.0, 6.0, 6.0]]
prev_best: [0.0, 55.0, 55.0, 0.0, 6.0, 6.0]
curr best: [-29. 110. 110. -50.  12.  12.]
modified best: [  0. 110. 110.   0.  12.  12.]
saved best: [[0.0, 55.0, 55.0, 0.0, 6.0, 6.0], [0.0, 110.0, 110.0, 0.0, 12.0, 12.0]]

...
a: 1.00, b: 1.00

推荐阅读