เหมาะสมกับการกระจายเชิงประจักษ์กับทฤษฎีด้วย Scipy (Python)?


139

คำนำ : ฉันมีรายการค่าจำนวนเต็มมากกว่า 30,000 ค่าตั้งแต่ 0 ถึง 47 โดยรวม[0,0,0,0,..,1,1,1,1,...,2,2,2,2,...,47,47,47,...]ตัวอย่างจากตัวอย่างจากการแจกแจงแบบต่อเนื่อง ค่าในรายการไม่จำเป็นต้องเป็นไปตามลำดับ แต่คำสั่งซื้อไม่สำคัญสำหรับปัญหานี้

ปัญหา : ตามการแจกแจงของฉันฉันต้องการคำนวณค่า p (ความน่าจะเป็นที่จะเห็นค่ามากขึ้น) สำหรับค่าใด ๆ ตัวอย่างเช่นคุณสามารถดูค่า p สำหรับ 0 จะเข้าใกล้ 1 และ p-value สำหรับตัวเลขที่สูงขึ้นจะมีแนวโน้มเป็น 0

ฉันไม่รู้ว่าฉันถูกต้องหรือไม่ แต่เพื่อกำหนดความน่าจะเป็นฉันคิดว่าฉันต้องใส่ข้อมูลของฉันให้เหมาะกับการแจกแจงเชิงทฤษฎีที่เหมาะสมที่สุดในการอธิบายข้อมูลของฉัน ฉันคิดว่าจำเป็นต้องมีการทดสอบความพอดีบางประเภทเพื่อกำหนดรูปแบบที่ดีที่สุด

มีวิธีดำเนินการวิเคราะห์เช่นนี้ใน Python ( ScipyหรือNumpy) หรือไม่? คุณสามารถนำเสนอตัวอย่างใด ๆ

ขอบคุณ!


2
คุณมีค่าเชิงประจักษ์โดยสิ้นเชิง แต่ต้องการกระจายอย่างต่อเนื่องหรือไม่ ฉันเข้าใจถูกต้องหรือไม่
Michael J. Barber

1
ดูเหมือนไร้สาระ ตัวเลขแสดงถึงอะไร? การวัดที่มีความแม่นยำ จำกัด ?
Michael J. Barber

1
ไมเคิลฉันอธิบายสิ่งที่ตัวเลขแสดงในคำถามก่อนหน้าของฉัน: stackoverflow.com/questions/6615489/…
s_sherly

6
นั่นคือการนับข้อมูล มันไม่ใช่การกระจายอย่างต่อเนื่อง
Michael J. Barber

1
ตรวจสอบคำตอบที่ยอมรับสำหรับคำถามนี้stackoverflow.com/questions/48455018/…
Ahmad Suliman

คำตอบ:


209

การกระจายที่เหมาะสมกับผลรวมของข้อผิดพลาดแบบสี่เหลี่ยม (SSE)

นี่คือการอัปเดตและแก้ไขคำตอบของ Saulloซึ่งใช้รายการทั้งหมดของการscipy.statsแจกแจงปัจจุบันและคืนค่าการกระจายด้วยSSEน้อยที่สุดระหว่างฮิสโตแกรมของการแจกแจงและฮิสโตแกรมของข้อมูล

ฟิตติ้งตัวอย่าง

การใช้ชุดข้อมูล El Niñostatsmodelsจะเป็นการแจกแจงแบบพอดีและมีการกำหนดข้อผิดพลาด การแจกแจงที่มีข้อผิดพลาดน้อยที่สุดจะถูกส่งคืน

การแจกแจงทั้งหมด

การแจกแจงติดตั้งทั้งหมด

การกระจายพอดีที่ดีที่สุด

การกระจายพอดีที่ดีที่สุด

รหัสตัวอย่าง

%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')

2
น่ากลัว พิจารณาใช้density=Trueแทนในnormed=True np.histogram()^^
Peque

1
@tmthydvnprt บางทีคุณอาจยกเลิกการเปลี่ยนแปลง.plot()วิธีการเพื่อหลีกเลี่ยงความสับสนในอนาคต ^^
Peque

