Cách tính hàm mật độ xác suất từ ​​data python

Trong hướng dẫn này, chúng tôi thảo luận về nhiều, nhưng chắc chắn không phải tất cả, các tính năng của

>>> from scipy.stats import norm
07. Mục đích ở đây là cung cấp cho người dùng kiến ​​thức làm việc về gói này. Chúng tôi tham khảo để biết thêm chi tiết

Ghi chú. Tài liệu này đang được hoàn thiện

  • Phân phối thống kê rời rạc
  • Phân phối thống kê liên tục
  • Lấy mẫu số ngẫu nhiên không thống nhất phổ quát trong SciPy
  • Phương pháp lấy mẫu lại và Monte Carlo

biến ngẫu nhiên

Có hai lớp phân phối chung đã được triển khai để đóng gói và. Hơn 80 biến ngẫu nhiên liên tục [RV] và 10 biến ngẫu nhiên rời rạc đã được triển khai bằng cách sử dụng các lớp này. Bên cạnh đó, người dùng cuối có thể dễ dàng thêm các quy trình và bản phân phối mới. [Nếu bạn tạo ra một cái, xin vui lòng đóng góp nó. ]

Tất cả các chức năng thống kê được đặt trong gói phụ và có thể thu được danh sách khá đầy đủ các chức năng này bằng cách sử dụng

>>> from scipy.stats import norm
10. Danh sách các biến ngẫu nhiên có sẵn cũng có thể được lấy từ chuỗi tài liệu cho gói con thống kê

Trong cuộc thảo luận dưới đây, chúng tôi chủ yếu tập trung vào RV liên tục. Gần như mọi thứ cũng áp dụng cho các biến rời rạc, nhưng chúng tôi chỉ ra một số điểm khác biệt ở đây.

Trong các mẫu mã bên dưới, chúng tôi giả sử rằng gói được nhập dưới dạng

>>> from scipy import stats

và trong một số trường hợp, chúng tôi giả sử rằng các đối tượng riêng lẻ được nhập dưới dạng

>>> from scipy.stats import norm

Tìm sự giúp đỡ

Trước hết, tất cả các bản phân phối đều đi kèm với các chức năng trợ giúp. Để có được một số thông tin cơ bản, chúng tôi in chuỗi tài liệu có liên quan.

>>> from scipy.stats import norm
12

Để tìm sự hỗ trợ, tôi. e. , giới hạn trên và dưới của phân phối, gọi

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf

Chúng ta có thể liệt kê tất cả các phương thức và thuộc tính của phân phối với

>>> from scipy.stats import norm
13. Hóa ra, một số phương thức là riêng tư, mặc dù chúng không được đặt tên như vậy [tên của chúng không bắt đầu bằng dấu gạch dưới ở đầu], ví dụ như
>>> from scipy.stats import norm
14, chỉ khả dụng để tính toán nội bộ [những phương thức đó sẽ đưa ra cảnh báo khi một người thử

Để có được các phương thức chính thực sự, chúng tôi liệt kê các phương thức phân phối cố định. [Chúng tôi giải thích ý nghĩa của phân phối cố định bên dưới]

________số 8_______

Cuối cùng, chúng ta có thể có được danh sách phân phối có sẵn thông qua xem xét nội tâm

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19

phương pháp phổ biến

Các phương pháp công cộng chính cho RV liên tục là

  • rvs. biến thể ngẫu nhiên

  • pdf. Hàm mật độ xác suất

  • cdf. Chức năng phân phối tích lũy

  • sf. Chức năng sinh tồn [1-CDF]

  • ppf. Hàm điểm phần trăm [Nghịch đảo của CDF]

  • isf. Chức năng sống sót nghịch đảo [Nghịch đảo của SF]

  • số liệu thống kê. Giá trị trung bình trả về, phương sai, độ lệch [Fisher's] hoặc độ nhọn [Fisher's]

  • khoảng khăc. khoảnh khắc không trung tâm của phân phối

Hãy lấy một chiếc RV bình thường làm ví dụ

>>> norm.cdf[0]
0.5

Để tính toán

>>> from scipy.stats import norm
15 tại một số điểm, chúng ta có thể truyền một danh sách hoặc một mảng có nhiều mảng

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]

Do đó, các phương thức cơ bản, chẳng hạn như pdf, cdf, v.v., được vector hóa

Các phương pháp hữu ích nói chung khác cũng được hỗ trợ

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]

Để tìm trung vị của một phân phối, chúng ta có thể sử dụng hàm điểm phần trăm

>>> from scipy.stats import norm
16, là hàm nghịch đảo của
>>> from scipy.stats import norm
15

>>> norm.ppf[0.5]
0.0

Để tạo một chuỗi các biến ngẫu nhiên, hãy sử dụng đối số từ khóa

>>> from scipy.stats import norm
18

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random

Đừng nghĩ rằng

>>> from scipy.stats import norm
19 tạo ra 5 biến

>>> from scipy.stats import norm
0

Ở đây,

>>> from scipy.stats import norm
20 không có từ khóa nào được hiểu là đối số từ khóa có thể có đầu tiên,
>>> from scipy.stats import norm
21, đây là đối số đầu tiên trong một cặp đối số từ khóa được thực hiện bởi tất cả các phân phối liên tục. Điều này đưa chúng ta đến chủ đề của tiểu mục tiếp theo

Tạo số ngẫu nhiên

Vẽ số ngẫu nhiên dựa vào trình tạo từ gói. Trong các ví dụ trên, dòng số ngẫu nhiên cụ thể không thể lặp lại qua các lần chạy. Để đạt được khả năng tái tạo, bạn có thể tạo một trình tạo số ngẫu nhiên một cách rõ ràng. Trong NumPy, trình tạo là một thể hiện của. Đây là cách kinh điển để tạo một trình tạo

>>> from scipy.stats import norm
1

Và sửa chữa hạt giống có thể được thực hiện như thế này

>>> from scipy.stats import norm
2

Cảnh báo

