Làm thế nào để tính toán phân phối chuẩn tắc tích lũy?


99

Tôi đang tìm kiếm một hàm trong Numpy hoặc Scipy (hoặc bất kỳ thư viện Python nghiêm ngặt nào) sẽ cung cấp cho tôi hàm phân phối chuẩn tích lũy trong Python.

Câu trả lời:


125

Đây là một ví dụ:

>>> from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

Nói cách khác, khoảng 95% khoảng thông thường chuẩn nằm trong hai độ lệch chuẩn, tập trung vào giá trị trung bình chuẩn bằng 0.

Nếu bạn cần CDF nghịch đảo:

>>> norm.ppf(norm.cdf(1.96))
array(1.9599999999999991)

9
Ngoài ra, bạn có thể chỉ định giá trị trung bình (loc) và phương sai (tỷ lệ) làm tham số. ví dụ, d = chuẩn (loc = 10.0, scale = 2.0); d.cdf (12.0); Thông tin chi tiết tại đây: docs.scipy.org/doc/scipy-0.14.0/reference/generated/…
Irvan

6
@Irvan, tham số tỷ lệ thực sự là độ lệch chuẩn, KHÔNG PHẢI là phương sai.
qkhhly

2
Tại sao scipy đặt tên chúng là locscale? Tôi đã sử dụng help(norm.ppf)nhưng sau đó những gì heck là locscale- cần một sự giúp đỡ cho sự giúp đỡ ..
javadba

2
@javadba - vị trí và tỷ lệ là các thuật ngữ chung hơn trong thống kê được sử dụng để tham số hóa một loạt các phân phối. Đối với phân phối chuẩn, chúng xếp hàng với giá trị trung bình và sd, nhưng không phải như vậy đối với các phân phối khác.
Michael Ohlrogge

1
@MichaelOhlrogge. Cám ơn! Đây là một trang từ NIST giải thích thêm về itl.nist.gov/div898/handbook/eda/section3/eda364.htm
javadba

40

Có thể đã quá muộn để trả lời câu hỏi nhưng vì Google vẫn dẫn dắt mọi người ở đây, tôi quyết định viết giải pháp của mình ở đây.

Tức là, kể từ Python 2.7, maththư viện đã tích hợp hàm lỗimath.erf(x)

Các erf()chức năng có thể được sử dụng để tính toán các chức năng thống kê truyền thống như phân phối chuẩn chuẩn tích lũy:

from math import *
def phi(x):
    #'Cumulative distribution function for the standard normal distribution'
    return (1.0 + erf(x / sqrt(2.0))) / 2.0

Tham khảo:

https://docs.python.org/2/library/math.html

https://docs.python.org/3/library/math.html

Hàm Lỗi và Hàm phân phối Chuẩn có liên quan như thế nào?


3
Đây chính xác là những gì tôi đang tìm kiếm. Nếu ai đó không phải tôi tự hỏi làm thế nào điều này có thể được sử dụng để tính toán "tỷ lệ phần trăm dữ liệu nằm trong phân phối chuẩn", thì: 1 - (1 - phi (1)) * 2 = 0,6827 ("68% dữ liệu trong 1 tiêu chuẩn lệch ")
Hannes Landeholm

1
Đối với một phân phối chuẩn chung, nó sẽ là def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2.
Bernhard Barker

19

Phỏng theo đây http://mail.python.org/pipermail/python-list/2000-June/039873.html

from math import *
def erfcc(x):
    """Complementary error function."""
    z = abs(x)
    t = 1. / (1. + 0.5*z)
    r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+
        t*(.09678418+t*(-.18628806+t*(.27886807+
        t*(-1.13520398+t*(1.48851587+t*(-.82215223+
        t*.17087277)))))))))
    if (x >= 0.):
        return r
    else:
        return 2. - r

def ncdf(x):
    return 1. - 0.5*erfcc(x/(2**0.5))

3
Vì lib std thực hiện math.erf (), không cần thực hiện sep.
Marc

Tôi không thể tìm ra câu trả lời, những con số đó đến từ đâu?
TmSmth

15

