我编写了一些代码来执行蒙特卡罗模拟并生成信号强度与时间的曲线。这种曲线的形状取决于各种参数,我的合作者想通过我正在模拟的实验的“现实生活版本”来确定其中两个参数。
我们准备将她的实验数据与我的模拟曲线进行比较,但现在我卡住了,因为我还没有能够进行任何拟合(目前我已经将实验数据替换为模拟噪声数据进行测试)。我尝试使用 scipy.optimize.leastsq
,它以代码 2 退出(根据文档,这意味着拟合成功),但它主要只是返回值(不完全相同,但close) 我输入作为初始猜测,无论它们与真实值的距离有多近或多远。如果它确实报告了不同的值,生成的曲线仍然与真实曲线有很大差异。
另一个观察结果是 infodict['nfev']
总是包含
The relative error between two consecutive iterates is at most 0.000000
在使用我的模拟噪声数据时,我试过两个参数的真实值具有相同的数量级(因为我认为使用的步长可能只会明显影响其中一个,否则),一个非常不同的数量级,我改变了步长(参数 epsfcn
),但无济于事。
有没有人知道我可能做错了什么,或者我可以使用什么拟合函数来代替 leastsq
?如果是这样:非常感谢!
编辑
正如 Russ 所建议的,我现在将提供有关如何执行模拟的一些细节:我们正在研究小分子与大分子的结合。这种情况发生的概率取决于它们的相互亲和性(亲和性是要从实验数据中提取的值之一)。一旦发生结合,我们还模拟了复合物再次分解所需的时间(解离时间常数是我们感兴趣的第二个参数)。还有许多其他参数,但它们仅在计算预期信号强度时才变得相关,因此它们与实际模拟无关。
我们从给定数量的小分子开始,模拟每个小分子的状态多个时间步长。在每个时间步,我们使用亲和性值来确定该分子(如果未结合)是否与大分子结合。如果它已经结合,我们使用解离时间常数和它已经结合的时间量来确定它是否在这一步中解离。
在这两种情况下,参数(亲和性、解离时间常数)都用于计算概率,然后将其与随机数(介于 0 和 1 之间)进行比较,而这种比较取决于小分子的状态是否(绑定(bind)/未绑定(bind))更改。
编辑 2
没有明确定义的函数来确定所得曲线的形状,并且即使形状可以清楚地重现,每个单独的数据点都存在随机元素。 因此,我现在尝试使用 optimize.fmin
而不是 leastsq
,但它不会收敛,并且会在执行了最大迭代次数后简单地退出。
编辑 3
按照 Andrea 的建议,我上传了一个 sample plot .我真的不认为提供样本数据会有很大帮助,它只是每个 x 值(时间)的一个 y 值(信号强度)...
最佳答案
为了用任意函数拟合数据,您通常需要 Levenberg–Marquardt算法,这就是 scipy.optimize.leastsq
使用的算法,因此您很可能使用了正确的函数。
查看 this page 的第 5.4 节中的教程看看是否有帮助。
也有可能你的底层功能很难适应(功能是什么?),但听起来你可能有其他问题。
此外 - 与 StackOverflow 一样强大,您可能会通过直接发布到 Scipy-User mailing list 来获得对 scipy 问题的更有见识的回答。带有一些示例代码和更多详细信息。
关于python - 使用 Python 拟合模拟和实验数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7445070/