phân phối chuẩn của âm mưu python


116

Với một giá trị trung bình và một phương sai, có một lệnh gọi hàm đơn giản sẽ vẽ biểu đồ phân phối chuẩn không?

Câu trả lời:


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

gass ​​distro, trung bình là 0 phương sai 1


Tôi không có tùy chọn nội tuyến khi cần thiết: %matplotlib inlineđể làm cho cốt truyện hiển thị
hum3

Để tránh cảnh báo deprecation, bây giờ bạn nên sử dụng scipy.stats.norm.pdf(x, mu, sigma)thay vìmlab.normpdf(x, mu, sigma)
Leonardo Gonzalez

Ngoài ra: Tại sao bạn nhập mathkhi bạn đã nhập numpyvà có thể sử dụng np.sqrt?
user8408080

1
@ user8408080: Mặc dù hiệu suất không phải là vấn đề ở đây, nhưng tôi có xu hướng sử dụng mathcho các hoạt động vô hướng vì ví dụ, math.sqrtnhanh hơn một độ lớn so với np.sqrtkhi hoạt động trên vô hướng.
unutbu

Làm cách nào để thay đổi trục Y thành các số từ 0 đến 100?
Hamid

54

Tôi không nghĩ rằng có một chức năng thực hiện tất cả những điều đó trong một lần gọi. Tuy nhiên, bạn có thể tìm thấy hàm mật độ xác suất Gaussian trongscipy.stats .

Vì vậy, cách đơn giản nhất mà tôi có thể nghĩ ra là:

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

Nguồn:


2
Bạn có thể nên thay đổi norm.pdfthành norm(0, 1).pdf. Điều này giúp dễ dàng điều chỉnh các trường hợp khác / hiểu rằng điều này tạo ra một đối tượng đại diện cho một biến ngẫu nhiên.
Martin Thoma

10

Sử dụng seaborn thay vì tôi đang sử dụng distplot của seaborn với giá trị trung bình = 5 std = 3/1000

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

Bạn sẽ nhận được một đường cong phân phối chuẩn


9

Câu trả lời của Unutbu là đúng. Nhưng vì giá trị trung bình của chúng tôi có thể lớn hơn hoặc nhỏ hơn 0, tôi vẫn muốn thay đổi điều này:

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

đến điều này:

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

5

Nếu bạn thích sử dụng phương pháp tiếp cận từng bước, bạn có thể xem xét một giải pháp như sau

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

Tôi vừa quay lại điều này và tôi đã phải cài đặt scipy vì matplotlib.mlab đã đưa cho tôi thông báo lỗi MatplotlibDeprecationWarning: scipy.stats.norm.pdfkhi thử ví dụ ở trên. Vì vậy, mẫu bây giờ là:

%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

Tôi tin rằng điều quan trọng là đặt chiều cao, vì vậy đã tạo hàm này:

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

Đâu sigmalà độ lệch chuẩn, hlà chiều cao và midlà giá trị trung bình.

Đây là kết quả sử dụng các độ cao và độ lệch khác nhau:

nhập mô tả hình ảnh ở đây


0

bạn có thể lấy cdf dễ dàng. so pdf qua 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.