使用Scipy(Python)将经验分布拟合到理论分布?

s_s*_*rly 121 python statistics numpy distribution scipy

简介:我有一个超过30 000个值的列表,范围从0到47,例如[0,0,0,0,...,1,1,1,1,...,2,2,2,2, ......,47等]是连续分布.

问题:基于我的分布,我想计算任何给定值的p值(看到更大值的概率).例如,正如您所见,0的p值接近1,较高的数值的p值趋于0.

我不知道我是否正确,但是为了确定概率,我认为我需要将我的数据拟合到最适合描述我的数据的理论分布.我认为需要某种拟合优度测试来确定最佳模型.

有没有办法在Python中实现这样的分析(Scipy或Numpy)?你能举个例子吗?

谢谢!

tmt*_*prt 180

具有平方误差和(SSE)的分布拟合

这是对Saullo答案的更新和修改,它使用当前scipy.stats分布的完整列表,并返回分布直方图和数据直方图之间SSE最小的分布.

示例拟合

使用厄尔尼诺数据集statsmodels,分布是合适的,并确定误差.返回具有最小错误的分布.

所有发行版

所有合适的发行版

最佳配送

最佳配送

示例代码

%matplotlib inline

import warnings
import numpy as np
import pandas as pd
import scipy.stats as st
import statsmodels as sm
import matplotlib
import matplotlib.pyplot as plt

matplotlib.rcParams['figure.figsize'] = (16.0, 12.0)
matplotlib.style.use('ggplot')

# Create models from data
def best_fit_distribution(data, bins=200, ax=None):
    """Model data by finding best fit distribution to data"""
    # Get histogram of original data
    y, x = np.histogram(data, bins=bins, density=True)
    x = (x + np.roll(x, -1))[:-1] / 2.0

    # Distributions to check
    DISTRIBUTIONS = [        
        st.alpha,st.anglit,st.arcsine,st.beta,st.betaprime,st.bradford,st.burr,st.cauchy,st.chi,st.chi2,st.cosine,
        st.dgamma,st.dweibull,st.erlang,st.expon,st.exponnorm,st.exponweib,st.exponpow,st.f,st.fatiguelife,st.fisk,
        st.foldcauchy,st.foldnorm,st.frechet_r,st.frechet_l,st.genlogistic,st.genpareto,st.gennorm,st.genexpon,
        st.genextreme,st.gausshyper,st.gamma,st.gengamma,st.genhalflogistic,st.gilbrat,st.gompertz,st.gumbel_r,
        st.gumbel_l,st.halfcauchy,st.halflogistic,st.halfnorm,st.halfgennorm,st.hypsecant,st.invgamma,st.invgauss,
        st.invweibull,st.johnsonsb,st.johnsonsu,st.ksone,st.kstwobign,st.laplace,st.levy,st.levy_l,st.levy_stable,
        st.logistic,st.loggamma,st.loglaplace,st.lognorm,st.lomax,st.maxwell,st.mielke,st.nakagami,st.ncx2,st.ncf,
        st.nct,st.norm,st.pareto,st.pearson3,st.powerlaw,st.powerlognorm,st.powernorm,st.rdist,st.reciprocal,
        st.rayleigh,st.rice,st.recipinvgauss,st.semicircular,st.t,st.triang,st.truncexpon,st.truncnorm,st.tukeylambda,
        st.uniform,st.vonmises,st.vonmises_line,st.wald,st.weibull_min,st.weibull_max,st.wrapcauchy
    ]

    # Best holders
    best_distribution = st.norm
    best_params = (0.0, 1.0)
    best_sse = np.inf

    # Estimate distribution parameters from data
    for distribution in DISTRIBUTIONS:

        # Try to fit the distribution
        try:
            # Ignore warnings from data that can't be fit
            with warnings.catch_warnings():
                warnings.filterwarnings('ignore')

                # fit dist to data
                params = distribution.fit(data)

                # Separate parts of parameters
                arg = params[:-2]
                loc = params[-2]
                scale = params[-1]

                # Calculate fitted PDF and error with fit in distribution
                pdf = distribution.pdf(x, loc=loc, scale=scale, *arg)
                sse = np.sum(np.power(y - pdf, 2.0))

                # if axis pass in add to plot
                try:
                    if ax:
                        pd.Series(pdf, x).plot(ax=ax)
                    end
                except Exception:
                    pass

                # identify if this distribution is better
                if best_sse > sse > 0:
                    best_distribution = distribution
                    best_params = params
                    best_sse = sse

        except Exception:
            pass

    return (best_distribution.name, best_params)