Không sử dụng số này hoặc các giá trị phổ biến như 0. Chỉ sử dụng một tập hợp nhỏ các hạt giống để khởi tạo các không gian trạng thái lớn hơn có nghĩa là có một số trạng thái ban đầu không thể đạt được. Điều này tạo ra một số thành kiến ​​nếu mọi người sử dụng các giá trị như vậy. Một cách tốt để có được một hạt giống là sử dụng một

>>> from scipy.stats import norm
3

Tham số random_state trong các bản phân phối chấp nhận một thể hiện của lớp hoặc một số nguyên, sau đó được sử dụng để khởi tạo một đối tượng ________0____26 bên trong

>>> from scipy.stats import norm
4

Để biết thêm thông tin, hãy xem tài liệu của NumPy

Để tìm hiểu thêm về bộ lấy mẫu số ngẫu nhiên được triển khai trong SciPy, hãy xem và

Dịch chuyển và chia tỷ lệ

Tất cả các bản phân phối liên tục đều lấy

>>> from scipy.stats import norm
21 và
>>> from scipy.stats import norm
28 làm tham số từ khóa để điều chỉnh vị trí và quy mô của bản phân phối, e. g. , đối với phân phối chuẩn chuẩn, vị trí là giá trị trung bình và thang đo là độ lệch chuẩn

>>> from scipy.stats import norm
5

Trong nhiều trường hợp, phân phối chuẩn hóa cho một biến ngẫu nhiên

>>> from scipy.stats import norm
29 có được thông qua phép biến đổi
>>> from scipy.stats import norm
30. Các giá trị mặc định là
>>> from scipy.stats import norm
31 và
>>> from scipy.stats import norm
32

Việc sử dụng thông minh

>>> from scipy.stats import norm
21 và
>>> from scipy.stats import norm
28 có thể giúp sửa đổi các bản phân phối tiêu chuẩn theo nhiều cách. Để minh họa thêm cho việc chia tỷ lệ,
>>> from scipy.stats import norm
15 của RV phân phối theo hàm mũ với giá trị trung bình \[1/\lambda\] được cho bởi

\[F[x] = 1 - \exp[-\lambda x]\]

Bằng cách áp dụng quy tắc chia tỷ lệ ở trên, có thể thấy rằng bằng cách lấy

>>> from scipy.stats import norm
36, chúng ta sẽ có được tỷ lệ phù hợp

>>> from scipy.stats import norm
6

Ghi chú

Các bản phân phối có tham số hình dạng có thể yêu cầu nhiều hơn ứng dụng đơn giản của

>>> from scipy.stats import norm
21 và/hoặc
>>> from scipy.stats import norm
28 để đạt được hình thức mong muốn. Ví dụ: phân phối độ dài vectơ 2-D cho một vectơ không đổi có độ dài \[R\] bị nhiễu bởi N[0, \[\sigma^2\]] deviations in each component is rice[\[R/\sigma\], scale= \[\sigma\]]. The first argument is a shape parameter that needs to be scaled along with \[x\] .

Sự phân phối đồng đều cũng thú vị

>>> from scipy.stats import norm
7

Cuối cùng, nhớ lại từ đoạn trước rằng chúng ta còn lại vấn đề về ý nghĩa của

>>> from scipy.stats import norm
19. Hóa ra, gọi một phân phối như thế này, đối số đầu tiên, tôi. e. , 5, được chuyển để đặt tham số
>>> from scipy.stats import norm
21. Hãy xem nào

>>> from scipy.stats import norm
8

Vì vậy, để giải thích đầu ra của ví dụ của phần cuối cùng.

>>> from scipy.stats import norm
19 tạo ra một biến ngẫu nhiên phân phối chuẩn với giá trị trung bình là
>>> from scipy.stats import norm
42, vì giá trị mặc định là
>>> from scipy.stats import norm
43

Chúng tôi khuyên bạn nên đặt thông số

>>> from scipy.stats import norm
21 và
>>> from scipy.stats import norm
28 một cách rõ ràng, bằng cách chuyển các giá trị dưới dạng từ khóa thay vì dưới dạng đối số. Có thể giảm thiểu sự lặp lại khi gọi nhiều hơn một phương thức của một RV nhất định bằng cách sử dụng kỹ thuật , như được giải thích bên dưới

Thông số hình dạng

Trong khi một biến ngẫu nhiên liên tục chung có thể được thay đổi và chia tỷ lệ với các tham số

>>> from scipy.stats import norm
21 và
>>> from scipy.stats import norm
28, một số phân phối yêu cầu các tham số hình dạng bổ sung. Ví dụ, phân phối gamma với mật độ

\[\gamma[x, a] = \frac{\lambda [\lambda x]^{a-1}}{\Gamma[a]} ​​e^{-\lambda x}\;,\]

yêu cầu tham số hình dạng \[a\] . Quan sát rằng cài đặt \[\lambda\] có thể đạt được bằng cách đặt từ khóa

