Python中参数曲线的拟合

2024-10-02 00:19:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在一个完美的世界里,我会知道T(参数的真实值)的值,并且能够做一个非常基本的最小二乘拟合来找到*params的值。(请注意,我并不是试图“连接”绘图中的x和{}的值,就像在31243002或{a2})中一样。我不能保证在我的实际数据中,潜在值{}是单调的,因为我的数据是跨多个周期收集的。在

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

  1. 选择*params的某个值并将其应用于模型
  2. 取一个t值的数组,并将其放入模型中,以创建一个model(*params) = (x(*params),y(*params))的数组
  3. X(数据值)插值到model中得到{}
  4. Y和{}之间进行最小二乘法(或其他)比较
  5. 对一组新的*params再次执行此操作
  6. 最后,为*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]

Tags: 数据方法in模型importfordatareturn
1条回答
网友
1楼 · 发布于 2024-10-02 00:19:51

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

x = a+r cos(t)   
y = b+r sin(t)

在不同的值t。在

在本例中,我要做的是消除变量t以获得x和{}之间的关系,在本例中,(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或者数学溢出.net. 我知道最后一个有可怕的名声,但我们不咬人,真的!在

相关问题 更多 >

    热门问题