স্কিপি (পাইথন) দিয়ে তাত্ত্বিক বিষয়গুলিকে ফিরিয়ে দেওয়া অভিজ্ঞতামূলক বিতরণ?


139

ভূমিকা : আমার কাছে 0 থেকে 47 এর মধ্যে 30,000 এরও বেশি পূর্ণসংখ্যার মানগুলির একটি তালিকা রয়েছে, সমেত, যেমন [0,0,0,0,..,1,1,1,1,...,2,2,2,2,...,47,47,47,...]কিছু ধারাবাহিক বিতরণ থেকে নমুনাযুক্ত। তালিকার মানগুলি অগত্যা ক্রমযুক্ত নয়, তবে এই সমস্যার জন্য অর্ডার কোনও বিষয় নয়।

সমস্যা : আমার বিতরণের উপর ভিত্তি করে আমি কোনও প্রদত্ত মানের জন্য পি-মান (বৃহত্তর মান দেখার সম্ভাবনা) গণনা করতে চাই। উদাহরণস্বরূপ, আপনি দেখতে পাচ্ছেন যে 0 এর জন্য পি-মানটি 1 এর নিকটবর্তী হবে এবং উচ্চতর সংখ্যার জন্য পি-মান 0 হয়ে যাবে।

আমি সঠিক কিনা জানি না, তবে সম্ভাব্যতা নির্ধারণের জন্য আমার মনে হয় যে আমার ডেটাটিকে একটি তাত্ত্বিক বিতরণে ফিট করতে হবে যা আমার ডেটা বর্ণনা করার জন্য সবচেয়ে উপযুক্ত। আমি ধরে নিলাম সেরা মডেল নির্ধারণের জন্য ফিট পরীক্ষার এক ধরণের ধার্মিকতা প্রয়োজন।

পাইথন ( Scipyবা Numpy) এ জাতীয় বিশ্লেষণ কার্যকর করার কোনও উপায় আছে কি ? আপনি কোন উদাহরণ উপস্থাপন করতে পারেন?

ধন্যবাদ!


2
আপনার কাছে কেবল আলাদা আলাদা অভিজ্ঞতা সম্পন্ন মান রয়েছে তবে অবিচ্ছিন্ন বন্টন চান? আমি কি এটি সঠিকভাবে বুঝতে পারি?
মাইকেল জে বারবার

1
এটা অযৌক্তিক মনে হচ্ছে। সংখ্যাগুলি কী উপস্থাপন করে? সীমিত নির্ভুলতার সাথে পরিমাপ?
মাইকেল জে বারবার

1
মাইকেল, আমি ব্যাখ্যা কি সংখ্যার আমার আগের প্রশ্নে প্রতিনিধিত্ব: stackoverflow.com/questions/6615489/...
s_sherly

6
এটা গণনা তথ্য। এটি অবিচ্ছিন্ন বিতরণ নয়।
মাইকেল জে। বারবার

1
এই প্রশ্নের গৃহীত উত্তর চেক করুন stackoverflow.com/questions/48455018/…
আহমদ সুলিমান

উত্তর:


209

স্কয়ার ত্রুটির যোগফলের সাথে বিতরণ ফিটিং (এসএসই)

এটি সৌলোর উত্তরের একটি আপডেট এবং পরিবর্তন , যা বর্তমান scipy.statsবিতরণগুলির সম্পূর্ণ তালিকা ব্যবহার করে এবং বিতরণের হিস্টোগ্রাম এবং ডেটা হিস্টোগ্রামের মধ্যে অন্তত এসএসই দিয়ে বিতরণটি প্রদান করে।

ফিটিং উদাহরণ

এর থেকে এল নিনোর ডেটাসেট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')

2
অসাধারণ. ব্যবহার করার কথা বিবেচনা density=Trueপরিবর্তে normed=Trueমধ্যে np.histogram()। ^^
পেক

1
@tmthydvnprt হয়তো আপনি .plot()ভবিষ্যতের বিভ্রান্তি এড়ানোর জন্য পদ্ধতিগুলির পরিবর্তনগুলি পূর্বাবস্থায়িত করতে পারেন । ^^
পেক

10
বন্টন নাম পেতে: from scipy.stats._continuous_distns import _distn_names। তারপরে আপনি _distn_names` এ getattr(scipy.stats, distname)প্রত্যেকের মতো কিছু ব্যবহার করতে পারেন distname` দরকারী কারণ বিতরণগুলি বিভিন্ন স্কাইপি সংস্করণ সহ আপডেট হয়।
ব্র্যাড সলোমন

1
আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এই কোডটি কেবলমাত্র অবিচ্ছিন্ন বিতরণগুলির জন্য উপযুক্ত ফিটগুলির জন্য পরীক্ষা করে, এবং পৃথক বা বহুবিধ বিতরণগুলির জন্য পরীক্ষা করতে পারে না। ধন্যবাদ.
অ্যাডাম শ্রয়েডার