10
ในการรับชื่อการแจกจ่าย: from scipy.stats._continuous_distns import _distn_names. จากนั้นคุณสามารถใช้สิ่งที่ชอบgetattr(scipy.stats, distname)สำหรับแต่ละรายการdistnameใน _distn_names` มีประโยชน์เนื่องจากมีการอัปเดตการแจกแจงด้วย SciPy รุ่นต่างๆ
แบรดโซโลมอน

1
คุณช่วยอธิบายได้ไหมว่าทำไมรหัสนี้ถึงตรวจสอบว่ามีการแจกแจงแบบต่อเนื่องที่ดีที่สุดเท่านั้นและไม่สามารถตรวจสอบการแจกแจงแบบแยกหรือหลายตัวแปรได้ ขอบคุณ.
Adam Schroeder

6
เด็ดมาก ฉันต้องอัปเดตพารามิเตอร์สี -ax = data.plot(kind='hist', bins=50, normed=True, alpha=0.5, color=list(matplotlib.rcParams['axes.prop_cycle'])[1]['color'])
basswaves

147

มี82 ฟังก์ชั่นการใช้งานในการกระจาย SciPy 0.12.0 คุณสามารถทดสอบว่าบางส่วนของพวกเขาพอดีกับข้อมูลของคุณโดยใช้ของพวกเขาวิธีการ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()

อ้างอิง:

- การกระจายตัวที่เหมาะสม, ความดีของความพอดี, ค่า 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'] 

7
เกิดอะไรขึ้นถ้าnormed = Trueในการวางแผนฮิสโตแกรม คุณจะไม่คูณpdf_fittedด้วยsizeใช่มั้ย
aloha

3
ดูคำตอบนี้หากคุณต้องการดูว่าการกระจายทั้งหมดมีลักษณะอย่างไรหรือสำหรับแนวคิดในการเข้าถึงทั้งหมด
tmthydvnprt

@SaulloCastro ค่า 3 ใน param แสดงถึงอะไรในผลลัพธ์ของ dist.fit
shaifali Gupta

2
ในการรับชื่อการแจกจ่าย: from scipy.stats._continuous_distns import _distn_names. จากนั้นคุณสามารถใช้สิ่งที่ชอบgetattr(scipy.stats, distname)สำหรับแต่ละรายการdistnameใน _distn_names` มีประโยชน์เนื่องจากมีการอัปเดตการแจกแจงด้วย SciPy รุ่นต่างๆ
แบรดโซโลมอน

1
ฉันจะลบ color = 'w' ออกจากโค้ดไม่เช่นนั้นฮิสโตแกรมจะไม่แสดง
Eran

12

fit()วิธีการที่กล่าวถึงโดย @Saullo Castro ให้การประมาณการความเป็นไปได้สูงสุด (MLE) การกระจายที่ดีที่สุดสำหรับข้อมูลของคุณคือสิ่งที่ให้คุณได้มากที่สุดสามารถกำหนดได้หลายวิธีเช่น:

1 หนึ่งที่ให้โอกาสสูงสุดในการเข้าสู่ระบบ