>>> from scipy.stats import norm
28 thành \[1/\ . .

Hãy kiểm tra số lượng và tên của các tham số hình dạng của phân phối gamma. [Chúng tôi biết từ trên rằng đây phải là 1. ]

>>> from scipy.stats import norm
9

Bây giờ, chúng tôi đặt giá trị của biến hình dạng thành 1 để có được phân phối theo cấp số nhân, để chúng tôi dễ dàng so sánh xem chúng tôi có nhận được kết quả như mong đợi hay không

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
0

Lưu ý rằng chúng ta cũng có thể chỉ định tham số hình dạng là từ khóa

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
1

Đóng băng một bản phân phối

Vượt qua các từ khóa

>>> from scipy.stats import norm
21 và
>>> from scipy.stats import norm
28 nhiều lần có thể trở nên khá khó chịu. Khái niệm đóng băng RV được sử dụng để giải quyết các vấn đề như vậy

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
2

Bằng cách sử dụng

>>> from scipy.stats import norm
51, chúng tôi không còn phải bao gồm các tham số tỷ lệ hoặc hình dạng nữa. Do đó, các bản phân phối có thể được sử dụng theo một trong hai cách, bằng cách chuyển tất cả các tham số phân phối cho mỗi lệnh gọi phương thức [chẳng hạn như chúng ta đã làm trước đó] hoặc bằng cách đóng băng các tham số cho phiên bản của bản phân phối. Hãy để chúng tôi kiểm tra điều này

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
3

Đây thực sự là những gì chúng ta nên nhận được

Phát thanh truyền hình

Các phương thức cơ bản

>>> from scipy.stats import norm
52, v.v., đáp ứng các quy tắc phát sóng numpy thông thường. Ví dụ: chúng ta có thể tính các giá trị tới hạn cho đuôi trên của phân phối t cho các xác suất và bậc tự do khác nhau

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
4

Ở đây, hàng đầu tiên chứa các giá trị tới hạn cho 10 bậc tự do và hàng thứ hai chứa 11 bậc tự do [d. o. f. ]. Do đó, các quy tắc phát sóng cho kết quả giống nhau khi gọi ___0_______53 hai lần

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
5

Nếu mảng có xác suất, tôi. e. ,

>>> from scipy.stats import norm
54 và dãy bậc tự do i. e. ,
>>> from scipy.stats import norm
55, có cùng hình dạng mảng, sau đó sử dụng so khớp theo phần tử. Ví dụ: chúng tôi có thể nhận được đuôi 10% trong 10 ngày. o. f. , đuôi 5% trong 11 ngày. o. f. và đuôi 1% trong 12 ngày. o. f. bằng cách gọi

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
6

Điểm cụ thể cho các bản phân phối rời rạc

Phân phối rời rạc có hầu hết các phương pháp cơ bản giống như phân phối liên tục. Tuy nhiên,

>>> from scipy.stats import norm
52 được thay thế bằng hàm khối lượng xác suất
>>> from scipy.stats import norm
57, không có phương pháp ước tính nào, chẳng hạn như tính phù hợp, khả dụng và
>>> from scipy.stats import norm
28 không phải là tham số từ khóa hợp lệ. Tham số vị trí, từ khóa
>>> from scipy.stats import norm
21, vẫn có thể được sử dụng để thay đổi phân phối

Việc tính toán cdf đòi hỏi một số chú ý thêm. Trong trường hợp phân phối liên tục, hàm phân phối tích lũy, trong hầu hết các trường hợp tiêu chuẩn, hoàn toàn đơn điệu tăng trong giới hạn [a,b] và do đó, có một nghịch đảo duy nhất. Tuy nhiên, cdf của một phân phối rời rạc là một hàm bước, do đó cdf nghịch đảo, i. e. , hàm điểm phần trăm, yêu cầu một định nghĩa khác

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
7

Để biết thêm thông tin, hãy xem tài liệu

Chúng ta có thể xem phân phối siêu hình học làm ví dụ

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
8

Nếu chúng ta sử dụng cdf tại một số điểm nguyên và sau đó đánh giá ppf tại các giá trị cdf đó, chẳng hạn, chúng ta sẽ lấy lại các số nguyên ban đầu

>>> print['bounds of distribution lower: %s, upper: %s' % norm.support[]]
bounds of distribution lower: -inf, upper: inf
9

Nếu chúng ta sử dụng các giá trị không nằm trong các nút của hàm bước cdf, chúng ta sẽ lấy lại số nguyên cao hơn tiếp theo

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
0

phân phối phù hợp

Các phương pháp bổ sung chính của phân phối không bị đóng băng có liên quan đến việc ước tính các tham số phân phối

  • Phù hợp. ước tính khả năng tối đa của các tham số phân phối, bao gồm cả vị trí

    và quy mô

  • fit_loc_scale. ước tính vị trí và tỷ lệ khi các tham số hình dạng được đưa ra

  • nnlf. hàm xác suất nhật ký âm

  • mong đợi. tính toán kỳ vọng của một chức năng so với pdf hoặc pmf

Các vấn đề về hiệu suất và nhận xét thận trọng

Hiệu suất của các phương pháp riêng lẻ, về mặt tốc độ, rất khác nhau tùy theo phân phối và phương pháp. Kết quả của một phương pháp thu được theo một trong hai cách. bằng tính toán rõ ràng hoặc bằng thuật toán chung không phụ thuộc vào phân phối cụ thể

Tính toán rõ ràng, một mặt, yêu cầu phương pháp được chỉ định trực tiếp cho phân phối đã cho, thông qua các công thức phân tích hoặc thông qua các hàm đặc biệt trong ____0_______60 hoặc ____0____22 cho ________62. Đây thường là những tính toán tương đối nhanh

Mặt khác, các phương pháp chung được sử dụng nếu phân phối không chỉ định bất kỳ phép tính rõ ràng nào. Để xác định phân phối, chỉ cần một trong pdf hoặc cdf; . Tuy nhiên, các phương pháp gián tiếp này có thể rất chậm. Ví dụ:

>>> from scipy.stats import norm
63 tạo các biến ngẫu nhiên theo cách rất gián tiếp và mất khoảng 19 giây cho 100 biến ngẫu nhiên trên máy tính của tôi, trong khi một triệu biến ngẫu nhiên từ chuẩn tắc chuẩn hoặc từ phân phối t chỉ mất hơn một giây

vấn đề còn lại

Các bản phân phối trong

>>> from scipy.stats import norm
07 gần đây đã được sửa chữa và cải thiện và đạt được một bộ thử nghiệm đáng kể;

  • Các bản phân phối đã được thử nghiệm trên một số phạm vi tham số;

  • Ước tính khả năng tối đa phù hợp không hoạt động với các tham số bắt đầu mặc định cho tất cả các bản phân phối và người dùng cần cung cấp các tham số bắt đầu tốt. Ngoài ra, đối với một số phân phối sử dụng công cụ ước tính khả năng tối đa vốn dĩ không phải là lựa chọn tốt nhất

Xây dựng các bản phân phối cụ thể

Các ví dụ tiếp theo cho thấy cách xây dựng bản phân phối của riêng bạn. Các ví dụ khác cho thấy việc sử dụng các bản phân phối và một số kiểm tra thống kê

Thực hiện một phân phối liên tục, tôi. e. , phân lớp
>>> from scipy.stats import norm
65

Thực hiện phân phối liên tục khá đơn giản

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
1

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
2

Thật thú vị,

>>> from scipy.stats import norm
52 hiện được tính toán tự động

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
3

Hãy nhận biết các vấn đề hiệu suất được đề cập trong. Việc tính toán các phương thức chung không xác định có thể trở nên rất chậm, vì chỉ các phương thức chung mới được gọi, về bản chất, chúng không thể sử dụng bất kỳ thông tin cụ thể nào về phân phối. Vì vậy, như một ví dụ cảnh báo

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
4

Nhưng điều này là không chính xác. tích phân trên pdf này phải là 1. Hãy làm cho khoảng tích hợp nhỏ hơn

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
5

Điều này có vẻ tốt hơn. Tuy nhiên, vấn đề bắt nguồn từ thực tế là pdf không được chỉ định trong định nghĩa lớp của phân phối xác định

Phân lớp
>>> from scipy.stats import norm
67

Trong phần sau đây, chúng tôi sử dụng để tạo một phân phối rời rạc có xác suất của chuẩn bị cắt ngắn đối với các khoảng có tâm xung quanh các số nguyên

Thông tin chung

Từ chuỗi tài liệu của rv_discrete,

>>> from scipy.stats import norm
69,

“Bạn có thể xây dựng một rv rời rạc tùy ý trong đó P{X=xk} = pk bằng cách chuyển đến phương thức khởi tạo rv_discrete [thông qua từ khóa values=] một bộ các chuỗi [xk, pk] chỉ mô tả các giá trị đó của X [xk] . ”

Bên cạnh đó, có một số yêu cầu khác để phương pháp này hoạt động

  • Tên từ khóa là bắt buộc

  • Các điểm hỗ trợ của phân phối xk phải là số nguyên

  • Số chữ số có nghĩa [số thập phân] cần được chỉ định

Trên thực tế, nếu hai yêu cầu cuối cùng không được thỏa mãn, một ngoại lệ có thể được đưa ra hoặc các số kết quả có thể không chính xác

Một ví dụ

Hãy làm việc. Đầu tiên

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
6

Và, cuối cùng, chúng ta có thể phân lớp

>>> from scipy.stats import norm
67

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
7

Bây giờ chúng tôi đã xác định phân phối, chúng tôi có quyền truy cập vào tất cả các phương thức phổ biến của phân phối rời rạc

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
8

>>> rv = norm[]
>>> dir[rv]  # reformatted
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
 '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', '__weakref__', 'a', 'args', 'b', 'cdf',
 'dist', 'entropy', 'expect', 'interval', 'isf', 'kwds', 'logcdf',
 'logpdf', 'logpmf', 'logsf', 'mean', 'median', 'moment', 'pdf', 'pmf',
 'ppf', 'random_state', 'rvs', 'sf', 'stats', 'std', 'var']