6
খুব ঠান্ডা. আমাকে রঙের প্যারামিটারটি আপডেট করতে হয়েছিল -ax = data.plot(kind='hist', bins=50, normed=True, alpha=0.5, color=list(matplotlib.rcParams['axes.prop_cycle'])[1]['color'])
বাসওয়ভেস

147

আছে 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()

তথ্যসূত্র:

- ফিটিং বিতরণ, ফিটের ধার্মিকতা, পি-মান। স্কিপি (পাইথন) দিয়ে এটি করা কি সম্ভব?

- স্কিপি সঙ্গে বিতরণ ফিটিং

এবং এখানে স্কিপি 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?
আলোহা

3
আপনি যদি সমস্ত বিতরণ দেখতে দেখতে চান বা সেগুলি কীভাবে অ্যাক্সেস করবেন সে সম্পর্কে কোনও ধারণার জন্য আপনি এই উত্তরটি দেখুন ।
tmthydvnprt

@ সালোলো কাস্ট্রো ডিস্ট.ফিটের আউটপুটে প্যারামের তিনটি মান কী উপস্থাপন করে
শেফালি গুপ্ত

2
বন্টন নাম পেতে: from scipy.stats._continuous_distns import _distn_names। তারপরে আপনি _distn_names` এ getattr(scipy.stats, distname)প্রত্যেকের মতো কিছু ব্যবহার করতে পারেন distname` দরকারী কারণ বিতরণগুলি বিভিন্ন স্কাইপি সংস্করণ সহ আপডেট হয়।
ব্র্যাড সলোমন

1
আমি কোড থেকে রঙ = 'ডাব্লু' মুছে ফেলতাম নইলে হিস্টগ্রাম প্রদর্শিত হয় না।
ইরান

12

fit()@ সালোলো কাস্ত্রো দ্বারা উল্লিখিত পদ্ধতিটি সর্বাধিক সম্ভাবনার প্রাক্কলন (এমএলই) সরবরাহ করে। আপনার ডেটা-র জন্য সর্বোত্তম বিতরণ হ'ল যা আপনাকে সর্বোচ্চ দেয় তা বিভিন্ন বিভিন্ন উপায়ে নির্ধারণ করা যায়: যেমন

1, যা আপনাকে সর্বোচ্চ লগ সম্ভাবনা দেয়।

