2015-02-24 17 views
7

Tôi không hiểu những điều cơ bản về việc tạo các biến lognormal như được ghi trong tài liệu here.Đăng nhập các Biến ngẫu nhiên Bình thường với Scipy

The log normal distribution takes on mean and variance as parameters. Tôi muốn tạo ra một phân phối đông lạnh sử dụng các thông số và sau đó nhận được lũy, pdf, vv

Tuy nhiên, trong tài liệu hướng dẫn, họ nhận được sự phân bố đông lạnh sử dụng

from scipy.stats import lognorm 
s = 0.953682269606 
rv = lognorm(s) 

's' có vẻ là tiêu chuẩn độ lệch. Tôi đã cố gắng sử dụng các tham số 'loc' và 'scale' thay vì 's', nhưng điều đó tạo ra một lỗi (s là tham số bắt buộc). Làm thế nào tôi có thể tạo phân phối cố định với các giá trị tham số 'm', 's' cho vị trí và tỷ lệ?

Trả lời

12

Các bí ẩn được giải quyết (chỉnh sửa 3)

  • μ tương ứng với ln(scale) (!)
  • σ tương ứng với hình (s)
  • loc là không cần thiết cho việc thiết lập bất kỳ σ và L

Tôi nghĩ rằng đó là một vấn đề nghiêm trọng mà điều này không được ghi chép rõ ràng. Tôi đoán nhiều người đã rơi cho điều này khi làm các xét nghiệm đơn giản với sự phân bố lognormal trong SciPy.

Tại sao lại như vậy?

Mô-đun thống kê xử lý locscale tương tự cho tất cả các bản phân phối (điều này không được viết rõ ràng, nhưng có thể suy ra khi đọc giữa các dòng). Nghi ngờ của tôi là loc được trừ từ x và kết quả được chia cho scale (và kết quả được coi là mới x). Tôi đã thử nghiệm cho điều đó, và điều này hóa ra là như vậy.

Điều này có ý nghĩa gì đối với phân phối chuẩn? Trong định nghĩa kinh điển của phân phối lognormal thuật ngữ ln(x) xuất hiện. Rõ ràng, cùng một thuật ngữ xuất hiện trong việc thực hiện của SciPy. Với cân nhắc ở trên, đây là cách locscale kết thúc trong logarit:

ln((x-loc)/scale) 

Bằng cách tính toán logarit chung, đây là giống như

ln(x-loc) - ln(scale) 

Trong định nghĩa kinh điển của phân phối lognormal thuật ngữ đơn giản là ln(x) - μ. So sánh cách tiếp cận của SciPy và cách tiếp cận kinh điển sau đó cung cấp thông tin chi tiết quan trọng: ln(scale) đại diện cho μ. Tuy nhiên, loc không có sự tương ứng trong định nghĩa kinh điển và còn tốt hơn ở 0. Bên dưới, tôi đã lập luận rằng hình dạng (s) là σ.

Proof

>>> import math 
>>> from scipy.stats import lognorm 
>>> mu = 2 
>>> sigma = 2 
>>> l = lognorm(s=sigma, loc=0, scale=math.exp(mu)) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 54.59815 stddev: 399.71719 

tôi sử dụng WolframAlpha như một tài liệu tham khảo. Nó cung cấp các giá trị được xác định về mặt phân tích cho độ lệch trung bình và chuẩn của phân phối chuẩn.

http://www.wolframalpha.com/input/?i=log-normal+distribution%2C+mean%3D2%2C+sd%3D2

enter image description here

Các giá trị phù hợp.

WolframAlpha cũng như SciPy đưa ra độ lệch trung bình và tiêu chuẩn bằng cách đánh giá các điều khoản phân tích phân tích. Hãy thực hiện một bài kiểm tra thực nghiệm, bằng cách lấy nhiều mẫu từ phân phối scipy, và tính toán trung bình của chúng và độ lệch chuẩn "bằng tay" (từ toàn bộ các mẫu):

