我有(X,Y)
形式的实验数据和(x(t;*params),y(t;*params))
形式的理论模型,其中t
是一个物理(但不可观察)变量,而*params
是我想确定的参数。 t
是一个连续变量,模型中x
和t
之间以及y
和t
之间存在1:1的关系。
在一个完美的世界中,我会知道T
(参数的真实世界值)的值,并且能够进行极其基本的最小二乘拟合来找到{{1的值}}。 (请注意,我不试图在我的情节中“连接”*params
和x
的值,例如31243002或31464345。 )我无法保证在我的真实数据中,潜在值y
是单调的,因为我的数据是在多个周期内收集的。
我不是很熟练地手动进行曲线拟合,并且必须使用非常粗糙的方法而不能轻松访问基本的scipy函数。我的基本方法包括:
T
的某个值并将其应用于模型*params
值并将其放入模型中以创建t
model(*params) = (x(*params),y(*params))
(数据值)插入X
以获取model
Y_predicted
和Y
Y_predicted
*params
这种方法存在几个明显的问题。
1)我没有足够的经验来编写一个非常好的“再做一次”,而不是“尝试解决方案领域的所有内容”,也许“尝试粗网格中的所有内容”,然后“再次尝试所有内容”在粗网格的热点中,网格略微更细。“我尝试过做MCMC方法,但我从来没有找到任何最佳值,主要是因为问题2
2)步骤2-4本身就是超级低效的。
我尝试了类似的东西(类似于伪代码;实际功能已经完成)。关于在A,B上使用广播,可以做出许多微小的狡辩,但是那些不像每个步骤需要插值的问题那么重要。
我认识的人建议使用某种Expectation Maximization算法,但我不知道如何从头开始编写代码。我真的希望有一些令人敬畏的scipy(或其他开源)算法,我无法找到它涵盖了我的整个问题,但此时我并不抱希望。
*params
答案 0 :(得分:0)
如果我正确理解了这个问题,那么参数是每个样本中相同的常数,但t
因样本而异。所以,例如,也许你有一大堆你认为已从圆圈中采样的点
x = a+r cos(t)
y = b+r sin(t)
不同的t
值。
在这种情况下,我要做的是消除变量t
以获得x
和y
之间的关系 - 在本例中为(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上做得更好。我知道最后一个有一个可怕的声誉,但我们不咬,真的!