2, এটি আপনাকে সবচেয়ে ছোট এআইসি, বিআইসি বা বিআইসিসি মান দেয় (উইকি দেখুন: http://en.wikedia.org/wiki/Akaike_information_criterion , মূলত পরামিতিগুলির সংখ্যার জন্য সামঞ্জস্য করা লগ সম্ভাবনা হিসাবে দেখা যায়, আরও বেশি বিতরণ হিসাবে পরামিতিগুলি আরও ভাল ফিট হবে বলে আশা করা হচ্ছে)

3, যা বেয়েশিয়ার উত্তরোত্তর সম্ভাবনা সর্বাধিক করে তোলে। (উইকি দেখুন: http://en.wikedia.org/wiki/Posterior_probability )

অবশ্যই, যদি আপনার ইতিমধ্যে এমন একটি বিতরণ থাকে যা আপনার ডেটা বর্ণনা করে (আপনার নির্দিষ্ট ক্ষেত্রের তত্ত্বগুলির উপর ভিত্তি করে) এবং এটিতে আঁকতে চায় তবে আপনি সেরা ফিট বিতরণ সনাক্তকরণের পদক্ষেপটি এড়িয়ে যাবেন।

scipyলগের সম্ভাবনা গণনা করার জন্য কোনও ফাংশন নিয়ে আসে না (যদিও এমএলই পদ্ধতিটি সরবরাহ করা হয়) তবে হার্ড কোড একটি সহজ: দেখুন user scipy.stat.distribferences- এর বিল্ট-ইন সম্ভাব্যতা ঘনত্ব ফাংশনগুলি কোনও ব্যবহারকারী সরবরাহ করা চেয়ে ধীর?


1
ডেটা বিন্যাস করা হয়েছে এমন পরিস্থিতিতে আমি এই পদ্ধতিটি কীভাবে প্রয়োগ করব - এটি ডেটা থেকে কোনও হিস্টগ্রাম তৈরি করার চেয়ে ইতিমধ্যে একটি হিস্টোগ্রাম?
পিট

@ পেট, এটি অন্তর-সেন্সর করা তথ্যের পরিস্থিতি হবে, এর সর্বাধিক সম্ভাবনা পদ্ধতি রয়েছে, তবে বর্তমানে এটি কার্যকর করা হয়নিscipy
সিটি ঝু

প্রমাণটি ভুলে যাবেন না
jtlz2

5

আফিকা, আপনার বিতরণ পৃথক (এবং পৃথক ছাড়া কিছুই নয়)। তাই কেবলমাত্র বিভিন্ন মানগুলির ফ্রিকোয়েন্সি গণনা করা এবং সেগুলিকে সাধারণীকরণ করা আপনার উদ্দেশ্যগুলির জন্য যথেষ্ট। সুতরাং, এটি প্রদর্শন করার জন্য একটি উদাহরণ:

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সহজভাবে হয় ( পরিপূরক ক্রমবর্ধমান বিতরণ ফাংশন অনুযায়ী (সিসিডিএফ)) :

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

দয়া করে মনে রাখবেন যে সিসিডিএফ বেঁচে থাকার ফাংশন (এসএফ) এর সাথে ঘনিষ্ঠভাবে সম্পর্কিত , তবে এটি পৃথক বিতরণের সাথে সংজ্ঞায়িতও হয়েছে, যেখানে এসএফ কেবল সংযুক্ত বিতরণের জন্যই সংজ্ঞায়িত করা হয়।


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-gaશિયન-kernel-density.html দেখুন


1
ভবিষ্যতের পাঠকদের জন্য: এই সমাধানটি (বা কমপক্ষে ধারণাটি) ওপিএস প্রশ্নের সহজ উত্তর প্রদান করে ('পি-মানটি কী') - এটি জেনে রাখা আকর্ষণীয় হবে যে এটি কীভাবে আরও কিছু জড়িত পদ্ধতির সাথে খাপ খায়? একটি পরিচিত বিতরণ।
গ্রেগ

গাউসিয়ান কার্নেল রিগ্রেশনগুলি সমস্ত বিতরণের জন্য কাজ করে?

@ মিমি একটি সাধারণ নিয়ম হিসাবে, সমস্ত বিতরণের জন্য কোনও পদক্ষেপ কাজ করে না। যদিও তারা খারাপ নয়
পরিবেশবিদ 18

2

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 দিয়েছেন মানদণ্ড ব্যবহার করেন। এটি কারণ কারণ এই মানদণ্ডে আরও বেশি পরামিতি রয়েছে এমন বিতরণগুলিতে খুব বেশি সুবিধা দেয় না। প্রকৃতপক্ষে, যদি কোনও বিতরণের আরও বেশি পরামিতি থাকে, তবে লাগানো বিতরণটির জন্য ডেটার আরও কাছাকাছি হওয়া আরও সহজ। তদুপরি, কোলমোগোরভ-স্মারনভ এই ক্ষেত্রে অর্থবোধ করতে পারে না, কারণ পরিমাপক মানগুলিতে একটি ক্ষুদ্র ত্রুটি পি-মানটির উপর বিশাল প্রভাব ফেলবে।

প্রক্রিয়াটি চিত্রিত করার জন্য, আমি এল-নিনো ডেটা লোড করি, যার মধ্যে 1950 থেকে 2010 পর্যন্ত 732 মাসিক তাপমাত্রা পরিমাপ রয়েছে:

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

GetContinuousUniVariateFactoriesস্থির পদ্ধতিতে বিতরণের বিল্ট-ইন ইউনিভরিয়াট কারখানাগুলির 30 টি পাওয়া সহজ । একবার হয়ে গেলে, BestModelBICস্থির পদ্ধতিটি সেরা মডেল এবং সংশ্লিষ্ট বিআইসির স্কোরটি প্রদান করে।

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)

এটি উত্পাদন করে:

বিটা এল-নিনোর তাপমাত্রায় ফিট করে

এই বিষয়ে আরও বিশদটি BestModelBIC ডকটিতে উপস্থাপন করা হয়েছে । এটা Scipy বন্টন অন্তর্ভুক্ত করা সম্ভব হবে SciPyDistribution বা এমনকি সঙ্গে ChaosPy ডিস্ট্রিবিউশন সঙ্গে ChaosPyDistribution , কিন্তু আমি যা বর্তমান স্ক্রিপ্ট পরিপূর্ণ সবচেয়ে বাস্তব উদ্দেশ্যে অনুমান।


2
আপনি সম্ভবত একটি আগ্রহ ঘোষণা করা উচিত?
jtlz2

0

যদি আমি আপনার প্রয়োজনীয়তা বুঝতে না পারি তবে আমাকে ক্ষমা করুন তবে একটি অভিধানে আপনার ডেটা সংরক্ষণ করার কী যেখানে কীগুলি 0 এবং 47 এর মধ্যে নম্বর হবে এবং আপনার মূল তালিকায় তাদের সম্পর্কিত কীগুলির সংখ্যার মানকে মূল্য দেবে?
সুতরাং আপনার সম্ভাবনা পি (x) 30000 দ্বারা বিভক্ত x এর চেয়ে বেশি কীগুলির জন্য সমস্ত মানের যোগফল হবে।


এই ক্ষেত্রে পি (এক্স) 47 এর চেয়ে বেশি মানের জন্য সমান (সমান 0) হবে I আমার একটি অবিচ্ছিন্ন সম্ভাবনা বন্টন দরকার।
s_sherly

2
@s_sherly - এটি সম্ভবত একটি ভাল জিনিস হবে যদি আপনি সম্পাদনা করতে এবং আপনার প্রশ্ন সবচেয়ে ভালো নির্মল করতে পারে, প্রকৃতপক্ষে যেমন "বৃহত্তর মান এইজন্য সম্ভাবনা" - হিসাবে আপনি এটা করা - IS যে পুল সর্বোচ্চ মান উপরে হয় শূন্য মানের জন্য ।
ম্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.