Hàm phân phối tích lũy chung 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 norm07. 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 Show
Ghi chú. Tài liệu này đang được hoàn thiện
biến ngẫu nhiênCó 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 norm10. 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ả định 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 norm12 Để 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 norm13. 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 norm14, 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ếnCác phương pháp công cộng chính cho RV liên tục là
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 norm15 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 norm16, là hàm nghịch đảo của >>> from scipy.stats import norm15 >>> 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 norm18 >>> norm.rvs(size=3) array([-0.35687759, 1.34347647, -0.11710531]) # random Đừng nghĩ rằng >>> from scipy.stats import norm19 tạo ra 5 biến >>> from scipy.stats import norm0 Ở đây, >>> from scipy.stats import norm20 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 norm21, đâ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ênVẽ 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 norm1 Và sửa chữa hạt giống có thể được thực hiện như thế này >>> from scipy.stats import norm2 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 norm3 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 norm4 Để 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 norm21 và >>> from scipy.stats import norm28 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 norm5 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 norm29 có được thông qua phép biến đổi >>> from scipy.stats import norm30. Các giá trị mặc định là >>> from scipy.stats import norm31 và >>> from scipy.stats import norm32 Việc sử dụng thông minh >>> from scipy.stats import norm21 và >>> from scipy.stats import norm28 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 quy mô, >>> from scipy.stats import norm15 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 norm36, chúng ta sẽ có được tỷ lệ phù hợp >>> from scipy.stats import norm6 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 norm21 và/hoặc >>> from scipy.stats import norm28 để đạ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 norm7 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 norm19. 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 norm21. Hãy xem nào >>> from scipy.stats import norm8 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 norm19 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 norm42, vì giá trị mặc định là >>> from scipy.stats import norm43 Chúng tôi khuyên bạn nên đặt thông số >>> from scipy.stats import norm21 và >>> from scipy.stats import norm28 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ạngMặc dù 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 norm21 và >>> from scipy.stats import norm28, 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 norm28 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 norm9 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: inf0 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: inf1 Đóng băng một bản phân phốiVượt qua các từ khóa >>> from scipy.stats import norm21 và >>> from scipy.stats import norm28 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: inf2 Bằng cách sử dụng >>> from scipy.stats import norm51, 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 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: inf3 Đây thực sự là những gì chúng ta nên nhận được Phát thanh truyền hìnhCác phương thức cơ bản >>> from scipy.stats import norm52, 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: inf4 Ở đâ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: inf5 Nếu mảng có xác suất, tôi. e. , >>> from scipy.stats import norm54 và dãy bậc tự do i. e. , >>> from scipy.stats import norm55, 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: inf6 Điểm cụ thể cho các bản phân phối rời rạcPhâ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 norm52 được thay thế bằng hàm khối lượng xác suất >>> from scipy.stats import norm57, 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 norm28 không phải là tham số từ khóa hợp lệ. Tham số vị trí, từ khóa >>> from scipy.stats import norm21, 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 các 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: inf7 Để 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: inf8 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: inf9 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ợpCá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
Các vấn đề về hiệu suất và nhận xét thận trọngHiệ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 giải tích hoặc thông qua các hàm đặc biệt trong ____0_______60 hoặc ____0____22 cho ____0____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 norm63 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ạiCác bản phân phối trong >>> from scipy.stats import norm07 gần đây đã được sửa chữa và cải thiện và đạt được một bộ thử nghiệm đáng kể;
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 65Thự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 norm52 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 67Trong 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 norm69,
Bên cạnh đó, có một số yêu cầu khác để phương pháp này hoạt động
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 norm67 >>> 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: 190 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 định chi bình phương yêu cầu có một số 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: 191 >>> 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: 192 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: 193 Ở đâ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: 194 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: 195 >>> 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: 196 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 Kiểm định T và Kiểm định KSChú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: 197 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: 198 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: 199 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 mình 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.50 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.51 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ê kiểm tra, dựa trên giá trị p, Đuôi của phân phốiCuố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.52 >>> norm.cdf(0) 0.53 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.54 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.55 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.56 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, 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.57 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ườngVì 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.58 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.59 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 nhận được kết quả chính xác như vậy nếu chúng tôi kiểm tra mẫu được tiê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ẫuTrong 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ánhThử 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_2sampVí 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ânMộ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ếnChú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, thì ướ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á bất 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 hãy 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 yêu cầu để 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.00 >>> norm.ppf(0.5) 0.01 >>> norm.ppf(0.5) 0.02 >>> norm.ppf(0.5) 0.03 Đú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 norm74), 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 gấp 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ếnVớ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.04 >>> norm.ppf(0.5) 0.05 Sau đó, chúng tôi áp dụng KDE cho dữ liệu >>> norm.ppf(0.5) 0.06 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.01 >>> norm.ppf(0.5) 0.08 >>> norm.ppf(0.5) 0.09 >>> 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]) # random1 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]) # random2 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]) # random3 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]) # random4 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]) # random5 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\) và \ . 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\) và \(y\) . >>> norm.rvs(size=3) array([-0.35687759, 1.34347647, -0.11710531]) # random6 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]) # random7 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]) # random8 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 CarloTrướ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]) # random9 Để 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ệchHã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 norm00 Sử dụng động cơ QMCMộ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 norm01 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 norm02 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 norm03 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 norm04 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 norm05 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 norm06 Hướng dẫn sử dụng QMC
|