如何使用给定的生成数据最好地编码 scipy、cvxpy 或 Convex.jl 的问题

计算科学 优化 约束优化 凸优化 约束
2021-12-22 01:59:49

我有以下形式的曲线拟合问题:

y=f(x,a,b,c,d)+ε
f(x,a,b,c,d)=bexa+c+d
有约束
argmina,b,c,di=1n(f(x)iyi)2s.t.cbd1=0a=1

在哪里

  • x,yRnx,y是实验给出的数据
  • aR
  • bR
  • cR
  • dR 注意:因为这个参数是由经验中的测量来测量的,因此是固定的。a=1

模拟数据和以下代码如下:

import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
n = 20
np.random.seed(1)
def sigm01(x,a,b,c,d):
  return b/(np.exp(x*a)+c)+d

start = -10
end = -start
x = np.arange(start,end,0.01)
a = 1
b = -2
c = 1
d = 1
y = sigm01(x,a,b,c,d) + np.random.randn(len(x))/10
#plt.plot(x,y)
#plt.show()

我想使用优化包(例如scipycvxpyConvex.jl)。

我该如何设置问题?

1个回答

的约束,您的看起来像这样:a=1c=bd1f

y^=f(x,b,d)=bddexp(x)bd+d

基本上是在尝试解决非线性最小二乘问题:

b,d=argmini=1N(f(xi)yi)2

这是一份工作scipy.optimize.curve_fit

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

def func(x,b,d):
    return ((b*d)/(d*np.exp(x)-b-d))+d

xdata = np.linspace(-10, 10, 10000)
y = func(xdata, -2, 1)
np.random.seed(1729)
y_noise = 0.2 * np.random.normal(size=xdata.size)
ydata = y + y_noise

popt, pcov = curve_fit(func, xdata, ydata, bounds=([-3, 0], [-1, 2.]))

plt.plot(xdata, ydata, 'b-', label='data')
plt.plot(xdata, func(xdata, *popt), 'r-',
         label='fit: b=%5.3f, d=%5.3f' % tuple(popt))
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='best')
plt.savefig('curve_fit.png')
plt.show()

最终拟合如下所示:

在此处输入图像描述