9

Kiểm tra việc thực hiện

Hãy tạo một mẫu ngẫu nhiên và so sánh tần suất quan sát được với xác suất

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
0

Tiếp theo, chúng tôi có thể kiểm tra xem mẫu của chúng tôi có được tạo bởi phân phối rời rạc định mức hay không. Điều này cũng xác minh xem các số ngẫu nhiên có được tạo chính xác hay không

Kiểm tra chi bình phương yêu cầu có một số lượng quan sát tối thiểu trong mỗi thùng. Chúng tôi kết hợp các thùng đuôi thành các thùng lớn hơn để chúng chứa đủ các quan sát

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
1

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
2

Giá trị p trong trường hợp này cao, vì vậy chúng tôi có thể khá tự tin rằng mẫu ngẫu nhiên của chúng tôi thực sự được tạo ra bởi phân phối

Phân tích một mẫu

Đầu tiên, chúng tôi tạo một số biến ngẫu nhiên. Chúng tôi đặt một hạt giống để trong mỗi lần chạy, chúng tôi nhận được kết quả giống hệt nhau để xem xét. Để làm ví dụ, chúng tôi lấy một mẫu từ phân phối Student t

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
3

Ở đây, chúng tôi đặt tham số hình dạng bắt buộc của phân phối t, trong thống kê tương ứng với bậc tự do, thành 10. Sử dụng size=1000 có nghĩa là mẫu của chúng tôi bao gồm 1000 số ngẫu nhiên [giả] được vẽ độc lập. Vì chúng tôi không chỉ định đối số từ khóa loc và tỷ lệ, chúng được đặt thành giá trị mặc định là 0 và 1

Thống kê mô tả

x là một mảng có nhiều mảng và chúng tôi có quyền truy cập trực tiếp vào tất cả các phương thức mảng, e. g. ,

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
4

Làm thế nào để các thuộc tính mẫu so với các đối tác lý thuyết của họ?

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
5

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
6

Ghi chú. sử dụng công cụ ước tính không chệch cho phương sai, trong khi np. var là công cụ ước tính sai lệch

Đối với mẫu của chúng tôi, số liệu thống kê mẫu khác một lượng nhỏ so với các đối tác lý thuyết của chúng

T-test và KS-test

Chúng ta có thể sử dụng t-test để kiểm tra xem giá trị trung bình của mẫu của chúng ta có khác biệt đáng kể về mặt thống kê so với kỳ vọng lý thuyết hay không

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
7

Giá trị p là 0. 7, điều này có nghĩa là với sai số alpha, chẳng hạn như 10%, chúng ta không thể bác bỏ giả thuyết rằng giá trị trung bình của mẫu bằng 0, kỳ vọng của phân phối t chuẩn

Như một bài tập, chúng tôi cũng có thể tính trực tiếp bài kiểm tra của bạn mà không cần sử dụng hàm được cung cấp, hàm này sẽ cho chúng tôi câu trả lời tương tự và do đó, nó cũng vậy

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
8

