अजगर भूखंड सामान्य वितरण


116

एक माध्य और एक विचरण को देखते हुए एक साधारण फ़ंक्शन कॉल है जो एक सामान्य वितरण की साजिश करेगा?

जवाबों:


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

mu = 0
variance = 1
sigma = math.sqrt(variance)
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, stats.norm.pdf(x, mu, sigma))
plt.show()

गैस डिस्ट्रो, मतलब 0 विचरण 1 है


मेरे पास इनलाइन विकल्प की इतनी आवश्यकता नहीं थी: %matplotlib inlineदिखाने के लिए प्लॉट प्राप्त करने के लिए
hum3

प्रतिवाद चेतावनी से बचने के लिए, अब आप का उपयोग करना चाहिए scipy.stats.norm.pdf(x, mu, sigma)बजायmlab.normpdf(x, mu, sigma)
लियोनार्डो गोंजालेज

इसके अतिरिक्त: mathजब आप पहले से आयात करते हैं numpyऔर उपयोग कर सकते हैं तो आप आयात क्यों करते हैं np.sqrt?
user8408080

1
@ user8408080: हालांकि प्रदर्शन यहां कोई समस्या नहीं है, मैं mathस्केलर ऑपरेशन के लिए उपयोग करना चाहता हूं , उदाहरण के लिए, स्केलर पर काम करते समय की math.sqrtतुलना में तेजी से अधिक np.sqrtहोता है।
अनटुबू

मैं 0 से 100 के बीच संख्याओं में वाई अक्ष को कैसे बदल सकता हूं?
हामिद

54

मुझे नहीं लगता कि कोई ऐसा कार्य है जो एक कॉल में होता है। हालाँकि आप गॉसियन प्रायिकता घनत्व फ़ंक्शन को देख सकते हैं scipy.stats

तो सबसे आसान तरीका है जो मैं आ सकता हूं:

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

# Plot between -10 and 10 with .001 steps.
x_axis = np.arange(-10, 10, 0.001)
# Mean = 0, SD = 2.
plt.plot(x_axis, norm.pdf(x_axis,0,2))
plt.show()

सूत्रों का कहना है:


2
आप शायद बदलना चाहिए norm.pdfकरने के लिए norm(0, 1).pdf। इससे अन्य मामलों को समायोजित करने में आसानी होती है / यह समझने के लिए कि यह एक यादृच्छिक चर का प्रतिनिधित्व करने वाली वस्तु उत्पन्न करता है।
मार्टिन थोमा

10

सीबॉर्न का उपयोग करें इसके बजाय मैं 1000 मूल्यों के माध्य = 5 एसटीडी = 3 के साथ सीबॉर्न के डिस्टलॉट का उपयोग कर रहा हूं

value = np.random.normal(loc=5,scale=3,size=1000)
sns.distplot(value)

आपको एक सामान्य वितरण वक्र मिलेगा


9

अनुत्तरित उत्तर सही है। लेकिन क्योंकि हमारा मतलब शून्य से कम या ज्यादा हो सकता है, मैं फिर भी इसे बदलना चाहूंगा:

x = np.linspace(-3 * sigma, 3 * sigma, 100)

इसके लिए :

x = np.linspace(-3 * sigma + mean, 3 * sigma + mean, 100)

5

यदि आप एक कदम से कदम दृष्टिकोण का उपयोग करना पसंद करते हैं तो आप इस तरह के समाधान पर विचार कर सकते हैं

import numpy as np
import matplotlib.pyplot as plt

mean = 0; std = 1; variance = np.square(std)
x = np.arange(-5,5,.01)
f = np.exp(-np.square(x-mean)/2*variance)/(np.sqrt(2*np.pi*variance))

plt.plot(x,f)
plt.ylabel('gaussian distribution')
plt.show()

1

मैं अभी इस पर वापस आया हूं और मुझे scipy को स्थापित करना था क्योंकि matplotlib.mlab ने मुझे MatplotlibDeprecationWarning: scipy.stats.norm.pdfऊपर दिए गए प्रयास करते समय त्रुटि संदेश दिया था । तो नमूना अब है:

%matplotlib inline
import math
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats


mu = 0
variance = 1
sigma = math.sqrt(variance)
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, scipy.stats.norm.pdf(x, mu, sigma))

plt.show()

1

मेरा मानना ​​है कि ऊंचाई तय करना महत्वपूर्ण है, इसलिए इस समारोह को बनाया:

def my_gauss(x, sigma=1, h=1, mid=0):
    from math import exp, pow
    variance = pow(sdev, 2)
    return h * exp(-pow(x-mid, 2)/(2*variance))

sigmaमानक विचलन कहाँ है, hऊँचाई है और midमाध्य है।

यहाँ विभिन्न ऊंचाइयों और विचलन का उपयोग करने का परिणाम है:

यहां छवि विवरण दर्ज करें


0

आप आसानी से cdf प्राप्त कर सकते हैं। इसलिए पीडीएफ पीडीएफ के माध्यम से

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

    def setGridLine(ax):
        #http://jonathansoma.com/lede/data-studio/matplotlib/adding-grid-lines-to-a-matplotlib-chart/
        ax.set_axisbelow(True)
        ax.minorticks_on()
        ax.grid(which='major', linestyle='-', linewidth=0.5, color='grey')
        ax.grid(which='minor', linestyle=':', linewidth=0.5, color='#a6a6a6')
        ax.tick_params(which='both', # Options for both major and minor ticks
                        top=False, # turn off top ticks
                        left=False, # turn off left ticks
                        right=False,  # turn off right ticks
                        bottom=False) # turn off bottom ticks

    data1 = np.random.normal(0,1,1000000)
    x=np.sort(data1)
    y=np.arange(x.shape[0])/(x.shape[0]+1)

    f2 = scipy.interpolate.interp1d(x, y,kind='linear')
    x2 = np.linspace(x[0],x[-1],1001)
    y2 = f2(x2)

    y2b = np.diff(y2)/np.diff(x2)
    x2b=(x2[1:]+x2[:-1])/2.

    f3 = scipy.interpolate.interp1d(x, y,kind='cubic')
    x3 = np.linspace(x[0],x[-1],1001)
    y3 = f3(x3)

    y3b = np.diff(y3)/np.diff(x3)
    x3b=(x3[1:]+x3[:-1])/2.

    bins=np.arange(-4,4,0.1)
    bins_centers=0.5*(bins[1:]+bins[:-1])
    cdf = scipy.stats.norm.cdf(bins_centers)
    pdf = scipy.stats.norm.pdf(bins_centers)

    plt.rcParams["font.size"] = 18
    fig, ax = plt.subplots(3,1,figsize=(10,16))
    ax[0].set_title("cdf")
    ax[0].plot(x,y,label="data")
    ax[0].plot(x2,y2,label="linear")
    ax[0].plot(x3,y3,label="cubic")
    ax[0].plot(bins_centers,cdf,label="ans")

    ax[1].set_title("pdf:linear")
    ax[1].plot(x2b,y2b,label="linear")
    ax[1].plot(bins_centers,pdf,label="ans")

    ax[2].set_title("pdf:cubic")
    ax[2].plot(x3b,y3b,label="cubic")
    ax[2].plot(bins_centers,pdf,label="ans")

    for idx in range(3):
        ax[idx].legend()
        setGridLine(ax[idx])

    plt.show()
    plt.clf()
    plt.close()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.