python - 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
来适应列。我试过了,但它不起作用。B
a
b
scipy.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]))
有谁知道如何解决这个等式?或者建议优化这个方程的最佳方法?
谢谢你。
解决方案
看看这个,把它看作是一个具有单个自变量的模板,但它考虑了以前的目标值。我们的目标函数是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
推荐阅读
- java - 使用 lambda 而不是显式匿名内部类时的不同泛型行为
- php - 在codeigniter中搜索后如何保留选定的框选项
- asp.net - 来自控制器的 asp.net mvc 加载查询
- php - 使用 php 文件中的插件创建页面模板,无需打开 php 文件,模板句柄来自 wp-admin 端
- java - 一个菜鸟求指导,ps用java写的
- ios - swift 4中的自定义日期选择器标签
- javascript - n+Math.random() 是否总是小于 n+1?
- graphics - 在 P5.js 中快速绘制单个像素
- swift - Bundle.main.url 在展开可选值时意外发现 nil
- angular - DropDownlist 在Angular 6中单击提交按钮时选择的文本