Thử nghiệm Kolmogorov-Smirnov có thể được sử dụng để kiểm tra giả thuyết rằng mẫu xuất phát từ phân phối t chuẩn

>>> dist_continu = [d for d in dir[stats] if
..                 isinstance[getattr[stats, d], stats.rv_continuous]]
>>> dist_discrete = [d for d in dir[stats] if
..                  isinstance[getattr[stats, d], stats.rv_discrete]]
>>> print['number of continuous distributions: %d' % len[dist_continu]]
number of continuous distributions: 107
>>> print['number of discrete distributions:   %d' % len[dist_discrete]]
number of discrete distributions:   19
9

Một lần nữa, giá trị p đủ cao để chúng ta không thể bác bỏ giả thuyết rằng mẫu ngẫu nhiên thực sự được phân phối theo phân phối t. Trong các ứng dụng thực tế, chúng tôi không biết phân phối cơ bản là gì. Nếu chúng ta thực hiện kiểm định Kolmogorov-Smirnov đối với mẫu của chúng ta dựa trên phân phối chuẩn chuẩn, thì chúng ta cũng không thể bác bỏ giả thuyết rằng mẫu của chúng ta được tạo ra bởi phân phối chuẩn vì trong ví dụ này, giá trị p là gần 40%

>>> norm.cdf[0]
0.5
0

Tuy nhiên, phân phối chuẩn chuẩn có phương sai là 1, trong khi mẫu của chúng tôi có phương sai là 1. 29. Nếu chúng ta chuẩn hóa mẫu của mình và kiểm tra nó theo phân phối chuẩn, thì giá trị p lại đủ lớn để chúng ta không thể bác bỏ giả thuyết rằng mẫu có dạng phân phối chuẩn

>>> norm.cdf[0]
0.5
1

Ghi chú. Thử nghiệm Kolmogorov-Smirnov giả định rằng chúng tôi kiểm tra phân phối với các tham số đã cho, vì trong trường hợp cuối cùng, chúng tôi ước tính giá trị trung bình và phương sai, giả định này bị vi phạm và phân phối của thống kê thử nghiệm, dựa trên giá trị p,

Đuôi của phân phối

Cuối cùng, chúng ta có thể kiểm tra đuôi trên của phân phối. Chúng ta có thể sử dụng hàm điểm phần trăm ppf, là hàm nghịch đảo của hàm cdf, để lấy các giá trị tới hạn hoặc trực tiếp hơn, chúng ta có thể sử dụng hàm nghịch đảo của hàm tồn tại

>>> norm.cdf[0]
0.5
2

>>> norm.cdf[0]
0.5
3

Trong cả ba trường hợp, mẫu của chúng tôi có trọng số ở đuôi trên cao hơn so với phân phối cơ bản. Chúng tôi có thể kiểm tra nhanh một mẫu lớn hơn để xem liệu chúng tôi có khớp gần hơn không. Trong trường hợp này, tần suất thực nghiệm khá gần với xác suất lý thuyết, nhưng nếu chúng ta lặp lại điều này nhiều lần, thì dao động vẫn khá lớn

>>> norm.cdf[0]
0.5
4

Chúng ta cũng có thể so sánh nó với đuôi của phân phối chuẩn, có trọng số nhỏ hơn ở các đuôi

>>> norm.cdf[0]
0.5
5

Thử nghiệm chi bình phương có thể được sử dụng để kiểm tra xem đối với một số lượng thùng hữu hạn, tần suất quan sát được có khác biệt đáng kể so với xác suất của phân phối được giả định hay không

>>> norm.cdf[0]
0.5
6

Chúng tôi thấy rằng phân phối chuẩn chuẩn bị từ chối rõ ràng, trong khi phân phối t chuẩn không thể bị từ chối. Vì phương sai của mẫu của chúng tôi khác với cả hai phân phối tiêu chuẩn, nên chúng tôi có thể làm lại thử nghiệm một lần nữa khi tính đến ước tính cho quy mô và vị trí

Phương pháp phù hợp của phân phối có thể được sử dụng để ước tính các tham số của phân phối và thử nghiệm được lặp lại bằng cách sử dụng xác suất của phân phối ước tính

>>> norm.cdf[0]
0.5
7

Khi tính đến các tham số ước tính, chúng ta vẫn có thể bác bỏ giả thuyết rằng mẫu của chúng ta đến từ phân phối chuẩn [ở mức 5%], nhưng một lần nữa, với giá trị p là 0. 95, chúng ta không thể bác bỏ phân phối t

Kiểm tra đặc biệt cho phân phối bình thường

Vì phân phối chuẩn là phân phối phổ biến nhất trong thống kê nên có sẵn một số chức năng bổ sung để kiểm tra xem một mẫu có thể được rút ra từ phân phối chuẩn hay không

Đầu tiên, chúng tôi có thể kiểm tra xem độ lệch và độ nhọn của mẫu của chúng tôi có khác biệt đáng kể so với mẫu của phân phối chuẩn hay không

>>> norm.cdf[0]
0.5
8

Hai bài kiểm tra này được kết hợp trong bài kiểm tra tính quy tắc

>>> norm.cdf[0]
0.5
9

Trong cả ba thử nghiệm, giá trị p đều rất thấp và chúng ta có thể bác bỏ giả thuyết rằng mẫu của chúng ta có độ lệch và độ nhọn của phân phối chuẩn

Vì độ lệch và độ nhọn của mẫu của chúng tôi dựa trên các khoảnh khắc trung tâm, chúng tôi sẽ nhận được kết quả chính xác như vậy nếu chúng tôi kiểm tra mẫu đã chuẩn hóa

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
0

Bởi vì tính quy tắc bị từ chối mạnh mẽ, chúng tôi có thể kiểm tra xem normaltest có cho kết quả hợp lý cho các trường hợp khác không

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
1

Khi kiểm tra tính chuẩn tắc của một mẫu nhỏ các quan sát có phân phối t và một mẫu lớn các quan sát có phân phối chuẩn, thì trong cả hai trường hợp, chúng ta không thể bác bỏ giả thuyết không rằng mẫu xuất phát từ một phân phối chuẩn. Trong trường hợp đầu tiên, điều này là do thử nghiệm không đủ mạnh để phân biệt biến t và biến ngẫu nhiên phân phối chuẩn trong một mẫu nhỏ

