- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 scipy's least-squares optimization适合 exponentially-modified gaussian distribution到一组 react 时间测量。一般来说,它运行良好,但有时,优化会偏离轨道并为参数选择一个疯狂的值——结果图显然不能很好地拟合数据。一般来说,问题似乎是由浮点精度错误引起的——我们转向 0、inf 或 nan-land。
我正在考虑做两件事:
结合 PDF 和 CDF 拟合听起来非常简单;误差的范围甚至大体相同。但是让初始参数适合那里:我不太确定这是否是个好主意——但如果是:
这些甚至是正确的问题吗?是否存在普遍认为的“正确”答案,或者“尝试一些东西直到找到似乎有效的东西”是一种好方法吗?
根据要求,这里有一个数据集,此过程对其运行不佳。我知道只有几个样本,而且数据不能很好地符合分布;我仍然希望通过优化获得“合理的外观”结果。
array([ 450., 560., 692., 730., 758., 723., 486., 596., 716.,
695., 757., 522., 535., 419., 478., 666., 637., 569.,
859., 883., 551., 652., 378., 801., 718., 479., 544.])
在让我的 MLE 估计收敛到一个“合理”值之前,我遇到了一堆问题,直到我发现这一点:如果 X 至少包含一个 nan,np.sum(X) == nan
当 X 是一个 numpy 数组但 不是 当 X 是一个 pandas 系列时。因此,当参数开始越界时,对数似然之和正在做愚蠢的事情。
添加了一个 np.asarray()
调用,一切都很好!
最佳答案
这应该是一条评论,但我的空间用完了。
我认为最大似然拟合可能是此处最合适的方法。 ML 方法已经在 scipy.stats
中为许多发行版实现。例如,您可以调用 scipy.stats.norm.fit
找到正态分布的 MLE,并以类似的方式找到指数分布的 MLE。结合这两个生成的 MLE 参数应该可以为 Ex-Gaussian ML 拟合提供一个非常好的起始参数。事实上,我认为你的大部分数据都非常好地呈正态分布。如果是这种情况,仅正态分布的 ML 参数估计值就应该为您提供一个非常好的起始参数。
由于 Ex-Gaussian 只有 3 个参数,我认为 ML 拟合一点也不难。如果您可以提供一个数据集,而您当前的方法不能很好地处理该数据集,那么展示一个真实的例子会更容易。
好的,给你:
>>> import scipy.special as sse
>>> import scipy.stats as sss
>>> import scipy.optimize as so
>>> from numpy import *
>>> def eg_pdf(p, x): #defines the PDF
m=p[0]
s=p[1]
l=p[2]
return 0.5*l*exp(0.5*l*(2*m+l*s*s-2*x))*sse.erfc((m+l*s*s-x)/(sqrt(2)*s))
>>> xo=array([ 450., 560., 692., 730., 758., 723., 486., 596., 716.,
695., 757., 522., 535., 419., 478., 666., 637., 569.,
859., 883., 551., 652., 378., 801., 718., 479., 544.])
>>> sss.norm.fit(xo) #get the starting parameter vector form the normal MLE
(624.22222222222217, 132.23977474531389)
>>> def llh(p, f, x): #defines the negative log-likelihood function
return -sum(log(f(p,x)))
>>> so.fmin(llh, array([624.22222222222217, 132.23977474531389, 1e-6]), (eg_pdf, xo)) #yeah, the data is not good
Warning: Maximum number of function evaluations has been exceeded.
array([ 6.14003407e+02, 1.31843250e+02, 9.79425845e-02])
>>> przt=so.fmin(llh, array([624.22222222222217, 132.23977474531389, 1e-6]), (eg_pdf, xo), maxfun=1000) #so, we increase the number of function call uplimit
Optimization terminated successfully.
Current function value: 170.195924
Iterations: 376
Function evaluations: 681
>>> llh(array([624.22222222222217, 132.23977474531389, 1e-6]), eg_pdf, xo)
400.02921290185645
>>> llh(przt, eg_pdf, xo) #quite an improvement over the initial guess
170.19592431051217
>>> przt
array([ 6.14007039e+02, 1.31844654e+02, 9.78934519e-02])
此处使用的优化器(fmin
,或 Nelder-Mead 单纯形算法)不使用任何来自梯度的信息,并且通常比使用的优化器运行得慢得多。看来指数高斯的负对数似然函数的导数可以很容易地写成一个封闭的形式。如果是这样,利用梯度/导数的优化器将是更好、更有效的选择(例如 fmin_bfgs
)。
要考虑的另一件事是参数约束。根据定义,对于指数高斯分布,sigma 和 lambda 必须为正。您可以使用约束优化器(例如 fmin_l_bfgs_b
)。或者,您可以优化:
>>> def eg_pdf2(p, x): #defines the PDF
m=p[0]
s=exp(p[1])
l=exp(p[2])
return 0.5*l*exp(0.5*l*(2*m+l*s*s-2*x))*sse.erfc((m+l*s*s-x)/(sqrt(2)*s))
由于MLE的函数不变性,这个函数的MLE应该和原来的eg_pdf
一样。除了 exp()
之外,您还可以使用其他转换将 (-inf, +inf)
投影到 (0, +inf)
.
关于python - 将分布拟合到数据 : how to penalize "bad" parameter estimates?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20249115/
几个月前,我使用了tf.contrib.learn.DNNRegressor来自 TensorFlow 的 API,我发现它使用起来非常方便。最近几个月我没有跟上TensorFlow的发展。现在我有一
我们正在尝试将旧的训练代码转换为更符合 tf.estimator.Estimator 的代码。在初始代码中,我们针对目标数据集微调原始模型。在使用 variables_to_restore 和 ini
我目前运行的是 TensorFlow 1.9.0。我的自定义估算器是使用 tf.estimator.Estimator 创建的,并且运行时没有出现任何故障。但是,我在 model_dir 下没有找到任
我刚刚用 tensorflow 训练了一个 CNN 来识别太阳黑子。我的模型与 this 几乎相同.问题是我无法在任何地方找到关于如何使用训练阶段生成的检查点进行预测的明确解释。 尝试使用标准恢复方法
我正在尝试使用我自己的数据集和类对在 imagenet 上预训练的 Inception-resnet v2 模型进行迁移学习。我的原始代码库是对 tf.slim 的修改我再也找不到的示例,现在我正在尝
在 train(...) 完成后,如何从 tf.estimator.Estimator 获取最后一个 global_step ?例如,典型的基于估算器的训练例程可能如下设置: n_epochs = 1
一年多来我一直在使用自己的 Estimator/Experiment 之类的代码,但我最终想加入 Dataset+Estimator 的行列。 我想做如下的事情: for _ in range(N):
我正在考虑将我的代码库移动到 tf.estimator.Estimator ,但我找不到如何将它与张量板摘要结合使用的示例。 MWE: import numpy as np import tensor
我的印象是在 tf.estimator.Estimator 实例上调用 evaluate() 不会在多个 GPU 上运行模型,即使分配策略是 MirroredStrategy,配置为至少使用 2 个
我遇到了一些小问题,但我不知道如何处理。 当我使用 tf.estimator.Estimator 时,它会在每个步骤中记录两行,例如: INFO:tensorflow:global_step/sec:
在此tutorial ,他们通过为 tf.nn.softmax 节点命名成功地记录了 softmax 函数。 tf.nn.softmax(logits, name="softmax_tensor")
我发现 tensorflow train_and_evaluate 的工作方式与传统的 tf.estimator train 和 evaluate 相比有点不同。train_and_evaluate
我正在使用 tensorflow 版本 2.0.0-beta1。打电话时 tf.estimator.inputs.pandas_input_fn 它给了我一个错误。 module 'tensorflo
有没有办法在另一个模型 B 中使用经过 tf.estimator 训练的模型 A? 这是情况,假设我有一个训练有素的“模型 A”和 model_a_fn()。“模型 A”获取图像作为输入,并输出一些类
我正在尝试在本地运行对象检测 API。 我相信我已经按照 TensorFlow Object Detection API 中的描述设置了所有内容。但是,当我尝试运行 model_main.py 时,会
请原谅我的编码经验。我正在尝试使用 GridSearch 进行一系列回归。我正在尝试循环整个过程以使过程更快,但我的代码不够好并且不介意提高效率。这是我的代码: classifiers=[Lasso(
我在将纯 Keras 模型转换为不平衡数据集上的 TensorFlow Estimator API 时遇到了一些麻烦。 使用纯 Keras API 时,class_weight 参数在 model.f
当发生上述错误时,我经常使用有关估计器的tensorflow官方教程,而它在google.colab中正常运行。 我使用的环境是win10-64bit&tensorflow-gpu==1.12.0&p
Closed. This question is opinion-based。它当前不接受答案。 想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 已关闭6年。
Closed. This question is opinion-based。它当前不接受答案。 想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 1年前关闭。
我是一名优秀的程序员,十分优秀!