2 สิ่งที่ให้ค่า AIC, BIC หรือ BICc ที่เล็กที่สุดของคุณ (ดู wiki: http://en.wikipedia.org/wiki/Akaike_information_criterionโดยทั่วไปสามารถดูได้ว่ามีการปรับความน่าจะเป็นบันทึกสำหรับพารามิเตอร์หลายตัวเช่นเดียวกับการกระจายที่มีมากขึ้น พารามิเตอร์คาดว่าจะพอดีดีกว่า)

3 หนึ่งที่เพิ่มความน่าจะเป็นหลังเบย์ (ดูวิกิ: http://en.wikipedia.org/wiki/Posterior_probability )

แน่นอนถ้าคุณมีการแจกแจงที่ควรอธิบายข้อมูลของคุณ (ตามทฤษฎีในสาขาเฉพาะของคุณ) และต้องการที่จะยึดติดกับสิ่งนั้นคุณจะข้ามขั้นตอนของการระบุการกระจายแบบที่ดีที่สุด

scipyไม่ได้มาพร้อมกับฟังก์ชั่นในการคำนวณความน่าจะเป็นของบันทึก (แม้ว่าจะมีวิธี MLE ไว้ให้) แต่โค้ดที่ยากนั้นง่าย: ดูฟังก์ชันความหนาแน่นของความน่าจะเป็นบิวด์อินของ scipy.stat.distribution นั้นช้ากว่าที่ผู้ใช้ระบุหรือไม่


1
ฉันจะใช้วิธีนี้กับสถานการณ์ที่ข้อมูลได้รับการโค้งเรียบร้อยแล้ว - นั่นคือฮิสโตแกรมมากกว่าการสร้างฮิสโตแกรมจากข้อมูล
Pete

@pete ซึ่งจะเป็นสถานการณ์ของข้อมูลที่มีการตรวจสอบช่วงเวลามีวิธีการที่น่าจะเป็นไปได้สูงสุด แต่ขณะนี้ยังไม่ได้ใช้งานในscipy
CT Zhu

อย่าลืมหลักฐาน
jtlz2

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()

ดังนั้นความน่าจะเป็นที่จะเห็นค่าสูงกว่า1ง่าย (อ้างอิงจากฟังก์ชันการแจกแจงสะสมเสริม (ccdf) :

In []: 1- cdf[1]
Out[]: 0.40000000000000002

โปรดทราบว่าccdfนั้นเกี่ยวข้องกับฟังก์ชั่นการอยู่รอด (sf)แต่มันก็ถูกนิยามด้วยดิสทริบิวชันแบบไม่ต่อเนื่องเอสเอฟถูกกำหนดไว้สำหรับการแจกแจงแบบต่อเนื่องเท่านั้น


2

ดูเหมือนปัญหาการประมาณความหนาแน่นของความน่าจะเป็นสำหรับฉัน

from scipy.stats import gaussian_kde
occurences = [0,0,0,0,..,1,1,1,1,...,2,2,2,2,...,47]
values = range(0,48)
kde = gaussian_kde(map(float, occurences))
p = kde(values)
p = p/sum(p)
print "P(x>=1) = %f" % sum(p[1:])

ดูhttp://jpktd.blogspot.com/2009/03/using-gaussian-kernel-density.htmlด้วย


1
สำหรับผู้อ่านในอนาคต: การแก้ปัญหานี้ (หรืออย่างน้อยความคิด) ให้คำตอบที่ง่ายที่สุดสำหรับคำถาม OPs ('ค่า p' คืออะไร) - มันน่าสนใจที่จะรู้ว่าวิธีนี้เปรียบเทียบกับวิธีการที่เกี่ยวข้องมากขึ้นบางวิธีที่เหมาะสม การกระจายที่รู้จัก
เกร็ก

การถดถอยของเคอร์เนลเกาส์เซียนทำงานได้สำหรับการแจกแจงทั้งหมดหรือไม่

@mikey ตามกฎทั่วไปการถดถอยไม่ทำงานสำหรับการแจกแจงทั้งหมด พวกเขาไม่เลวเลย
อนุรักษ์สิ่งแวดล้อม

2

ลอง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()

ป้อนคำอธิบายรูปภาพที่นี่

# 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()

แบบที่ดีที่สุด

โปรดทราบว่าในกรณีนี้คะแนนทั้งหมดจะมีความสำคัญเนื่องจากการกระจายแบบสม่ำเสมอ คุณสามารถกรองด้วย dist.y_pred หากต้องการ


1

ด้วยOpenTURNSฉันจะใช้เกณฑ์ BIC เพื่อเลือกการกระจายที่ดีที่สุดที่เหมาะกับข้อมูลดังกล่าว นี่เป็นเพราะเกณฑ์นี้ไม่ให้ประโยชน์มากเกินไปกับการแจกแจงที่มีพารามิเตอร์มากกว่า แน่นอนถ้าการกระจายมีพารามิเตอร์มากขึ้นมันจะง่ายกว่าสำหรับการกระจายการติดตั้งที่จะใกล้ชิดกับข้อมูล ยิ่งไปกว่านั้น Kolmogorov-Smirnov อาจไม่สมเหตุสมผลในกรณีนี้เนื่องจากข้อผิดพลาดเล็กน้อยในค่าที่วัดได้จะมีผลกระทบอย่างมากต่อค่า p-value

เพื่อแสดงให้เห็นถึงกระบวนการฉันโหลดข้อมูล El-Nino ซึ่งมีการวัดอุณหภูมิ 732 ครั้งต่อเดือนจากปี 1950 ถึง 2010:

import statsmodels.api as sm
dta = sm.datasets.elnino.load_pandas().data
dta['YEAR'] = dta.YEAR.astype(int).astype(str)
dta = dta.set_index('YEAR').T.unstack()
data = dta.values

มันง่ายที่จะได้รับ 30 ของโรงงาน univariate ของการกระจายด้วยGetContinuousUniVariateFactoriesวิธีคงที่ เมื่อเสร็จสิ้นแล้วBestModelBICวิธีการคงที่จะส่งกลับแบบจำลองที่ดีที่สุดและคะแนน BIC ที่สอดคล้องกัน

sample = ot.Sample(data, 1)
tested_factories = ot.DistributionFactory.GetContinuousUniVariateFactories()
best_model, best_bic = ot.FittingTest.BestModelBIC(sample,
                                                   tested_factories)
print("Best=",best_model)

ซึ่งพิมพ์:

Best= Beta(alpha = 1.64258, beta = 2.4348, a = 18.936, b = 29.254)

เพื่อเปรียบเทียบความพอดีของกราฟกับกราฟฉันใช้drawPDFวิธีการกระจายตัวที่ดีที่สุด

import openturns.viewer as otv
graph = ot.HistogramFactory().build(sample).drawPDF()
bestPDF = best_model.drawPDF()
bestPDF.setColors(["blue"])
graph.add(bestPDF)
graph.setTitle("Best BIC fit")
name = best_model.getImplementation().getClassName()
graph.setLegends(["Histogram",name])
graph.setXTitle("Temperature (°C)")
otv.View(graph)

สิ่งนี้ผลิต:

เบต้าเหมาะสมกับอุณหภูมิ El-Nino

รายละเอียดเพิ่มเติมเกี่ยวกับหัวข้อนี้จะนำเสนอในเอกสารBestModelBIC มันอาจเป็นไปได้ที่จะรวมการกระจาย Scipy ในSciPyDistributionหรือแม้กระทั่งกับการแจกแจง ChaosPy กับChaosPyDistributionแต่ฉันเดาว่าสคริปต์ปัจจุบันตอบสนองวัตถุประสงค์ในการปฏิบัติมากที่สุด


2
คุณควรจะประกาศความสนใจหรือไม่?
jtlz2

0

ยกโทษให้ฉันถ้าฉันไม่เข้าใจความต้องการของคุณ แต่สิ่งที่เกี่ยวกับการจัดเก็บข้อมูลของคุณในพจนานุกรมที่ปุ่มจะเป็นตัวเลขระหว่าง 0 และ 47 และค่าจำนวนการเกิดขึ้นของคีย์ที่เกี่ยวข้องในรายการต้นฉบับของคุณ?
ดังนั้นโอกาสที่คุณจะได้ p (x) จะเป็นผลรวมของค่าทั้งหมดสำหรับคีย์ที่มากกว่า x หารด้วย 30000


ในกรณีนี้ p (x) จะเท่ากัน (เท่ากับ 0) สำหรับค่าใด ๆ ที่มากกว่า 47 ฉันต้องการการแจกแจงความน่าจะเป็นแบบต่อเนื่อง
s_sherly

2
@s_sherly - มันอาจจะเป็นสิ่งที่ดีถ้าคุณสามารถแก้ไขและชี้แจงคำถามของคุณได้ดีขึ้นเนื่องจาก"ความน่าจะเป็นที่จะเห็นค่ามากขึ้น" - ตามที่คุณใส่ไว้ - เป็นศูนย์สำหรับค่าที่สูงกว่าค่าสูงสุดในกลุ่ม .
mac
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.