- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
好的,所以我当前的曲线拟合代码有一个步骤使用 scipy.stats 根据数据确定正确的分布,
distributions = [st.laplace, st.norm, st.expon, st.dweibull, st.invweibull, st.lognorm, st.uniform]
mles = []
for distribution in distributions:
pars = distribution.fit(data)
mle = distribution.nnlf(pars, data)
mles.append(mle)
results = [(distribution.name, mle) for distribution, mle in zip(distributions, mles)]
for dist in sorted(zip(distributions, mles), key=lambda d: d[1]):
print dist
best_fit = sorted(zip(distributions, mles), key=lambda d: d[1])[0]
print 'Best fit reached using {}, MLE value: {}'.format(best_fit[0].name, best_fit[1])
print [mod[0].name for mod in sorted(zip(distributions, mles), key=lambda d: d[1])]
其中数据是数值列表。到目前为止,这对于拟合单峰分布非常有效,在从随机分布中随机生成值并使用 curve_fit 重新确定参数的脚本中得到证实。
现在我想让代码能够处理双峰分布,如下例所示:
是否有可能从 scipy.stats 获得一对模型的 MLE,以确定一对特定的分布是否适合数据?,类似
distributions = [st.laplace, st.norm, st.expon, st.dweibull, st.invweibull, st.lognorm, st.uniform]
distributionPairs = [[modelA.name, modelB.name] for modelA in distributions for modelB in distributions]
并使用这些对来获取拟合数据的那对分布的 MLE 值?
最佳答案
这不是一个完整的答案,但它可能会帮助您解决问题。假设你知道你的问题是由两种密度产生的。一种解决方案是使用 k-mean 或 EM 算法。
初始化。您通过影响对一个或另一个密度的每个观察来初始化您的算法。然后你初始化这两个密度(你初始化密度的参数,你的情况下的参数之一是“高斯”,“拉普拉斯”等等......迭代。然后,反复运行以下两个步骤:
第 1 步。假设每个点的影响都是正确的,优化参数。您现在可以使用任何优化求解器。此步骤为您提供了适合您的数据的最佳两个密度(具有给定参数)的估计值。
第 2 步。您根据最大可能性将每个观察结果分类为一种密度或另一种密度。
你重复直到收敛。
这个网页有很好的解释 https://people.duke.edu/~ccc14/sta-663/EMAlgorithm.html
如果您不知道有多少密度生成了您的数据,问题就更难了。你必须处理惩罚分类问题,这有点难。
这是一个简单案例中的编码示例:您知道您的数据来自 2 个不同的高斯分布(您不知道每个密度生成了多少变量)。在您的情况下,您可以调整此代码以在每对可能的密度上循环(计算时间更长,但我认为根据经验可以工作)
import scipy.stats as st
import numpy as np
#hard coded data generation
data = np.random.normal(-3, 1, size = 1000)
data[600:] = np.random.normal(loc = 3, scale = 2, size=400)
#initialization
mu1 = -1
sigma1 = 1
mu2 = 1
sigma2 = 1
#criterion to stop iteration
epsilon = 0.1
stop = False
while not stop :
#step1
classification = np.zeros(len(data))
classification[st.norm.pdf(data, mu1, sigma1) > st.norm.pdf(data, mu2, sigma2)] = 1
mu1_old, mu2_old, sigma1_old, sigma2_old = mu1, mu2, sigma1, sigma2
#step2
pars1 = st.norm.fit(data[classification == 1])
mu1, sigma1 = pars1
pars2 = st.norm.fit(data[classification == 0])
mu2, sigma2 = pars2
#stopping criterion
stop = ((mu1_old - mu1)**2 + (mu2_old - mu2)**2 +(sigma1_old - sigma1)**2 +(sigma2_old - sigma2)**2) < epsilon
#result
print("The first density is gaussian :", mu1, sigma1)
print("The first density is gaussian :", mu2, sigma2)
print("A rate of ", np.mean(classification), "is classified in the first density")
希望对您有所帮助。
关于python - 在 python 中为一对分布生成 MLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42033893/
我想知道在数组中给出拟合参数时如何在 R 中进行最大似然估计。当参数数量很大时需要这样做。所以基本上,为了拟合数据 x 的正态分布,我想做如下事情 LL stats4::mle 注意如何 start
我想知道是否有人知道一个Python包,它实现了MLE来估计狄利克雷分布的参数。 最佳答案 Eric Suh 有一个包裹 here 。 $ pip install git+https://github
我正在使用 mle() 方法在 R 中手动估计具有多个预测变量的 logit 回归。我在传递函数 calcLogLikelihood 中计算对数似然所需的附加参数时遇到问题以下。 这是我计算负对数似然
我想计算逻辑回归模型的对数似然。 def sigma(x): return 1 / (1 + np.exp(-x)) def logll(y, X, w): """" Para
我有以下泊松分布: Data 3 5 3 1 2 1 2 1 0 2 4 3 1 4 1 2 2 0 4 2 2 4 0 2 1 0 5 2 0 1 2 1 3 0 2 1 1 2 2 0 3 2 1
这是我在尝试进行 MLE 时在 Matlab 中注意到的。我的第一个估算器使用 pdf 的对数似然并将乘积分解为总和。例如,log weibull pdf (f(x)=b ax^(a-1)exp(-b
我正在学习 NLTK,并且有一个关于数据预处理和 MLE 模型的问题。目前我正在尝试使用 MLE 模型生成单词。问题是当我选择 n>=3 时。我的模型将完全正常地生成单词,直到它到达句点(“.”)。之
我有以下代码,我希望估计自定义分布的参数。 For more details on the distribution .然后使用估计的参数,我想看看估计的 PDF 是否类似于给定数据的分布(它应该与给
我有一个 statsmodels.discrete.discrete_model.BinaryResultsWrapper,它是运行 statsmodels.api.Logit(...).fit()
我有一个简单的 x, y数据框。 mydata mle(estimate, start = list(kappa = 3, lambda = 0.155)) Error in optim(start
我正在尝试估计 Weibull-Gamma 分布参数,但遇到以下错误: "the function mle failed to estimate the parameters, with the er
我正在使用 Python 进行 MLE 实现。我的对数似然函数有 5 个参数需要估计,其中两个参数必须介于 0 和 1 之间。我可以使用 statsmodels 包中的 GenericLikeliho
好的,所以我当前的曲线拟合代码有一个步骤使用 scipy.stats 根据数据确定正确的分布, distributions = [st.laplace, st.norm, st.expon, st.d
我想使用 pyomo 从行为数据集中估计 RL 模型的参数。 #dummy data dis_data = pd.DataFrame([0,1,0,0,0,1], columns=['reward'
我的目的是使用 Newton Raphson 算法找到最大似然估计量,并将该解决方案与 glm() 进行比较。所以我尝试在 R 中使用 maxLik()。结果出现错误,我之前没有使用过这个包,请修复这
我应该首先说明我想要做什么:我想使用 mle 函数,而不必每次我想尝试不同的模型规范时都重新编写我的对数似然函数。因为 mle 需要一个指定的起始值列表,所以您显然不能只将对数似然函数编写为采用参数向
我有一组具有高斯分布的数据,这是一个直方图,显示了它们的实际外观: 我必须使用贝叶斯分类器将这些数据分为两类,我正在使用 sklearn 进行此操作,并且运行良好。然而,作为工作的一部分,我必须使用
我正在尝试使用 MLE 拟合双指数(即两个指数或双指数的混合)数据。虽然没有此类问题的直接示例,但我发现了一些使用 MLE 进行线性(Maximum Likelihood Estimate pseud
我想在 python 中使用 gekko 包实现 MLE(最大似然估计)。假设我们有一个包含两列的 DataFrame:['Loss', 'Target'] 并且其长度等于 500。 首先我们必须导入
我想在 python 中使用 gekko 包实现 MLE(最大似然估计)。假设我们有一个包含两列的 DataFrame:['Loss', 'Target'] 并且其长度等于 500。 首先我们必须导入
我是一名优秀的程序员,十分优秀!