Để xây dựng dựa trên ví dụ của Unknown, hàm tương đương trong Python của hàm normdist () được triển khai trong nhiều thư viện sẽ là:

def normcdf(x, mu, sigma):
    t = x-mu;
    y = 0.5*erfcc(-t/(sigma*sqrt(2.0)));
    if y>1.0:
        y = 1.0;
    return y

def normpdf(x, mu, sigma):
    u = (x-mu)/abs(sigma)
    y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
    return y

def normdist(x, mu, sigma, f):
    if f:
        y = normcdf(x,mu,sigma)
    else:
        y = normpdf(x,mu,sigma)
    return y

15

Bắt đầu Python 3.8, thư viện chuẩn cung cấp NormalDistđối tượng như một phần củastatistics mô-đun.

Nó có thể được sử dụng để lấy hàm phân phối tích lũy ( cdf- xác suất một mẫu ngẫu nhiên X sẽ nhỏ hơn hoặc bằng x) cho một giá trị trung bình nhất định ( mu) và độ lệch chuẩn ( sigma):

from statistics import NormalDist

NormalDist(mu=0, sigma=1).cdf(1.96)
# 0.9750021048517796

Có thể đơn giản hóa cái nào cho phân phối chuẩn chuẩn ( mu = 0sigma = 1):

NormalDist().cdf(1.96)
# 0.9750021048517796

NormalDist().cdf(-1.96)
# 0.024997895148220428

9

Câu trả lời của Alex cho bạn thấy một giải pháp cho phân phối chuẩn chuẩn (trung bình = 0, độ lệch chuẩn = 1). Nếu bạn có phân phối chuẩn với meanstd(là sqr(var)) và bạn muốn tính:

from scipy.stats import norm

# cdf(x < val)
print norm.cdf(val, m, s)

# cdf(x > val)
print 1 - norm.cdf(val, m, s)

# cdf(v1 < x < v2)
print norm.cdf(v2, m, s) - norm.cdf(v1, m, s)

Đọc thêm về cdf tại đây và thực hiện scipy của phân phối chuẩn với nhiều công thức tại đây .


2

Chụp từ trên cao:

from scipy.stats import norm
>>> norm.cdf(1.96)
0.9750021048517795
>>> norm.cdf(-1.96)
0.024997895148220435

Đối với bài kiểm tra hai bên:

Import numpy as np
z = 1.96
p_value = 2 * norm.cdf(-np.abs(z))
0.04999579029644087


-9

Vì Google đưa ra câu trả lời này cho pdf tìm kiếm netlogo , đây là phiên bản netlogo của mã python ở trên

    ;; Hàm mật độ tích lũy phân phối chuẩn
    to-report normcdf [x mu sigma]
        để tx - mu
        cho phép y 0,5 * erfcc [- t / (sigma * sqrt 2.0)]
        if (y> 1,0) [đặt y 1,0]
        báo cáo y
    kết thúc

    ;; Hàm mật độ xác suất phân phối chuẩn
    báo cáo normpdf [x mu sigma]
        hãy để u = (x - mu) / abs sigma
        let y = 1 / (sqrt [2 * pi] * abs sigma) * exp (- u * u / 2.0)
        báo cáo y
    kết thúc

    ;; Chức năng lỗi bổ sung
    để báo cáo erfcc [x]
        hãy để z abs x
        cho t 1,0 / (1,0 + 0,5 * z)
        hãy để rt * exp (- z * z -1.26551223 + t * (1.00002368 + t * (0.37409196 +
            t * (0,09678418 + t * (-0,18628806 + t * (.27886807 +
            t * (-1.13520398 + t * (1.48851587 + t * (-0.82215223 +
            t * .17087277)))))))))
        ifelse (x> = 0) [báo cáo r] [báo cáo 2.0 - r]
    kết thúc


6
Câu hỏi là về Python, không phải NetLogo. Câu trả lời này không nên có ở đây. Và vui lòng không sửa câu hỏi để thay đổi ý nghĩa của nó.
interjay 18/10/12

Tôi biết rằng đây không phải là cách ưa thích, nhưng tôi đoán nó là hữu ích nhất theo cách này như mọi người đang hướng đến trang này bằng google (hiện ...)
platipodium
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.