使用Python拟合模拟和实验数据点
作者:互联网
我编写了一些执行蒙特卡罗模拟的代码,并生成信号强度与时间的曲线.这种曲线的形状取决于各种参数,我的合作者想要通过我模拟的实验的“真实版本”确定其中的两个参数.
我们准备将她的实验数据与我的模拟曲线进行比较,但现在我卡住了,因为我还没有能够执行任何拟合(到目前为止,我已经用模拟的噪声数据替换了实验数据进行测试).我已经尝试使用scipy.optimize.leastsq,它以代码2退出(根据文档,这意味着拟合成功),但它主要只返回我输入的值(不完全相同,但接近)猜测,无论他们与真正的价值观有多接近或远离.如果它确实报告了不同的值,则生成的曲线仍然与真实曲线显着不同.
另一个观察是,infodict [‘nfev’]总是包含
The relative error between two consecutive iterates is at most 0.000000
在使用我模拟的噪声数据时,我已经玩了两个参数的真实值具有相同的数量级(因为我认为使用的步长可能只会合理地影响其中一个),具有非常不同的数量级,我改变了步长(参数epsfcn),但无济于事.
有没有人知道我可能做错了什么,或者我可以使用什么拟合函数而不是leastsq?如果是这样的话:非常感谢!
编辑
正如Russ所建议的,我现在将提供有关如何进行模拟的一些细节:我们正在研究与大分子结合的小分子.这种情况发生的概率取决于它们的相互亲和力(亲和力是从实验数据中提取的值之一).一旦发生了绑定,我们还会模拟复合体再次分离所需的时间(解离时间常数是我们感兴趣的第二个参数).还有许多其他参数,但它们仅在计算预期信号强度时才变得相关,因此它们与实际模拟无关.
我们从给定数量的小分子开始,每个小分子的状态被模拟多个时间步长.在每个时间步骤,我们使用亲和力值来确定该分子是否未结合,是否与大分子结合.如果它已被绑定,我们使用解离时间常数和它已被绑定的时间量来确定它是否在此步骤中解离.
在两种情况下,参数(亲和力,解离时间常数)用于计算概率,然后将其与随机数(0和1之间)进行比较,并且在此比较中,它取决于小分子的状态(束缚/未绑定的)更改.
编辑2
没有明确定义的函数来确定所得曲线的形状,并且即使形状清晰可再现,每个单独的数据点也有一个随机元素.因此,我现在尝试使用optimize.fmin而不是leastsq,但它不会收敛,只是在执行了最大迭代次数后退出.
编辑3
正如Andrea所建议的,我上传了一个sample plot.我真的不认为提供样本数据会有很大帮助,它只是每个x值(时间)的一个y值(信号强度)……
解决方法:
不完全是答案,但也有PyMinuit尝试.
http://code.google.com/p/pyminuit/
你想要做的是将你的pdf和数据点转换为chi ^ 2或-ln(似然)或你选择的度量,并使用PyMinuit来最小化该指标.它可以配置得非常冗长,这样你就可以找出出错的地方(如果它确实出错了).
标签:least-squares,python,scipy,curve-fitting,scientific-computing 来源: https://codeday.me/bug/20190726/1541707.html