python - 在Python中拟合参数曲线

我有(X,Y)形式的实验数据和(x(t;*params),y(t;*params))形式的理论模型,其中t是一个物理(但不可观测)变量,*params是我要确定的参数。t是一个连续变量,模型中xt之间以及yt之间存在1:1的关系。
在一个完美的世界里,我会知道T的值(参数的真实值),并且能够做一个非常基本的最小二乘拟合来找到*params的值。(请注意,我并没有试图“连接”图中xy的值,就像在3124300231464345中一样)我不能保证在我的实际数据中,潜在值T是单调的,因为我的数据是跨多个周期收集的。
我不是很有经验做曲线拟合手动,必须使用非常粗糙的方法,而不容易获得一个基本的scipy函数。我的基本方法包括:
选择*params的某个值并将其应用于模型
获取一个t值数组并将其放入模型中,以创建一个model(*params) = (x(*params),y(*params))值数组
X(数据值)插值到model以获得Y_predicted
YY_predicted之间进行最小二乘(或其他)比较
对于一组新的*params
最后,为*params选择最佳值
这种方法有几个明显的问题。
1)我没有足够的编程经验来开发一个非常好的“再次尝试”,而不是“在解决方案空间中尝试所有东西”,可能是“在粗糙网格中尝试所有东西”,然后“在粗糙网格的热点中在稍微精细的网格中再次尝试所有东西”。我尝试了MCMC方法,但我没有找到任何最佳值,主要是因为问题2
2)步骤2-4本身效率非常低。
我试过类似的方法(类似于伪代码;实际的函数是虚构的)。关于在A,B上使用广播,可能会有很多小争论,但这些争论的重要性不如每一步都需要插值的问题。
我认识的人推荐使用某种Expectation Maximization算法,但我对这种算法的了解还不足以从头开始编写代码。我真的希望有一些很棒的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您可能在stats.stackexchange、math.stackexchange或mathoverflow.net上做得更好。我知道最后一个有可怕的名声,但我们不咬,真的!

本文翻译自 https://stackoverflow.com/questions/32133733/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 python model-fitting parametric-equations


相关文章:

python - 使用Django Rest Framework API删除相关模型

python - 如何在例如上部署训练有素的张量流网络树莓派

python - Raspberry PI-访问0x40时出错:检查您的I2C地址

python - Scrapy提取ld + JSON

python - Numpy Polyfit或对X和Y多维数组的任何拟合

python - Matplotlib参数曲面图出乎意料的结果,为什么?

javascript - 沿阿基米德螺旋线等距放置点

machine-learning - LogesticRegression fit()函数引发此错误

python - Active Shape Models的拟合过程无法与Statistics Model拟合函数融合