【问题标题】:scipy: scale the probability plotscipy:缩放概率图
【发布时间】:2018-05-09 19:54:36
【问题描述】:

我有 38400 个正态分布的测量值。平均值为 -4.10e-11,sigma 为 0.0229。毫不奇怪,概率图的斜率为 0.0229。为了绘制和检测异常值,我想用斜率 1 绘制它。理论分位数的范围应该与观察值大致相同,即在 -0.09 和 +0.09 之间。 我该怎么做?

(对于代码示例,我使用随机数而不是实际测量值)。

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

mean = -4.10e-11
sigma = 0.0229

np.random.seed(7654321)
e_array = np.random.normal(mean, sigma, 38400)

minvalue = np.min(e_array)
maxvalue = np.max(e_array)

qq = stats.probplot(e_array, dist="norm", plot=plt)
qq_slope, qq_intercept, qq_r = qq[1]
print('Minimum value: ', minvalue)
print('Maximum value: ', maxvalue)
print('QQ slope:', qq_slope)
print('QQ intercept:', qq_intercept)
print('QQ r:', qq_r)

plt.show()

【问题讨论】:

    标签: python scipy statistics


    【解决方案1】:

    我想这就是你的意思。

    我将样本 cdf 与理论 cdf 进行对比,得到的散点图应该聚集在一条斜率为 1 的线周围。

    from scipy.stats import norm
    import matplotlib.pyplot as plt
    
    N = 100
    mean = -4.10e-11
    sigma = 0.0229
    sample = norm.rvs(loc=mean, scale=sigma, size=N)
    
    sample_cdf = sorted(sample)
    
    quantile_points = [(_-0.5)/N for _ in range(1,1+N)]
    theoretical_cdf = [norm.ppf(_, loc=mean, scale=sigma) for _ in quantile_points]
    
    plt.plot([theoretical_cdf[-1], theoretical_cdf[0]], [theoretical_cdf[-1], theoretical_cdf[0]], 'r-', zorder=1)
    plt.scatter(sample_cdf, theoretical_cdf, zorder=2)
    plt.show()
    

    这是一个结果图。没有多余的装饰。

    【讨论】:

    • 你的日常工作完全符合我的要求。谢谢。唯一的问题是它非常慢。对于 38400 个数据点,stats.probplot 大约需要 90 毫秒,而 norm.ppf 在我的计算机上需要 6.7 秒。
    • 可怕。不幸的是,我不知道 numpy/scipy 使用什么算法来计算逆,因此不能提出替代方案。 (我知道有不同的方法。)我认为您需要经常这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多