So sánh hai mẫu

Trong phần sau đây, chúng tôi được cung cấp hai mẫu, có thể đến từ cùng một phân phối hoặc từ các phân phối khác nhau và chúng tôi muốn kiểm tra xem các mẫu này có cùng thuộc tính thống kê hay không

phương tiện so sánh

Thử nghiệm với mẫu có phương tiện giống hệt nhau

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
2

Thử nghiệm với mẫu bằng các phương tiện khác nhau

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
3

Thử nghiệm Kolmogorov-Smirnov cho hai mẫu ks_2samp

Ví dụ: khi cả hai mẫu được rút ra từ cùng một phân phối, chúng tôi không thể bác bỏ giả thuyết không, vì giá trị p cao

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
4

Trong ví dụ thứ hai, với vị trí khác, tôi. e. , có nghĩa là, chúng ta có thể bác bỏ giả thuyết không, vì giá trị p nhỏ hơn 1%

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
5

Ước tính mật độ hạt nhân

Một nhiệm vụ phổ biến trong thống kê là ước tính hàm mật độ xác suất [PDF] của một biến ngẫu nhiên từ một tập hợp các mẫu dữ liệu. Nhiệm vụ này được gọi là ước tính mật độ. Công cụ nổi tiếng nhất để làm điều này là biểu đồ. Biểu đồ là một công cụ hữu ích để trực quan hóa [chủ yếu là vì mọi người đều hiểu nó], nhưng không sử dụng dữ liệu có sẵn một cách hiệu quả. Ước tính mật độ hạt nhân [KDE] là một công cụ hiệu quả hơn cho cùng một nhiệm vụ. Công cụ ước tính có thể được sử dụng để ước tính PDF của dữ liệu đơn biến cũng như đa biến. Nó hoạt động tốt nhất nếu dữ liệu là đơn phương

ước lượng đơn biến

Chúng tôi bắt đầu với một lượng dữ liệu tối thiểu để xem cách thức hoạt động và tác dụng của các tùy chọn khác nhau để lựa chọn băng thông. Dữ liệu được lấy mẫu từ PDF được hiển thị dưới dạng dấu gạch ngang màu xanh lam ở dưới cùng của hình [đây được gọi là biểu đồ thảm]

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
6

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
7

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
8

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
9

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
0

Chúng tôi thấy rằng có rất ít sự khác biệt giữa Quy tắc của Scott và Quy tắc của Silverman và việc lựa chọn băng thông với lượng dữ liệu hạn chế có lẽ hơi quá rộng. Chúng tôi có thể xác định chức năng băng thông của riêng mình để có được kết quả ít mượt mà hơn

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
1

>>> norm.cdf[[-1., 0, 1]]
array[[ 0.15865525,  0.5,  0.84134475]]
>>> import numpy as np
>>> norm.cdf[np.array[[-1., 0, 1]]]
array[[ 0.15865525,  0.5,  0.84134475]]
8

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
3

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
0

Chúng tôi thấy rằng nếu chúng tôi đặt băng thông rất hẹp, ước tính thu được cho hàm mật độ xác suất [PDF] chỉ đơn giản là tổng Gaussian xung quanh mỗi điểm dữ liệu

Bây giờ chúng ta lấy một ví dụ thực tế hơn và xem xét sự khác biệt giữa hai quy tắc lựa chọn băng thông có sẵn. Các quy tắc đó được biết là hoạt động tốt đối với [gần giống] các bản phân phối bình thường, nhưng ngay cả đối với các bản phân phối không theo phương thức khá phi bình thường, chúng vẫn hoạt động khá tốt. Là một phân phối không bình thường, chúng tôi lấy phân phối T của Sinh viên với 5 bậc tự do

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
5

Bây giờ chúng ta xem xét một phân phối lưỡng thức với một đặc trưng Gaussian rộng hơn và hẹp hơn. Chúng tôi hy vọng rằng mật độ này sẽ khó ước tính hơn do các băng thông khác nhau cần thiết để giải quyết chính xác từng tính năng

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
6

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
7

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
8

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
9

>>> norm.ppf[0.5]
0.0
0

>>> norm.ppf[0.5]
0.0
1

>>> norm.ppf[0.5]
0.0
2

>>> norm.ppf[0.5]
0.0
3

Đúng như dự đoán, KDE không gần với PDF thực như chúng tôi mong muốn do kích thước đặc trưng khác nhau của hai tính năng của phân phối hai chế độ. Bằng cách giảm một nửa băng thông mặc định [

>>> from scipy.stats import norm
74], chúng tôi có thể làm tốt hơn một chút, trong khi sử dụng băng thông nhỏ hơn 5 lần so với băng thông mặc định không đủ mượt mà. Tuy nhiên, điều chúng ta thực sự cần trong trường hợp này là băng thông không đồng nhất [thích ứng]

ước lượng đa biến

Với chúng ta có thể thực hiện ước lượng đa biến, cũng như đơn biến. Chúng tôi chứng minh trường hợp hai biến. Đầu tiên, chúng tôi tạo một số dữ liệu ngẫu nhiên với một mô hình trong đó hai biến có tương quan với nhau

>>> norm.ppf[0.5]
0.0
4

>>> norm.ppf[0.5]
0.0
5

Sau đó, chúng tôi áp dụng KDE cho dữ liệu

>>> norm.ppf[0.5]
0.0
6

Cuối cùng, chúng tôi vẽ biểu đồ phân phối hai biến ước tính dưới dạng bản đồ màu và vẽ các điểm dữ liệu riêng lẻ ở trên cùng

>>> norm.ppf[0.5]
0.0
1

>>> norm.ppf[0.5]
0.0
8

>>> norm.ppf[0.5]
0.0
9

