SciPy偏态正态分布拟合

14
我正在尝试使用SciPy Skewnorm包将数据拟合成偏态正态分布。
然而,我无法正确理解用法,因为我找不到关于这个问题的适当文档或示例。
在帮助部分中,我找到了文档,并尝试使用skewnorm.fit()skewnorm.pdf()来将数据拟合成模型,并使用该模型输出分布并与原始数据进行比较。
如果有人能帮忙,请告诉我。
from scipy import stats
import matplotlib.pyplot as plt
import numpy as np

# choose some parameters
a, loc, scale = 5.3, -0.1, 2.2
# draw a sample
data = stats.skewnorm(a, loc, scale).rvs(1000)
# estimate parameters from sample
ae, loce, scalee = stats.skewnorm.fit(data)
# Plot the PDF.
plt.figure()
plt.hist(data, bins=100, normed=True, alpha=0.6, color='g')
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.skewnorm.pdf(x,ae, loce, scalee)#.rvs(100)
plt.plot(x, p, 'k', linewidth=2)

输出:

这里输入图片描述


1
如果您正在查看fit()方法,那么您将数据建模为从偏斜正态分布中随机抽取的样本,并且您想要估计该分布的参数。是这样吗?如果是这样,您是否尝试过像params = skewnorm.fit(data)这样简单的东西,其中data是包含输入值的1-d数组或序列?(请参见Paul Panzer的答案示例。) - Warren Weckesser
感谢您的评论@WarrenWeckesser,您的假设是正确的。我会尝试一下,如果有效果,我会让您知道的。 - Afshin Rahimi
它运行成功并已更新@warren-weckesser的文章。不幸的是,我还不能使用照片! - Afshin Rahimi
2个回答

9
这是一个示例,供您开始使用。
>>> from scipy import stats

# choose some parameters
>>> a, loc, scale = 1.3, -0.1, 2.2
# draw a sample
>>> sample = stats.skewnorm(a, loc, scale).rvs(1000)

# estimate parameters from sample
>>> ae, loce, scalee = stats.skewnorm.fit(sample)
>>> ae
1.2495366661560348
>>> loce
-0.039775813819310835
>>> scalee
2.1126121580965536

感谢@paulpanzer提供的示例代码,我会尝试并告诉你它是否有效。 - Afshin Rahimi

1
我确信这个问题有一个分析解决方案,但是我刚刚通宵编写了一个基因算法的解决方案。我不熟悉基因算法,所以我只是凭直觉设计了它,据此,我认为这段代码既是相当智能的工作,又是极其愚蠢的哈哈哈。如果有人觉得它有用,我会将它推送到GitHub上去。图片相关——收敛于合理的分布拟合,给定模式和上下95%置信区间边界。

enter image description here


1
请仔细阅读如何回答并注意这不是一个讨论论坛。回答部分仅用于尝试实际回答问题。答案需要自成一体,因为五年后的用户不应该为了细节而联系您。请[编辑]您的答案以包含解决方案的详细信息。 - AlexK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接