অজগর প্লট সাধারণ বিতরণ


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?
ব্যবহারকারী 8408080

1
@ ইউজার ৮৪০৮০৮০: যদিও এখানে পারফরম্যান্স কোনও সমস্যা নয় তবে আমি mathস্কেলার অপারেশনের জন্য ব্যবহার করার প্রবণতা দেখছি , উদাহরণস্বরূপ, স্কেলারগুলিতে অপারেটিংয়ের math.sqrtচেয়ে বেশি মাত্রায় দ্রুত np.sqrt
আনতুবু

আমি কীভাবে Y অক্ষগুলি 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

আমি ঠিক এখানে ফিরে এসেছি এবং matplotlib হিসাবে আমাকে স্কিপি ইনস্টল করতে হয়েছিল m 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গড় mean

বিভিন্ন উচ্চতা এবং বিচ্যুতি ব্যবহার করে এখানে ফলাফল:

এখানে চিত্র বর্ণনা লিখুন


0

আপনি সহজেই সিডিএফ পেতে পারেন। সিডিএফ এর মাধ্যমে পিডিএফ

    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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.