>>> norm.mean[], norm.std[], norm.var[]
[0.0, 1.0, 1.0]
>>> norm.stats[moments="mv"]
[array[0.0], array[1.0]]
0

Tương quan đồ thị đa tỷ lệ [MGC]

Với , chúng ta có thể kiểm tra tính độc lập trên dữ liệu chiều cao và phi tuyến tính. Trước khi bắt đầu, hãy nhập một số gói hữu ích

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
1

Hãy sử dụng chức năng vẽ biểu đồ tùy chỉnh để vẽ biểu đồ mối quan hệ dữ liệu

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
2

Trước tiên hãy xem xét một số dữ liệu tuyến tính

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
3

Mối quan hệ mô phỏng có thể được vẽ dưới đây

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
4

Bây giờ, chúng ta có thể thấy thống kê thử nghiệm, giá trị p và bản đồ MGC được hiển thị bên dưới. Tỷ lệ tối ưu được hiển thị trên bản đồ dưới dạng chữ “x” màu đỏ

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
5

Rõ ràng là MGC có thể xác định mối quan hệ giữa các ma trận dữ liệu đầu vào vì giá trị p rất thấp và thống kê kiểm tra MGC tương đối cao. Bản đồ MGC biểu thị mối quan hệ tuyến tính mạnh mẽ. Theo trực giác, điều này là do có nhiều hàng xóm hơn sẽ giúp xác định mối quan hệ tuyến tính giữa \[x\]\ . Tỷ lệ tối ưu trong trường hợp này tương đương với tỷ lệ toàn cầu, được đánh dấu bằng một điểm màu đỏ trên bản đồ. . The optimal scale in this case is equivalent to the global scale, marked by a red spot on the map.

Điều tương tự cũng có thể được thực hiện đối với tập dữ liệu phi tuyến tính. Các mảng sau \[x\]\[y\] .

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
6

Mối quan hệ mô phỏng có thể được vẽ dưới đây

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
7

Bây giờ, chúng ta có thể thấy thống kê thử nghiệm, giá trị p và bản đồ MGC được hiển thị bên dưới. Tỷ lệ tối ưu được hiển thị trên bản đồ dưới dạng chữ “x” màu đỏ

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
8

Rõ ràng từ đây, MGC có thể xác định lại mối quan hệ vì giá trị p rất thấp và thống kê kiểm tra MGC tương đối cao. Bản đồ MGC biểu thị mối quan hệ phi tuyến tính mạnh. Tỷ lệ tối ưu trong trường hợp này tương đương với tỷ lệ địa phương, được đánh dấu bằng một điểm màu đỏ trên bản đồ

Quasi-Monte Carlo

Trước khi nói về Quasi-Monte Carlo [QMC], giới thiệu sơ qua về Monte Carlo [MC]. Các phương pháp MC, hay các thí nghiệm MC, là một nhóm rộng các thuật toán tính toán dựa trên việc lấy mẫu ngẫu nhiên lặp đi lặp lại để thu được kết quả số. Khái niệm cơ bản là sử dụng tính ngẫu nhiên để giải quyết các vấn đề có thể mang tính quyết định về nguyên tắc. Chúng thường được sử dụng trong các bài toán vật lý và toán học và hữu ích nhất khi khó hoặc không thể sử dụng các phương pháp khác. Phương pháp MC chủ yếu được sử dụng trong ba lớp vấn đề. tối ưu hóa, tích hợp số và tạo rút thăm từ phân phối xác suất

Tạo số ngẫu nhiên với các thuộc tính cụ thể là một vấn đề phức tạp hơn âm thanh. Các phương pháp MC đơn giản được thiết kế để lấy mẫu các điểm độc lập và được phân phối giống hệt nhau [IID]. Nhưng việc tạo nhiều bộ điểm ngẫu nhiên có thể tạo ra các kết quả hoàn toàn khác nhau

Trong cả hai trường hợp trong biểu đồ trên, các điểm được tạo ngẫu nhiên mà không có bất kỳ kiến ​​thức nào về các điểm đã vẽ trước đó. Rõ ràng là một số vùng của không gian chưa được khám phá - điều này có thể gây ra sự cố trong mô phỏng vì một tập hợp điểm cụ thể có thể kích hoạt một hành vi hoàn toàn khác

Một lợi ích lớn của MC là nó có các thuộc tính hội tụ đã biết. Hãy nhìn vào giá trị trung bình của tổng bình phương trong 5 chiều

\[f[\mathbf{x}] = \left[ \sum_{j=1}^{5}x_j \right]^2,\]

với \[x_j \sim \mathcal{U}[0,1]\] . Nó có giá trị trung bình đã biết, \[\mu = 5/3+5[5-1]/4\] . Bằng cách sử dụng lấy mẫu MC, chúng tôi có thể tính giá trị trung bình đó bằng số và sai số gần đúng tuân theo tỷ lệ lý thuyết là \[O[n^{-1/2}]\].

Mặc dù sự hội tụ được đảm bảo, nhưng các học viên có xu hướng muốn có một quá trình khám phá mang tính quyết định hơn. Với MC thông thường, một hạt giống có thể được sử dụng để có quy trình lặp lại. Nhưng sửa chữa hạt giống sẽ phá vỡ tính chất hội tụ. một hạt giống nhất định có thể hoạt động cho một loại vấn đề nhất định và phá vỡ một vấn đề khác

Điều thường được thực hiện để đi qua không gian theo cách xác định là sử dụng lưới thông thường bao trùm tất cả các kích thước tham số, còn được gọi là thiết kế bão hòa. Hãy xem xét khối siêu khối đơn vị, với tất cả các giới hạn nằm trong khoảng từ 0 đến 1. Bây giờ, có khoảng cách bằng 0. 1 giữa các điểm, số điểm cần điền vào khoảng đơn vị sẽ là 10. Trong một siêu khối 2 chiều, khoảng cách giống nhau sẽ yêu cầu 100 và trong 3 chiều 1.000 điểm. Khi số chiều tăng lên, số lượng thử nghiệm cần thiết để lấp đầy không gian tăng theo cấp số nhân khi số chiều của không gian tăng lên. Sự tăng trưởng theo cấp số nhân này được gọi là “lời nguyền của chiều kích”

