我有一组实验数据,形式为
在一个完美的世界中,我将知道
我没有很多手动进行曲线拟合的经验,并且必须使用极其粗糙的方法,而且很难访问基本的scipy函数。我的基本方法包括:
我认识的人推荐使用某种期望最大化算法,但我对此不够了解,无法从头开始编写一个。我真的希望有一些很棒的scipy(或其他开源)算法可以覆盖我的整个问题,但现在我并不抱有希望。
(X,Y)
,以及一个理论模型,形式为(x(t;*params),y(t;*params))
,其中t
是一个物理(但不可观测)变量,*params
是我想要确定的参数。 t
是连续的变量,在模型中x
和t
之间以及y
和t
之间存在1:1的关系。在一个完美的世界中,我将知道
T
(参数的真实世界值),并能够进行极其基本的最小二乘拟合,以找到*params
的值。(请注意,我不是像31243002或31464345中那样尝试“连接”我的绘图中x
和y
的值。)我无法保证在我的真实数据中,潜在值T
是单调的,因为我的数据是跨多个周期收集的。我没有很多手动进行曲线拟合的经验,并且必须使用极其粗糙的方法,而且很难访问基本的scipy函数。我的基本方法包括:
- 选择一些
*params
的值并将其应用于模型 - 取一个
t
值的数组,并将其放入模型中,以创建一个model(*params) = (x(*params),y(*params))
的数组 - 将
X
(数据值)插值到model
中以获得Y_predicted
- 在
Y
和Y_predicted
之间运行最小二乘(或其他)比较 - 为新的一组
*params
再做一次 - 最终,选择最佳的
*params
值
这种方法存在几个明显的问题。
1)我对编程经验不足,无法开发出很好的“再试一次”的方法,除了“尝试解决方案空间中的所有问题”,或者“在粗略网格中尝试所有内容”,然后“在粗略网格的热点中稍微细化网格并重新尝试所有内容”。我尝试过使用MCMC方法,但我从未找到任何最优值,主要是因为问题2
2)步骤2-4本身非常低效。
我尝试了类似以下的代码(伪代码;实际函数是虚构的)。在A、B上使用广播可能会有许多细微的争议,但这些问题不如需要为每个步骤插值的问题重要。我认识的人推荐使用某种期望最大化算法,但我对此不够了解,无法从头开始编写一个。我真的希望有一些很棒的scipy(或其他开源)算法可以覆盖我的整个问题,但现在我并不抱有希望。
import numpy as np
import scipy as sci
from scipy import interpolate
X_data
Y_data
def x(t,A,B):
return A**t + B**t
def y(t,A,B):
return A*t + B
def interp(A,B):
ts = np.arange(-10,10,0.1)
xs = x(ts,A,B)
ys = y(ts,A,B)
f = interpolate.interp1d(xs,ys)
return f
N = 101
lsqs = np.recarray((N**2),dtype=float)
count = 0
for i in range(0,N):
A = 0.1*i #checks A between 0 and 10
for j in range(0,N):
B = 10 + 0.1*j #checks B between 10 and 20
f = interp(A,B)
y_fit = f(X_data)
squares = np.sum((y_fit - Y_data)**2)
lsqs[count] = (A,b,squares) #puts the values in place for comparison later
count += 1 #allows us to move to the next cell
i = np.argmin(lsqs[:,2])
A_optimal = lsqs[i][0]
B_optimal = lsqs[i][1]
scipy.interpolate.splprep
。 - rth(X,Y)
数据连接有用,而不能用于拟合以找到*params
。 - Necarion