>>> import numpy as np 
>>> samples = l.rvs(size=2*10**7) 
>>> print("mean: %.5f stddev: %.5f" % (np.mean(samples), np.std(samples))) 
mean: 54.52148 stddev: 380.14457 

này vẫn chưa hoàn toàn hội tụ, nhưng tôi nghĩ rằng đó là bằng chứng đủ để các mẫu tương ứng với cùng một phân phối mà WolframAlpha giả định, cho μ = 2 và σ = 2.

Và một chỉnh sửa nhỏ: có vẻ như việc sử dụng đúng đắn của một công cụ tìm kiếm sẽ giúp, chúng tôi không là người đầu tiên bị mắc kẹt của thành viên này:

https://stats.stackexchange.com/questions/33036/fitting-log-normal-distribution-in-r-vs-scipy http://nbviewer.ipython.org/url/xweb.geos.ed.ac.uk/~jsteven5/blog/lognormal_distributions.ipynb scipy, lognormal distribution - parameters

chỉnh sửa khác: bây giờ rằng tôi biết nó cư xử như thế nào, tôi nhận ra rằng hành vi theo nguyên tắc là tài liệu. Trong the "notes" section chúng ta có thể đọc:

với tham số hình dạng sigma và tham số exp quy mô (mu)

Nó chỉ thực sự không rõ ràng (cả hai chúng tôi không thể đánh giá đúng tầm quan trọng của câu nhỏ này) . Tôi đoán lý do chúng tôi không thể hiểu ý nghĩa của câu này là biểu thức phân tích được hiển thị trong phần ghi chú không không bao gồm locscale. Tôi đoán đây là giá trị báo cáo lỗi/cải thiện tài liệu.

Original câu trả lời:

Thật vậy, tham số hình dạng chủ đề cũng không phải là các tài liệu khi nhìn vào trang tài liệu cho một phân phối cụ thể. Tôi khuyên bạn nên có một cái nhìn tại các tài liệu hướng dẫn số liệu thống kê chính - có một phần trên các thông số hình dạng:

http://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#shape-parameters

Có vẻ như không nên có một tài sản lognorm.shapes, nói cho bạn về những gì các tham số s nghĩa, cụ thể.

Edit: Chỉ có một tham số, quả thật vậy:

>>> lognorm.shapes 
's' 

Khi so sánh với định nghĩa chung về phân phối lognormal (từ Wikipedia): enter image description here

và công thức được đưa ra bởi tài liệu scipy:

lognorm.pdf(x, s) = 1/(s*x*sqrt(2*pi)) * exp(-1/2*(log(x)/s)**2) 

nó trở thành rõ ràng rằng s là đúng σ (sigma).

Tuy nhiên, từ tài liệu không rõ ràng cách tham số loc có liên quan đến μ (mu).

Nó có thể là như trong ln(x-loc), mà sẽ không tương ứng với L trong công thức chung, hoặc nó có thể là ln(x)-loc, mà sẽ đảm bảo sự tương ứng giữa loc và μ. Hãy thử nó! :)

Chỉnh sửa 2

Tôi đã thực hiện so sánh giữa những gì WolframAlpha (WA) và scipy nói. WA khá rõ ràng về việc nó sử dụng μ và σ như thường được hiểu (như được định nghĩa trong bài viết Wikipedia liên kết).

>>> l = lognorm(s=2, loc=0) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 7.38906 stddev: 54.09584 

Điều này khớp với WA's output.

Hiện tại, đối với loc không bằng 0, không khớp. Ví dụ:

>>> l = lognorm(s=2, loc=1) 
>>> print("mean: %.5f stddev: %.5f" % (l.mean(), l.std())) 
mean: 8.38906 stddev: 54.09584 

WA gives một trung bình 20,08 và một độ lệch chuẩn của 147. Ở đó bạn có nó, loc không không tương ứng với L trong định nghĩa cổ điển của phân phối lognormal.

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