>>> norm.rvs[size=3]
array[[-0.35687759,  1.34347647, -0.11710531]]   # random
9

Để giảm thiểu vấn đề này, các phương pháp QMC đã được thiết kế. Chúng có tính xác định, có độ bao phủ không gian tốt và một số trong số chúng có thể được tiếp tục và giữ được các đặc tính tốt. Sự khác biệt chính với các phương pháp MC là các điểm không phải là IID nhưng chúng biết về các điểm trước đó. Do đó, một số phương pháp còn được gọi là trình tự

Con số này trình bày 2 bộ 256 điểm. Thiết kế bên trái là MC đơn giản trong khi thiết kế bên phải là thiết kế QMC sử dụng phương pháp Sobol’. Ta thấy rõ bản QMC đồng đều hơn. Các điểm lấy mẫu tốt hơn ở gần ranh giới và có ít cụm hoặc khoảng trống hơn

Một cách để đánh giá tính đồng nhất là sử dụng một biện pháp gọi là sự khác biệt. Ở đây, sự khác biệt về điểm Sobol’ tốt hơn so với MC thô

Quay lại tính toán giá trị trung bình, các phương pháp QMC cũng có tỷ lệ hội tụ lỗi tốt hơn. Họ có thể đạt được \[O[n^{-1}]\] đối với chức năng này và thậm chí đạt được tỷ lệ cao hơn đối với các chức năng rất mượt mà. Hình này cho thấy phương pháp Sobol’ có tỷ lệ \[O[n^{-1}]\] .

Chúng tôi tham khảo tài liệu về để biết thêm chi tiết toán học

Tính chênh lệch

Hãy xem xét hai tập hợp điểm. Từ hình bên dưới, rõ ràng là thiết kế bên trái chiếm nhiều không gian hơn thiết kế bên phải. Điều này có thể được định lượng bằng thước đo. Sự khác biệt càng thấp, mẫu càng đồng đều

>>> from scipy.stats import norm
00

Sử dụng động cơ QMC

Một số bộ lấy mẫu/công cụ QMC được triển khai. Ở đây chúng tôi xem xét hai trong số các phương pháp QMC được sử dụng nhiều nhất. và trình tự

>>> from scipy.stats import norm
01

Cảnh báo

Các phương pháp QMC yêu cầu sự quan tâm đặc biệt và người dùng phải đọc tài liệu để tránh những cạm bẫy phổ biến. Ví dụ, Sobol’ yêu cầu một số điểm theo lũy thừa 2. Ngoài ra, làm mỏng, đốt cháy hoặc chọn điểm khác có thể phá vỡ các thuộc tính của chuỗi và dẫn đến một tập hợp các điểm không tốt hơn MC

Động cơ QMC nhận biết trạng thái. Có nghĩa là bạn có thể tiếp tục trình tự, bỏ qua một số điểm hoặc đặt lại trình tự đó. Hãy lấy 5 điểm từ. Và sau đó yêu cầu một bộ 5 điểm thứ hai

>>> from scipy.stats import norm
02

Bây giờ chúng tôi thiết lập lại trình tự. Yêu cầu 5 điểm dẫn đến 5 điểm đầu tiên giống nhau

>>> from scipy.stats import norm
03

Và ở đây, chúng tôi nâng cao trình tự để có được cùng một bộ 5 điểm thứ hai

>>> from scipy.stats import norm
04

Ghi chú

Theo mặc định, cả hai và được xáo trộn. Các thuộc tính hội tụ tốt hơn và nó ngăn chặn sự xuất hiện của các đường vân hoặc các mẫu điểm đáng chú ý ở kích thước cao. Không có lý do thực tế nào để không sử dụng phiên bản được xáo trộn

Làm một động cơ QMC, tôi. e. , phân lớp
>>> from scipy.stats import norm
84

Để tạo của riêng bạn, một số phương pháp phải được xác định. Sau đây là một gói ví dụ

>>> from scipy.stats import norm
05

Sau đó, chúng tôi sử dụng nó như bất kỳ công cụ QMC nào khác

>>> from scipy.stats import norm
06

Hướng dẫn sử dụng QMC

  • QMC có quy tắc. Hãy chắc chắn đọc tài liệu hoặc bạn có thể không có lợi ích gì so với MC

  • Sử dụng nếu bạn cần chính xác \[2^m\] điểm.

  • cho phép lấy mẫu hoặc bỏ qua một số điểm tùy ý. Điều này phải trả giá bằng tốc độ hội tụ chậm hơn Sobol’

  • Không bao giờ loại bỏ các điểm đầu tiên của chuỗi. Nó sẽ phá hủy các thuộc tính

  • Tranh giành luôn tốt hơn

  • Nếu bạn sử dụng các phương pháp dựa trên LHS, bạn không thể thêm điểm mà không làm mất các thuộc tính của LHS. [Có một số phương pháp để làm như vậy, nhưng điều này không được thực hiện. ]

    Cách tính xác suất từ ​​hàm mật độ xác suất?

    Do đó, xác suất chỉ đơn giản là phép nhân giữa các giá trị mật độ xác suất [trục Y] và số tiền boa [trục X] . Phép nhân được thực hiện trên từng điểm đánh giá và các giá trị nhân này sau đó sẽ được cộng lại để tính xác suất cuối cùng.

    Làm cách nào để tính pmf bằng Python?

    binom. hàm pmf[] được sử dụng để lấy hàm khối lượng xác suất cho một giá trị nhất định của r, n và p . Chúng ta có thể có được phân phối bằng cách chuyển tất cả các giá trị có thể có của r[0 đến n].

    Làm cách nào để tính CDF bằng Python?

    Cách dễ nhất để tính xác suất CDF bình thường trong Python là sử dụng định mức. hàm cdf[] từ thư viện SciPy . Cái này là cái gì? . 96 trong phân phối chuẩn chuẩn gần bằng 0. 975.

Chủ Đề