Câu trả lời:
Đâ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)
loc
và scale
? Tôi đã sử dụng help(norm.ppf)
nhưng sau đó những gì heck là loc
và scale
- cần một sự giúp đỡ cho sự giúp đỡ ..
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, math
thư 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
def phi(x, mu, sigma): return (1 + erf((x - mu) / sigma / sqrt(2))) / 2
.
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))
Để 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
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 = 0
và sigma = 1
):
NormalDist().cdf(1.96)
# 0.9750021048517796
NormalDist().cdf(-1.96)
# 0.024997895148220428
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 mean
và std
(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 .
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
Đơn giản như thế này:
import math
def my_cdf(x):
return 0.5*(1+math.erf(x/math.sqrt(2)))
Tôi đã tìm thấy công thức trong trang này https://www.danielsoper.com/statcalc/formulas.aspx?id=55
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