在Python

时间:2015-08-21 06:27:51

标签: python model-fitting parametric-equations

我有(X,Y)形式的实验数据和(x(t;*params),y(t;*params))形式的理论模型,其中t是一个物理(但不可观察)变量,而*params是我想确定的参数。 t是一个连续变量,模型中xt之间以及yt之间存在1:1的关系。

在一个完美的世界中,我会知道T(参数的真实世界值)的值,并且能够进行极其基本的最小二乘拟合来找到{{1的值}}。 (请注意,我试图在我的情节中“连接”*paramsx的值,例如3124300231464345。 )我无法保证在我的真实数据中,潜在值y是单调的,因为我的数据是在多个周期内收集的。

我不是很熟练地手动进行曲线拟合,并且必须使用非常粗糙的方法而不能轻松访问基本的scipy函数。我的基本方法包括:

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

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

    1)我没有足够的经验来编写一个非常好的“再做一次”,而不是“尝试解决方案领域的所有内容”,也许“尝试粗网格中的所有内容”,然后“再次尝试所有内容”在粗网格的热点中,网格略微更细。“我尝试过做MCMC方法,但我从来没有找到任何最佳值,主要是因为问题2

    2)步骤2-4本身就是超级低效的。

    我尝试了类似的东西(类似于伪代码;实际功能已经完成)。关于在A,B上使用广播,可以做出许多微小的狡辩,但是那些不像每个步骤需要插值的问题那么重要。

    我认识的人建议使用某种Expectation Maximization算法,但我不知道如何从头开始编写代码。我真的希望有一些令人敬畏的scipy(或其他开源)算法,我无法找到它涵盖了我的整个问题,但此时我并不抱希望。

    *params

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,那么参数是每个样本中相同的常数,但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你可以在stats.stackexchange,math.stackexchange或mathoverflow.net上做得更好。我知道最后一个有一个可怕的声誉,但我们不咬,真的!