用Python拟合参数曲线



我有(X,Y)形式的实验数据和(x(t;*params),y(t;*params))形式的理论模型,其中t是物理(但不可观察)变量,*params是我想确定的参数。t为连续变量,模型中xtyt的关系为1:1。

在一个完美的世界里,我知道T的值(参数的真实值),并且能够做一个非常基本的最小二乘拟合来找到*params的值。(请注意,我是而不是试图在我的情节中"连接"xy的值,如31243002或31464345。)我不能保证在我的真实数据中,潜在值T是单调的,因为我的数据是跨多个周期收集的。

我不是很有经验做曲线拟合手动,不得不使用非常粗糙的方法,不容易访问一个基本的scipy函数。我的基本方法包括:

  1. 选择*params的某个值并将其应用于模型
  2. 获取t值数组并将其放入模型中以创建model(*params) = (x(*params),y(*params))数组
  3. X(数据值)插入model得到Y_predicted
  4. YY_predicted之间运行最小二乘(或其他)比较
  5. 重新设置*params
  6. 最终,为*params
  7. 选择最佳值

这种方法有几个明显的问题。

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]

如果我正确理解这个问题,参数是每个样本中相同的常量,但t因样本而异。例如,也许你有一大堆点你认为这些点是从一个圆

中采样的
x = a+r cos(t)   
y = b+r sin(t)

在不同的t值。

在本例中,我要做的是消除变量t以获得xy之间的关系——在本例中是(x-a)^2+(y-b)^2 = r^2。如果您的数据完全符合模型,那么您将在每个数据点处获得(x-a)^2+(y-b)^2 = r^2。如果出现一些错误,您仍然可以找到最小化

(a,b,r)

sum_i ((x_i-a)^2 + (y_i-b)^2 - r^2)^2.

Mathematica的Eliminate命令可以在某些情况下自动消除t。

PS你可能在统计上做得更好。课件,数学。Stackexchange或mathoverflow.net。我知道最后一种有可怕的名声,但我们不咬人,真的!

最新更新