def make_pdf(dist, params, size=10000):
    """Generate distributions's Probability Distribution Function """

    # Separate parts of parameters
    arg = params[:-2]
    loc = params[-2]
    scale = params[-1]

    # Get sane start and end points of distribution
    start = dist.ppf(0.01, *arg, loc=loc, scale=scale) if arg else dist.ppf(0.01, loc=loc, scale=scale)
    end = dist.ppf(0.99, *arg, loc=loc, scale=scale) if arg else dist.ppf(0.99, loc=loc, scale=scale)

    # Build PDF and turn into pandas Series
    x = np.linspace(start, end, size)
    y = dist.pdf(x, loc=loc, scale=scale, *arg)
    pdf = pd.Series(y, x)

    return pdf

# Load data from statsmodels datasets
data = pd.Series(sm.datasets.elnino.load_pandas().data.set_index('YEAR').values.ravel())

# Plot for comparison
plt.figure(figsize=(12,8))
ax = data.plot(kind='hist', bins=50, normed=True, alpha=0.5, color=plt.rcParams['axes.color_cycle'][1])
# Save plot limits
dataYLim = ax.get_ylim()

# Find best fit distribution
best_fit_name, best_fit_params = best_fit_distribution(data, 200, ax)
best_dist = getattr(st, best_fit_name)

# Update plots
ax.set_ylim(dataYLim)
ax.set_title(u'El Niño sea temp.\n All Fitted Distributions')
ax.set_xlabel(u'Temp (°C)')
ax.set_ylabel('Frequency')

# Make PDF with best params 
pdf = make_pdf(best_dist, best_fit_params)

# Display
plt.figure(figsize=(12,8))
ax = pdf.plot(lw=2, label='PDF', legend=True)
data.plot(kind='hist', bins=50, normed=True, alpha=0.5, label='Data', legend=True, ax=ax)

param_names = (best_dist.shapes + ', loc, scale').split(', ') if best_dist.shapes else ['loc', 'scale']
param_str = ', '.join(['{}={:0.2f}'.format(k,v) for k,v in zip(param_names, best_fit_params)])
dist_str = '{}({})'.format(best_fit_name, param_str)

ax.set_title(u'El Niño sea temp. with best fit distribution \n' + dist_str)
ax.set_xlabel(u'Temp. (°C)')
ax.set_ylabel('Frequency')
Run Code Online (Sandbox Code Playgroud)

  • 以防 2020 年有人想知道如何运行此操作,请将 `import statsmodel as sm` 更改为 `import statsmodel.api as sm` (13认同)
  • 获取分发名称:`来自scipy.stats._continuous_distns import _distn_names`.然后你可以为_distn_names`中的每个`distname`使用类似`getattr(scipy.stats,distname)`的东西.这很有用,因为使用不同的SciPy版本更新了发行版. (6认同)
  • 惊人的。考虑在 `np.histogram()` 中使用 `density=True` 而不是 `normed=True`。^^ (4认同)
  • @RafaelSilva 等人:如果代码不再工作并且您已修复,请更新答案而不是添加评论。我现在合并了此处提到的所有更改以使其再次运行。 (3认同)
  • 很酷。我必须更新颜色参数-'ax = data.plot(kind ='hist',bins = 50,normed = True,alpha = 0.5,color = list(matplotlib.rcParams ['axes.prop_cycle'])[1 ] ['color'])` (2认同)
  • 我不明白你为什么放这一行:x = (x + np.roll(x, -1))[:-1] / 2.0. 你能解释一下这次行动的目的吗? (2认同)
  • @jartymcfly 不确定你是否弄清楚为什么使用“np.roll()”?它只是窗口大小为“2.0”的移动平均线。在本例中,“x”代表“bin_edges”,因此执行此计算将返回每个 bin 的中心。 (2认同)

Sau*_*tro 134

SciPy 0.12.0中82个已实现的分发功能.您可以使用他们的fit()方法测试其中一些如何适合您的数据.请查看以下代码了解更多详情:

在此输入图像描述

