2012-02-25 54 views
5

Với độ lệch trung bình và chuẩn xác định normal distribution, bạn sẽ tính toán xác suất sau bằng tinh khiết-Python như thế nào (không có gói Numpy/Scipy hoặc các gói khác không có trong thư viện chuẩn))?Tính toán xác suất của biến ngẫu nhiên trong phân phối bằng Python

  1. Xác suất của biến ngẫu nhiên r trong đó r < x hoặc r < = x.
  2. Xác suất của biến ngẫu nhiên r trong đó r> x hoặc r> = x.
  3. Xác suất của biến ngẫu nhiên r trong đó x> r> y.

Tôi đã tìm thấy một số thư viện, như Pgnumerics, cung cấp các chức năng để tính toán những điều này, nhưng toán học cơ bản không rõ ràng với tôi.

Chỉnh sửa: Để hiển thị đây không phải là bài tập về nhà, được đăng bên dưới là mã làm việc của tôi cho Python < = 2.6, mặc dù tôi không chắc liệu nó có xử lý các điều kiện biên một cách chính xác hay không.

from math import * 
import unittest 

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

def normrange(x1, x2, mu, sigma, f=True): 
    """ 
    Calculates probability of random variable falling between two points. 
    """ 
    p1 = normdist(x1, mu, sigma, f) 
    p2 = normdist(x2, mu, sigma, f) 
    return abs(p1-p2) 
+0

Đó là những gì hàm phân phối tích lũy cho phân phối cung cấp cho bạn. Bài viết bạn liên kết để cung cấp cho điều này cho các bản phân phối bình thường –

Trả lời

8

Tất cả những rất giống nhau: Nếu bạn có thể tính toán # 1 sử dụng một hàm cdf(x), sau đó là giải pháp cho # 2 chỉ đơn giản là 1 - cdf(x), và cho # 3 đó là cdf(x) - cdf(y).

Kể từ Python bao gồm (gauss) hàm sai số được xây dựng trong kể từ phiên bản 2.7 bạn có thể làm điều này bằng cách tính lũy của phân phối bình thường bằng cách sử dụng phương trình từ the article you linked to:

import math 
print 0.5 * (1 + math.erf((x - mean)/math.sqrt(2 * standard_dev**2))) 

nơi mean là giá trị trung bình và standard_dev là độ lệch chuẩn.

Một số lưu ý từ những gì bạn hỏi có vẻ tương đối đơn giản cho các thông tin trong bài viết:

  • CDF của một biến ngẫu nhiên (nói X) là xác suất mà X nằm giữa vô cực và một số giới hạn, nói x (chữ thường). CDF là một phần của bản pdf cho các bản phân phối liên tục. Cdf là chính xác những gì bạn mô tả cho # 1, bạn muốn một số RV được phân phối bình thường là giữa-infinity và x (< = x).
  • < và < = cũng như> và> = giống nhau cho các biến ngẫu nhiên liên tục vì xác suất rv là bất kỳ điểm nào là 0. Vì vậy, có hay không x chính nó được bao gồm không thực sự quan trọng khi tính toán xác suất cho các bản phân phối liên tục.
  • Tổng số xác suất là 1, nếu không phải là < x thì đó là> = x vì vậy nếu bạn có cdf(x). sau đó 1 - cdf(x) là xác suất mà biến ngẫu nhiên X> = x. Vì> = tương đương với các biến ngẫu nhiên liên tục thành>, đây cũng là xác suất X> x.
+0

Các giới hạn được giải thích như thế nào? Bạn nói cdf (x) giải quyết # 1, nhưng tôi có hai trường hợp riêng biệt cho # 1. Nhỏ hơn hoặc nhỏ hơn hoặc bằng. Mà cdf (x) giải quyết, và làm thế nào tôi sẽ tìm thấy các trường hợp khác? – Cerin

+0

Xin chào, đối với phân phối bình thường liên tục, nhỏ hơn và nhỏ hơn tương đương nên đây chỉ là một trường hợp. Tôi đã thêm một số ghi chú. – ameer

+1

'1 - cdf (x)' có thể được biểu diễn thông qua 'math.erfc()'.Nó có thể cải thiện độ chính xác cho 'cdf (x) gần 1'. – jfs

Các vấn đề liên quan