【发布时间】:2021-10-16 14:43:47
【问题描述】:
在 SciPy 中拟合分布时有没有办法检查收敛性?
我的目标是将 SciPy 发行版(即 Johnson S_U 发行版)拟合到数十个数据集,作为自动化数据监控系统的一部分。大多数情况下它工作正常,但有一些数据集是异常的,并且显然不遵循 Johnson S_U 分布。适合这些数据集无声地发散,即没有任何警告/错误/无论如何!相反,如果我切换到 R 并尝试在那里拟合,我永远不会得到收敛,这是正确的 - 无论拟合设置如何,R 算法都拒绝声明收敛。
数据: 两个数据集是available in Dropbox:
-
data-converging-fit.csv... 一个标准数据,适合很好地收敛(你可能认为这是一个丑陋的、倾斜的、重中心质量的 blob,但 Johnson S_U 足够灵活,可以适应这样的野兽! ):
-
data-diverging-fit.csv... 一个异常数据,其中拟合发散:
适合分布的代码:
import pandas as pd
from scipy import stats
distribution_name = 'johnsonsu'
dist = getattr(stats, distribution_name)
convdata = pd.read_csv('data-converging-fit.csv', index_col= 'timestamp')
divdata = pd.read_csv('data-diverging-fit.csv', index_col= 'timestamp')
在好的数据上,拟合的参数有共同的数量级:
a, b, loc, scale = dist.fit(convdata['target'])
a, b, loc, scale
[out]: (0.3154946859186918,
2.9938226613743932,
0.002176043693009398,
0.045430055488776266)
在异常数据上,拟合参数不合理:
a, b, loc, scale = dist.fit(divdata['target'])
a, b, loc, scale
[out]: (-3424954.6481554992,
7272004.43156841,
-71078.33596490842,
145478.1300979394)
我仍然没有收到任何关于拟合未能收敛的警告。
通过在 StackOverflow 上研究类似问题,我知道将我的数据分箱然后使用 curve_fit 的建议。尽管它具有实用性,但我认为该解决方案并不正确,因为这不是我们拟合分布的方式:分箱是任意的(分箱的数量),它会影响最终的拟合。一个更现实的选择可能是scipy.optimize.minimize 和回调以了解收敛的进度;我仍然不确定它最终会告诉我算法是否收敛。
【问题讨论】:
标签: python scipy distribution model-fitting convergence