import matplotlib.pyplot as plt
import scipy
import scipy.stats
size = 30000
x = scipy.arange(size)
y = scipy.int_(scipy.round_(scipy.stats.vonmises.rvs(5,size=size)*47))
h = plt.hist(y, bins=range(48))

dist_names = ['gamma', 'beta', 'rayleigh', 'norm', 'pareto']

for dist_name in dist_names:
    dist = getattr(scipy.stats, dist_name)
    param = dist.fit(y)
    pdf_fitted = dist.pdf(x, *param[:-2], loc=param[-2], scale=param[-1]) * size
    plt.plot(pdf_fitted, label=dist_name)
    plt.xlim(0,47)
plt.legend(loc='upper right')
plt.show()
Run Code Online (Sandbox Code Playgroud)

参考文献:

- 拟合分布,拟合优度,p值.用Scipy(Python)可以做到这一点吗?

- 与Scipy配电

这里有一个列表,其中包含Scipy 0.12.0(VI)中可用的所有分布函数的名称:

dist_names = [ 'alpha', 'anglit', 'arcsine', 'beta', 'betaprime', 'bradford', 'burr', 'cauchy', 'chi', 'chi2', 'cosine', 'dgamma', 'dweibull', 'erlang', 'expon', 'exponweib', 'exponpow', 'f', 'fatiguelife', 'fisk', 'foldcauchy', 'foldnorm', 'frechet_r', 'frechet_l', 'genlogistic', 'genpareto', 'genexpon', 'genextreme', 'gausshyper', 'gamma', 'gengamma', 'genhalflogistic', 'gilbrat', 'gompertz', 'gumbel_r', 'gumbel_l', 'halfcauchy', 'halflogistic', 'halfnorm', 'hypsecant', 'invgamma', 'invgauss', 'invweibull', 'johnsonsb', 'johnsonsu', 'ksone', 'kstwobign', 'laplace', 'logistic', 'loggamma', 'loglaplace', 'lognorm', 'lomax', 'maxwell', 'mielke', 'nakagami', 'ncx2', 'ncf', 'nct', 'norm', 'pareto', 'pearson3', 'powerlaw', 'powerlognorm', 'powernorm', 'rdist', 'reciprocal', 'rayleigh', 'rice', 'recipinvgauss', 'semicircular', 't', 'triang', 'truncexpon', 'truncnorm', 'tukeylambda', 'uniform', 'vonmises', 'wald', 'weibull_min', 'weibull_max', 'wrapcauchy'] 
Run Code Online (Sandbox Code Playgroud)

  • 如果在绘制直方图时"normed = True"怎么办?你不会把`pdf_fitted`乘以`size`,对吗? (6认同)
  • 如果您想查看所有发行版的外观或了解如何访问所有发行版,请参阅[answer](http://stackoverflow.com/a/37559471/2087463). (3认同)
  • 要获取发行版名称:从scipy.stats._continuous_distns导入_distn_names。然后,您可以为_distn_names中的每个`distname`使用`getattr(scipy.stats,distname)`之类的东西。有用,因为发行版使用不同的SciPy版本进行了更新。 (2认同)

CT *_*Zhu 10

fit()@Saullo Castro提到的方法提供了最大似然估计(MLE).数据的最佳分布是给出最高的分布,可以通过几种不同的方式确定:例如

1,给你最高对数可能性的那个.

2,给你最小的AIC,BIC或BICc值(参见wiki:http://en.wikipedia.org/wiki/Akaike_information_criterion,基本上可以看作是参数数量调整的对数似然,因为分布更多参数预计更合适)

3,最大化贝叶斯后验概率的那个.(参见wiki:http://en.wikipedia.org/wiki/Posterior_probability)

当然,如果您已经有一个应该描述数据的分布(基于您特定领域的理论)并且想要坚持这一点,那么您将跳过识别最佳拟合分布的步骤.

scipy没有计算对数似然的函数(虽然提供了MLE方法),但硬代码很容易:看看`scipy.stat.distributions`的内置概率密度函数是否慢于用户提供的函数?

  • 我如何将这种方法应用于数据已经被分箱的情况 - 即已经是直方图而不是从数据生成直方图? (2认同)

erd*_*ant 9

试试distfit图书馆。

pip 安装 distfit

# Create 1000 random integers, value between [0-50]
X = np.random.randint(0, 50,1000)

# Retrieve P-value for y
y = [0,10,45,55,100]

# From the distfit library import the class distfit
from distfit import distfit

# Initialize.
# Set any properties here, such as alpha.
# The smoothing can be of use when working with integers. Otherwise your histogram
# may be jumping up-and-down, and getting the correct fit may be harder.
dist = distfit(alpha=0.05, smooth=10)

# Search for best theoretical fit on your empirical data
dist.fit_transform(X)

> [distfit] >fit..
> [distfit] >transform..
> [distfit] >[norm      ] [RSS: 0.0037894] [loc=23.535 scale=14.450] 
> [distfit] >[expon     ] [RSS: 0.0055534] [loc=0.000 scale=23.535] 
> [distfit] >[pareto    ] [RSS: 0.0056828] [loc=-384473077.778 scale=384473077.778] 
> [distfit] >[dweibull  ] [RSS: 0.0038202] [loc=24.535 scale=13.936] 
> [distfit] >[t         ] [RSS: 0.0037896] [loc=23.535 scale=14.450] 
> [distfit] >[genextreme] [RSS: 0.0036185] [loc=18.890 scale=14.506] 
> [distfit] >[gamma     ] [RSS: 0.0037600] [loc=-175.505 scale=1.044] 
> [distfit] >[lognorm   ] [RSS: 0.0642364] [loc=-0.000 scale=1.802] 
> [distfit] >[beta      ] [RSS: 0.0021885] [loc=-3.981 scale=52.981] 
> [distfit] >[uniform   ] [RSS: 0.0012349] [loc=0.000 scale=49.000] 

# Best fitted model
best_distr = dist.model
print(best_distr)

# Uniform shows best fit, with 95% CII (confidence intervals), and all other parameters
> {'distr': <scipy.stats._continuous_distns.uniform_gen at 0x16de3a53160>,
>  'params': (0.0, 49.0),
>  'name': 'uniform',
>  'RSS': 0.0012349021241149533,
>  'loc': 0.0,
>  'scale': 49.0,
>  'arg': (),
>  'CII_min_alpha': 2.45,
>  'CII_max_alpha': 46.55}

# Ranking distributions
dist.summary

# Plot the summary of fitted distributions
dist.plot_summary()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

# Make prediction on new datapoints based on the fit
dist.predict(y)

# Retrieve your pvalues with 
dist.y_pred
# array(['down', 'none', 'none', 'up', 'up'], dtype='<U4')
dist.y_proba
array([0.02040816, 0.02040816, 0.02040816, 0.        , 0.        ])

# Or in one dataframe
dist.df

# The plot function will now also include the predictions of y
dist.plot()
Run Code Online (Sandbox Code Playgroud)

最合适

请注意,在这种情况下,由于均匀分布,所有点都将是重要的。如果需要,您可以使用 dist.y_pred 进行过滤。

  • 确实,为了清楚起见,我在回复中添加了这一点。 (2认同)

Seb*_*ose 7

以下代码是一般答案的版本,但进行了更正和清晰。

import numpy as np
import pandas as pd
import scipy.stats as st
import statsmodels.api as sm
import matplotlib as mpl
import matplotlib.pyplot as plt
import math
import random

mpl.style.use("ggplot")

def danoes_formula(data):
    """
    DANOE'S FORMULA
    https://en.wikipedia.org/wiki/Histogram#Doane's_formula
    """
    N = len(data)
    skewness = st.skew(data)
    sigma_g1 = math.sqrt((6*(N-2))/((N+1)*(N+3)))
    num_bins = 1 + math.log(N,2) + math.log(1+abs(skewness)/sigma_g1,2)
    num_bins = round(num_bins)
    return num_bins

def plot_histogram(data, results, n):
    ## n first distribution of the ranking
    N_DISTRIBUTIONS = {k: results[k] for k in list(results)[:n]}

    ## Histogram of data
    plt.figure(figsize=(10, 5))
    plt.hist(data, density=True, ec='white', color=(63/235, 149/235, 170/235))
    plt.title('HISTOGRAM')
    plt.xlabel('Values')
    plt.ylabel('Frequencies')

    ## Plot n distributions
    for distribution, result in N_DISTRIBUTIONS.items():
        # print(i, distribution)
        sse = result[0]
        arg = result[1]
        loc = result[2]
        scale = result[3]
        x_plot = np.linspace(min(data), max(data), 1000)
        y_plot = distribution.pdf(x_plot, loc=loc, scale=scale, *arg)
        plt.plot(x_plot, y_plot, label=str(distribution)[32:-34] + ": " + str(sse)[0:6], color=(random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)))
    
    plt.legend(title='DISTRIBUTIONS', bbox_to_anchor=(1.05, 1), loc='upper left')
    plt.show()

def fit_data(data):
    ## st.frechet_r,st.frechet_l: are disbled in current SciPy version
    ## st.levy_stable: a lot of time of estimation parameters
    ALL_DISTRIBUTIONS = [        
        st.alpha,st.anglit,st.arcsine,st.beta,st.betaprime,st.bradford,st.burr,st.cauchy,st.chi,st.chi2,st.cosine,
        st.dgamma,st.dweibull,st.erlang,st.expon,st.exponnorm,st.exponweib,st.exponpow,st.f,st.fatiguelife,st.fisk,
        st.foldcauchy,st.foldnorm, st.genlogistic,st.genpareto,st.gennorm,st.genexpon,
        st.genextreme,st.gausshyper,st.gamma,st.gengamma,st.genhalflogistic,st.gilbrat,st.gompertz,st.gumbel_r,
        st.gumbel_l,st.halfcauchy,st.halflogistic,st.halfnorm,st.halfgennorm,st.hypsecant,st.invgamma,st.invgauss,
        st.invweibull,st.johnsonsb,st.johnsonsu,st.ksone,st.kstwobign,st.laplace,st.levy,st.levy_l,
        st.logistic,st.loggamma,st.loglaplace,st.lognorm,st.lomax,st.maxwell,st.mielke,st.nakagami,st.ncx2,st.ncf,
        st.nct,st.norm,st.pareto,st.pearson3,st.powerlaw,st.powerlognorm,st.powernorm,st.rdist,st.reciprocal,
        st.rayleigh,st.rice,st.recipinvgauss,st.semicircular,st.t,st.triang,st.truncexpon,st.truncnorm,st.tukeylambda,
        st.uniform,st.vonmises,st.vonmises_line,st.wald,st.weibull_min,st.weibull_max,st.wrapcauchy
    ]
    
    MY_DISTRIBUTIONS = [st.beta, st.expon, st.norm, st.uniform, st.johnsonsb, st.gennorm, st.gausshyper]

    ## Calculae Histogram
    num_bins = danoes_formula(data)
    frequencies, bin_edges = np.histogram(data, num_bins, density=True)
    central_values = [(bin_edges[i] + bin_edges[i+1])/2 for i in range(len(bin_edges)-1)]

    results = {}
    for distribution in MY_DISTRIBUTIONS:
        ## Get parameters of distribution
        params = distribution.fit(data)
        
        ## Separate parts of parameters
        arg = params[:-2]
        loc = params[-2]
        scale = params[-1]
    
        ## Calculate fitted PDF and error with fit in distribution
        pdf_values = [distribution.pdf(c, loc=loc, scale=scale, *arg) for c in central_values]
        
        ## Calculate SSE (sum of squared estimate of errors)
        sse = np.sum(np.power(frequencies - pdf_values, 2.0))
        
        ## Build results and sort by sse
        results[distribution] = [sse, arg, loc, scale]
        
    results = {k: results[k] for k in sorted(results, key=results.get)}
    return results
        
def main():
    ## Import data
    data = pd.Series(sm.datasets.elnino.load_pandas().data.set_index('YEAR').values.ravel())
    results = fit_data(data)
    plot_histogram(data, results, 5)

if __name__ == "__main__":
    main()
    
    
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你想做更详细的分析,我推荐https://phitter.io


Mar*_*olt 6

虽然上面的许多答案都是完全有效的,但似乎没有人完全回答你的问题,特别是以下部分:

我不知道我是否正确,但为了确定概率,我认为我需要将我的数据拟合到最适合描述我的数据的理论分布。我认为需要某种拟合优度检验来确定最佳模型。

参数化方法

这是您描述的使用一些理论分布并将参数拟合到数据的过程,并且有一些很好的答案如何做到这一点。

非参数方法

但是,也可以使用非参数方法来解决您的问题,这意味着您根本不假设任何潜在的分布。

通过使用所谓的经验分布函数,该函数等于: Fn(x)= SUM( I[X<=x] ) / n。所以低于 x 的值的比例。

正如上述答案之一所指出的,您感兴趣的是逆 CDF(累积分布函数),它等于1-F(x)

可以证明,经验分布函数将收敛于生成数据的任何“真实”CDF。

此外,可以通过以下方式直接构建 1-alpha 置信区间:

L(X) = max{Fn(x)-en, 0}
U(X) = min{Fn(x)+en, 0}
en = sqrt( (1/2n)*log(2/alpha)
Run Code Online (Sandbox Code Playgroud)

那么对于所有 x 来说P( L(X) <= F(X) <= U(X) ) >= 1-alpha

我很惊讶PierrOz 的答案有 0 票,而它是使用非参数方法估计 F(x) 的问题的完全有效的答案。

请注意,您提到的对于任何 x>47 的 P(X>=x)=0 问题只是个人偏好,可能会导致您选择参数方法而不是非参数方法。然而,这两种方法对于您的问题都是完全有效的解决方案。

有关上述陈述的更多详细信息和证明,我建议您查看“所有统计:拉里·A·沃瑟曼(Larry A. Wasserman)撰写的统计推断简明课程”。一本关于参数和非参数推理的优秀书籍。

编辑: 由于您特别要求一些 python 示例,因此可以使用 numpy 来完成:

import numpy as np

def empirical_cdf(data, x):
    return np.sum(x<=data)/len(data)

def p_value(data, x):
    return 1-empirical_cdf(data, x)

# Generate some data for demonstration purposes
data = np.floor(np.random.uniform(low=0, high=48, size=30000))

print(empirical_cdf(data, 20))
print(p_value(data, 20)) # This is the value you're interested in
Run Code Online (Sandbox Code Playgroud)


eat*_*eat 5

AFAICU,您的分布是离散的(除了离散之外什么都没有)。因此,仅计算不同值的频率并对它们进行归一化就足以满足您的目的。因此,一个例子来证明这一点:

In []: values= [0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4]
In []: counts= asarray(bincount(values), dtype= float)
In []: cdf= counts.cumsum()/ counts.sum()
Run Code Online (Sandbox Code Playgroud)

因此,看到比1简单高的值的概率(根据互补累积分布函数(ccdf))

In []: 1- cdf[1]
Out[]: 0.40000000000000002
Run Code Online (Sandbox Code Playgroud)

请注意,ccdf生存函数(sf)密切相关,但它也用离散分布定义,而sf仅针对连续分布定义。


小智 5

我发现最简单的方法是使用 fitter 模块,您可以简单地pip install fitter. 您所要做的就是通过 pandas 导入数据集。它具有内置功能,可以从 scipy 搜索所有 80 个分布,并通过各种方法获得最适合数据的结果。例子:

f = Fitter(height, distributions=['gamma','lognorm', "beta","burr","norm"])
f.fit()
f.summary()
Run Code Online (Sandbox Code Playgroud)

作者在这里提供了一个发行版列表,因为扫描所有 80 个发行版可能非常耗时。

f.get_best(method = 'sumsquare_error')
Run Code Online (Sandbox Code Playgroud)

这将为您提供 5 个最佳分布及其拟合标准:

            sumsquare_error    aic          bic       kl_div
chi2             0.000010  1716.234916 -1945.821606     inf
gamma            0.000010  1716.234909 -1945.821606     inf
rayleigh         0.000010  1711.807360 -1945.526026     inf
norm             0.000011  1758.797036 -1934.865211     inf
cauchy           0.000011  1762.735606 -1934.803414     inf
Run Code Online (Sandbox Code Playgroud)

您还拥有包含distributions=get_common_distributions()大约 10 个最常用分布的属性,并为您拟合和检查它们。

它还具有许多其他功能,例如绘制直方图,并且可以在此处找到所有完整的文档。

对于科学家、工程师和一般人来说,这是一个被严重低估的模块。


Pie*_*rOz 4

将数据存储在字典中怎么样,其中键是 0 到 47 之间的数字,值是原始列表中相关键出现的次数?

因此,您的可能性 p(x) 将是大于 x 的键的所有值的总和除以 30000。

  • @s_sherly - 如果您可以更好地编辑和澄清您的问题,这可能是一件好事,因为实际上*“看到更大值的概率”* - 正如您所说 - **对于上面的值来说**为零池中的最高值。 (2认同)