首页 > 解决方案 > Python Scipy stats pdf概率分布函数总和不为1

问题描述

在那里,我在这里阅读了一些主题,但我仍然感到困惑。

我认为 scipy stats(连续随机变量)函数 stats.rv_name.pdf(x, loc, scale, *params) 的总和应该为 1。

我基本上使用下面的代码拟合了散点图数据。我确实得到了 1.0 的累积值(最终)。但我的 pdf_fitted 不等于一。

我仍然不明白为什么会这样,以及如何在 pdf 输出中获取参数,使其总和为 1。

这里有一个相关的线程:为什么 scipy.norm.pdf 有时会给出 PDF > 1?如何纠正它?

def py_DistEstimate(arr1, disType, reSults='params', bins = 20):
    dist_names = ['gamma', 'beta', 'rayleigh', 'norm', 'pareto']

    dist = getattr(stats, disType)
    param = dist.fit(arr1)
    x = linspace(min(arr1), max(arr1), bins)
    pdf_fitted = dist.pdf(x, loc=param[-2], scale=param[-1], *param[:-2])
    cdf_fitted = dist.cdf(x, loc=param[-2], scale=param[-1], *param[:-2])

    if reSults == 'pdf':
        digitizeV = np.digitize(arr1, x, right = True)
        bin_counV = np.bincount(digitizeV, weights = None)
        bin_probV = bin_counV/len(arr1)
        return pd.DataFrame({'x-axis':x, 'pdf':pdf_fitted, 'original':bin_probV, 'cdf':cdf_fitted})
    elif reSults == 'params':
        parameter_names = [p for p in inspect.signature(dist._pdf).parameters if not p=='x'] + ["loc","scale"]
        return pd.DataFrame({'names':parameter_names, 'values':param})
    elif reSults == 'listparams':   
        dist_continu = [d for d in dir(stats) if isinstance(getattr(stats, d), stats.rv_continuous)]
        return dist_continu

标签: pythonscipystatsmodelsprobability-density

解决方案


推荐阅读