Việc sử dụng tính ngẫu nhiên là một phần quan trọng trong cấu hình và đánh giá các thuật toán học máy Show
Từ việc khởi tạo ngẫu nhiên các trọng số trong mạng nơ-ron nhân tạo, đến việc chia dữ liệu thành các tập kiểm tra và huấn luyện ngẫu nhiên, đến việc xáo trộn ngẫu nhiên tập dữ liệu huấn luyện theo phương pháp giảm dần độ dốc ngẫu nhiên, tạo ra các số ngẫu nhiên và khai thác tính ngẫu nhiên là một kỹ năng bắt buộc Trong hướng dẫn này, bạn sẽ khám phá cách tạo và làm việc với các số ngẫu nhiên trong Python Sau khi hoàn thành hướng dẫn này, bạn sẽ biết
Bắt đầu dự án của bạn với cuốn sách mới của tôi Statistics for Machine Learning, bao gồm các hướng dẫn từng bước và các tệp mã nguồn Python cho tất cả các ví dụ Bắt đầu nào Cách tạo số ngẫu nhiên trong Python Hướng dẫn tổng quanHướng dẫn này được chia thành 3 phần;
1. Trình tạo số giả ngẫu nhiênNguồn gốc của tính ngẫu nhiên mà chúng tôi đưa vào các chương trình và thuật toán của mình là một thủ thuật toán học được gọi là trình tạo số giả ngẫu nhiên Trình tạo số ngẫu nhiên là một hệ thống tạo các số ngẫu nhiên từ một nguồn ngẫu nhiên thực sự. Thường thì một cái gì đó vật lý, chẳng hạn như bộ đếm Geiger, trong đó kết quả được chuyển thành số ngẫu nhiên. Chúng ta không cần sự ngẫu nhiên thực sự trong học máy. Thay vào đó chúng ta có thể sử dụng giả ngẫu nhiên. Giả ngẫu nhiên là một mẫu số trông gần giống với ngẫu nhiên, nhưng được tạo bằng một quy trình xác định Xáo trộn dữ liệu và khởi tạo hệ số với các giá trị ngẫu nhiên sử dụng trình tạo số giả ngẫu nhiên. Những chương trình nhỏ này thường là một hàm mà bạn có thể gọi sẽ trả về một số ngẫu nhiên. Được gọi lại, họ sẽ trả về một số ngẫu nhiên mới. Các hàm trình bao bọc cũng thường có sẵn và cho phép bạn lấy tính ngẫu nhiên của mình dưới dạng số nguyên, dấu phẩy động, trong một phân phối cụ thể, trong một phạm vi cụ thể, v.v. Các số được tạo theo trình tự. Trình tự là xác định và được gieo với một số ban đầu. Nếu bạn không chọn một cách rõ ràng trình tạo số giả ngẫu nhiên, thì nó có thể sử dụng thời gian hệ thống hiện tại tính bằng giây hoặc mili giây làm nguồn gốc Giá trị của hạt giống không quan trọng. Chọn bất cứ điều gì bạn muốn. Điều quan trọng là quá trình gieo giống nhau sẽ dẫn đến cùng một chuỗi số ngẫu nhiên Hãy làm cho điều này cụ thể với một số ví dụ 2. Số ngẫu nhiên với Thư viện chuẩn PythonThư viện chuẩn Python cung cấp một mô-đun có tên ngẫu nhiên cung cấp một bộ hàm để tạo số ngẫu nhiên Python sử dụng một trình tạo số giả ngẫu nhiên phổ biến và mạnh mẽ được gọi là Mersenne Twister Trong phần này, chúng ta sẽ xem xét một số trường hợp sử dụng để tạo và sử dụng số ngẫu nhiên và tính ngẫu nhiên với API Python tiêu chuẩn Cần trợ giúp về Thống kê cho Machine Learning?Tham gia khóa học xử lý sự cố email miễn phí trong 7 ngày của tôi ngay bây giờ (có mã mẫu) Nhấp để đăng ký và cũng nhận được phiên bản PDF Ebook miễn phí của khóa học Tải xuống khóa học nhỏ MIỄN PHÍ của bạn Seed Trình tạo số ngẫu nhiênTrình tạo số giả ngẫu nhiên là một hàm toán học tạo ra một chuỗi các số gần như ngẫu nhiên Nó nhận một tham số để bắt đầu chuỗi, được gọi là hạt giống. Hàm này mang tính xác định, nghĩa là được cung cấp cùng một hạt giống, nó sẽ tạo ra cùng một dãy số mỗi lần. Lựa chọn hạt giống không quan trọng Hàm seed() sẽ khởi tạo trình tạo số giả ngẫu nhiên, lấy một giá trị số nguyên làm đối số, chẳng hạn như 1 hoặc 7. Nếu hàm seed() không được gọi trước khi sử dụng tính ngẫu nhiên, thì mặc định là sử dụng thời gian hệ thống hiện tại tính bằng mili giây từ epoch (1970) Ví dụ dưới đây minh họa việc gieo hạt cho trình tạo số giả ngẫu nhiên, tạo ra một số số ngẫu nhiên và cho thấy rằng việc gieo lại bộ tạo sẽ dẫn đến cùng một chuỗi số được tạo 1 2 3 4 5 6 7 8 9 10 11 # gieo trình tạo số giả ngẫu nhiên từ ngẫu nhiên nhập hạt từ ngẫu nhiên nhập ngẫu nhiên # trình tạo số ngẫu nhiên hạt giống hạt(1) # tạo một số số ngẫu nhiên in(ngẫu nhiên(), random(), random()) # đặt lại hạt giống hạt(1) # tạo một số số ngẫu nhiên in(ngẫu nhiên(), random(), random()) Chạy ví dụ khởi tạo trình tạo số giả ngẫu nhiên với giá trị 1, tạo 3 số ngẫu nhiên, tạo lại trình tạo và cho thấy rằng ba số ngẫu nhiên giống nhau được tạo 1 2 0. 13436424411240122 0. 8474337369372327 0. 763774618976614 0. 13436424411240122 0. 8474337369372327 0. 763774618976614 Có thể hữu ích để kiểm soát tính ngẫu nhiên bằng cách đặt hạt giống để đảm bảo rằng mã của bạn tạo ra cùng một kết quả mỗi lần, chẳng hạn như trong một mô hình sản xuất Đối với các thử nghiệm đang chạy trong đó ngẫu nhiên hóa được sử dụng để kiểm soát các biến gây nhiễu, có thể sử dụng một hạt giống khác cho mỗi lần chạy thử nghiệm Giá trị dấu phẩy động ngẫu nhiênCác giá trị dấu phẩy động ngẫu nhiên có thể được tạo bằng hàm random(). Các giá trị sẽ được tạo trong phạm vi từ 0 đến 1, cụ thể là trong khoảng [0,1) Các giá trị được rút ra từ một phân phối đồng đều, nghĩa là mỗi giá trị có cơ hội được rút ra như nhau Ví dụ dưới đây tạo ra 10 giá trị dấu phẩy động ngẫu nhiên 1 2 3 4 5 6 7 8 9 # tạo các giá trị dấu phẩy động ngẫu nhiên từ ngẫu nhiên nhập hạt từ ngẫu nhiên nhập ngẫu nhiên # trình tạo số ngẫu nhiên hạt giống hạt(1) # tạo số ngẫu nhiên trong khoảng 0-1 cho _ trong phạm vi(10): giá trị = ngẫu nhiên() in(giá trị) Chạy ví dụ tạo và in từng giá trị dấu phẩy động ngẫu nhiên 1 2 3 4 5 6 7 8 9 10 0. 13436424411240122 0. 8474337369372327 0. 763774618976614 0. 2550690257394217 0. 49543508709194095 0. 4494910647887381 0. 651592972722763 0. 7887233511355132 0. 0938595867742349 0. 02834747652200631 Các giá trị dấu phẩy động có thể được thay đổi tỷ lệ thành một phạm vi mong muốn bằng cách nhân chúng với kích thước của phạm vi mới và thêm giá trị tối thiểu, như sau 1 giá trị tỷ lệ = tối thiểu + (giá trị * (tối đa - tối thiểu)) Trong đó tối thiểu và tối đa lần lượt là các giá trị tối thiểu và tối đa của phạm vi mong muốn và giá trị là giá trị dấu phẩy động được tạo ngẫu nhiên trong phạm vi từ 0 đến 1 Giá trị số nguyên ngẫu nhiênCác giá trị số nguyên ngẫu nhiên có thể được tạo bằng hàm randint() Hàm này nhận hai đối số. bắt đầu và kết thúc phạm vi cho các giá trị số nguyên được tạo. Các số nguyên ngẫu nhiên được tạo trong và bao gồm giá trị bắt đầu và kết thúc của phạm vi, cụ thể là trong khoảng [bắt đầu, kết thúc]. Các giá trị ngẫu nhiên được rút ra từ một phân phối thống nhất Ví dụ bên dưới tạo ra 10 giá trị số nguyên ngẫu nhiên trong khoảng từ 0 đến 10 1 2 3 4 5 6 7 8 9 # tạo các giá trị số nguyên ngẫu nhiên từ ngẫu nhiên nhập hạt từ ngẫu nhiên nhập ngẫu nhiên # trình tạo số ngẫu nhiên hạt giống hạt(1) # tạo ra một số số nguyên cho _ trong phạm vi(10): giá trị = randint(0, 10) in(giá trị) Chạy ví dụ tạo và in 10 giá trị số nguyên ngẫu nhiên 1 2 3 4 5 6 7 8 9 10 2 9 1 4 1 7 7 7 10 6 Giá trị Gaussian ngẫu nhiênCác giá trị dấu phẩy động ngẫu nhiên có thể được rút ra từ phân phối Gaussian bằng hàm gauss() Hàm này nhận hai đối số tương ứng với các tham số kiểm soát kích thước của phân phối, cụ thể là giá trị trung bình và độ lệch chuẩn Ví dụ dưới đây tạo ra 10 giá trị ngẫu nhiên được rút ra từ phân phối Gaussian với giá trị trung bình là 0. 0 và độ lệch chuẩn là 1. 0 Lưu ý rằng các tham số này không phải là giới hạn của các giá trị và mức độ phân tán của các giá trị sẽ được kiểm soát bởi hình dạng chuông của phân phối, trong trường hợp này có khả năng tương ứng ở trên và dưới 0. 0 1 2 3 4 5 6 7 8 9 # tạo các giá trị Gaussian ngẫu nhiên từ ngẫu nhiên nhập hạt từ ngẫu nhiên nhập gauss # trình tạo số ngẫu nhiên hạt giống hạt(1) # tạo một số giá trị Gaussian cho _ trong phạm vi(10): giá trị = gauss(0, 1) in(giá trị) Chạy ví dụ tạo và in 10 giá trị ngẫu nhiên Gaussian 1 2 3 4 5 6 7 8 9 10 1. 2881847531554629 1. 449445608699771 0. 06633580893826191 -0. 7645436509716318 -1. 0921732151041414 0. 03133451683171687 -1. 022103170010873 -1. 4368294451025299 0. 19931197648375384 0. 13337460465860485 Chọn ngẫu nhiên từ một danh sáchSố ngẫu nhiên có thể được sử dụng để chọn ngẫu nhiên một mục từ danh sách Ví dụ: nếu một danh sách có 10 mục có chỉ số từ 0 đến 9, thì bạn có thể tạo một số nguyên ngẫu nhiên từ 0 đến 9 và sử dụng nó để chọn ngẫu nhiên một mục từ danh sách. Hàm choice() thực hiện hành vi này cho bạn. Lựa chọn được thực hiện với một khả năng thống nhất Ví dụ dưới đây tạo danh sách 20 số nguyên và đưa ra 5 ví dụ về cách chọn một mục ngẫu nhiên từ danh sách 1 2 3 4 5 6 7 8 9 10 11 12 # chọn một phần tử ngẫu nhiên từ danh sách từ ngẫu nhiên nhập hạt từ ngẫu nhiên nhập lựa chọn # trình tạo số ngẫu nhiên hạt giống hạt(1) # chuẩn bị trình tự chuỗi = [i cho i in range(20)] in(trình tự) # đưa ra lựa chọn từ trình tự cho _ trong phạm vi(5): lựa chọn = lựa chọn(trình tự) in(lựa chọn) Chạy ví dụ đầu tiên in danh sách các giá trị số nguyên, tiếp theo là năm ví dụ chọn và in một giá trị ngẫu nhiên từ danh sách 1 2 3 4 5 6 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 4 18 2 8 3 Mẫu phụ ngẫu nhiên từ danh sáchChúng tôi có thể quan tâm đến việc lặp lại lựa chọn ngẫu nhiên các mục từ danh sách để tạo một tập hợp con được chọn ngẫu nhiên Điều quan trọng là sau khi một mục được chọn từ danh sách và được thêm vào tập hợp con, mục đó sẽ không được thêm lại. Điều này được gọi là lựa chọn mà không cần thay thế bởi vì một khi một mục từ danh sách được chọn cho tập hợp con, nó sẽ không được thêm lại vào danh sách ban đầu (i. e. không được cung cấp để lựa chọn lại) Hành vi này được cung cấp trong hàm sample() để chọn một mẫu ngẫu nhiên từ danh sách mà không cần thay thế. Hàm lấy cả danh sách và kích thước của tập hợp con để chọn làm đối số. Lưu ý rằng các mục không thực sự bị xóa khỏi danh sách gốc, chỉ được chọn vào một bản sao của danh sách Ví dụ dưới đây minh họa việc chọn một tập hợp con gồm năm mục từ danh sách 20 số nguyên 1 2 3 4 5 6 7 8 9 10 11 # chọn một mẫu ngẫu nhiên mà không cần thay thế từ ngẫu nhiên nhập hạt từ ngẫu nhiên nhập mẫu # trình tạo số ngẫu nhiên hạt giống hạt(1) # chuẩn bị trình tự chuỗi = [i cho i in range(20)] in(trình tự) # chọn một tập hợp con mà không cần thay thế tập con = mẫu(dãy, 5) in(tập hợp con) Chạy ví dụ đầu tiên in danh sách các giá trị số nguyên, sau đó mẫu ngẫu nhiên được chọn và in để so sánh 1 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [4, 18, 2, 8, 3] Xáo trộn ngẫu nhiên một danh sáchTính ngẫu nhiên có thể được sử dụng để xáo trộn danh sách các mục, giống như xáo trộn một cỗ bài Hàm shuffle() có thể được sử dụng để xáo trộn danh sách. Xáo trộn được thực hiện tại chỗ, nghĩa là danh sách được cung cấp làm đối số cho hàm shuffle() được xáo trộn chứ không phải là bản sao đã xáo trộn của danh sách được tạo và trả về Ví dụ dưới đây minh họa việc xáo trộn ngẫu nhiên danh sách các giá trị số nguyên 1 2 3 4 5 6 7 8 9 10 11 # xáo trộn ngẫu nhiên một chuỗi từ ngẫu nhiên nhập hạt từ ngẫu nhiên nhập xáo trộn # trình tạo số ngẫu nhiên hạt giống hạt(1) # chuẩn bị trình tự chuỗi = [i cho i in range(20)] in(trình tự) # xáo trộn ngẫu nhiên trình tự xáo trộn(trình tự) in(trình tự) Chạy ví dụ đầu tiên in danh sách các số nguyên, sau đó in danh sách tương tự sau khi nó được xáo trộn ngẫu nhiên 1 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [11, 5, 17, 19, 9, 0, 16, 1, 15, 6, 10, 13, 14, 12, 7, 3, 8, 2, 18, 4] 3. Số ngẫu nhiên với NumPyTrong học máy, bạn có thể sử dụng các thư viện như scikit-learning và Keras Các thư viện này sử dụng NumPy dưới vỏ bọc, một thư viện giúp làm việc với các vectơ và ma trận số rất hiệu quả NumPy cũng có triển khai riêng của trình tạo số giả ngẫu nhiên và các hàm bao bọc tiện lợi NumPy cũng triển khai trình tạo số giả ngẫu nhiên Mersenne Twister Hãy xem xét một số ví dụ về tạo số ngẫu nhiên và sử dụng tính ngẫu nhiên với mảng NumPy Seed Trình tạo số ngẫu nhiênTrình tạo số giả ngẫu nhiên NumPy khác với trình tạo số giả ngẫu nhiên của thư viện chuẩn Python Điều quan trọng, việc khởi tạo trình tạo số giả ngẫu nhiên Python không ảnh hưởng đến trình tạo số giả ngẫu nhiên NumPy. Nó phải được gieo hạt và sử dụng riêng Hàm seed() có thể được sử dụng để khởi tạo trình tạo số giả ngẫu nhiên NumPy, lấy một số nguyên làm giá trị hạt giống Ví dụ dưới đây trình bày cách khởi tạo trình tạo và cách tạo lại trình tạo sẽ dẫn đến cùng một chuỗi số ngẫu nhiên được tạo 1 2 3 4 5 6 7 8 9 10 11 # gieo trình tạo số giả ngẫu nhiên từ numpy. ngẫu nhiên nhập hạt từ numpy. ngẫu nhiên nhập ranh giới # trình tạo số ngẫu nhiên hạt giống hạt(1) # tạo một số số ngẫu nhiên in(rand(3)) # đặt lại hạt giống hạt(1) # tạo một số số ngẫu nhiên in(rand(3)) Chạy ví dụ khởi tạo trình tạo số giả ngẫu nhiên, in ra một chuỗi các số ngẫu nhiên, sau đó khởi tạo lại trình tạo cho thấy rằng chuỗi số ngẫu nhiên chính xác được tạo ra 1 2 [4. 17022005e-01 7. 20324493e-01 1. 14374817e-04] [4. 17022005e-01 7. 20324493e-01 1. 14374817e-04] Mảng các giá trị dấu phẩy động ngẫu nhiênMột mảng các giá trị dấu phẩy động ngẫu nhiên có thể được tạo bằng hàm rand() NumPy Nếu không có đối số nào được cung cấp, thì một giá trị ngẫu nhiên duy nhất sẽ được tạo, nếu không thì kích thước của mảng có thể được chỉ định Ví dụ dưới đây tạo một mảng gồm 10 giá trị dấu phẩy động ngẫu nhiên được rút ra từ một phân phối đồng nhất 1 2 3 4 5 6 7 8 # tạo các giá trị dấu phẩy động ngẫu nhiên từ numpy. ngẫu nhiên nhập hạt từ numpy. ngẫu nhiên nhập ranh giới # trình tạo số ngẫu nhiên hạt giống hạt(1) # tạo số ngẫu nhiên trong khoảng 0-1 giá trị = rand(10) in(giá trị) Chạy ví dụ này sẽ tạo và in mảng NumPy gồm các giá trị dấu chấm động ngẫu nhiên 1 2 3 [4. 17022005e-01 7. 20324493e-01 1. 14374817e-04 3. 02332573e-01 1. 46755891e-01 9. 23385948e-02 1. 86260211e-01 3. 45560727e-01 3. 96767474e-01 5. 38816734e-01] Mảng giá trị số nguyên ngẫu nhiênMột mảng các số nguyên ngẫu nhiên có thể được tạo bằng hàm randint() NumPy Hàm này nhận ba đối số, đầu dưới của dải ô, đầu trên của dải ô và số lượng giá trị số nguyên cần tạo hoặc kích thước của mảng. Các số nguyên ngẫu nhiên sẽ được rút ra từ một phân phối đồng nhất bao gồm giá trị thấp hơn và không bao gồm giá trị cao hơn, e. g. trong khoảng [dưới, trên) Ví dụ dưới đây minh họa việc tạo một mảng các số nguyên ngẫu nhiên 1 2 3 4 5 6 7 8 # tạo các giá trị số nguyên ngẫu nhiên từ numpy. ngẫu nhiên nhập hạt từ numpy. ngẫu nhiên nhập ngẫu nhiên # trình tạo số ngẫu nhiên hạt giống hạt(1) # tạo ra một số số nguyên giá trị = randint(0, 10, 20) in(giá trị) Chạy ví dụ này sẽ tạo và in một mảng gồm 20 giá trị số nguyên ngẫu nhiên trong khoảng từ 0 đến 10 1 [5 8 9 5 0 0 1 7 6 9 2 4 5 2 4 2 4 7 7 9] Mảng các giá trị Gaussian ngẫu nhiênMột mảng các giá trị Gaussian ngẫu nhiên có thể được tạo bằng hàm randn() NumPy Hàm này nhận một đối số duy nhất để chỉ định kích thước của mảng kết quả. Các giá trị Gaussian được rút ra từ phân phối Gaussian tiêu chuẩn; . 0 và độ lệch chuẩn là 1. 0 Ví dụ dưới đây cho thấy cách tạo một mảng các giá trị Gaussian ngẫu nhiên 1 2 3 4 5 6 7 8 # tạo các giá trị Gaussian ngẫu nhiên từ numpy. ngẫu nhiên nhập hạt từ numpy. ngẫu nhiên nhập randn # trình tạo số ngẫu nhiên hạt giống hạt(1) # tạo một số giá trị Gaussian giá trị = randn(10) in(giá trị) Chạy ví dụ này sẽ tạo và in một mảng gồm 10 giá trị ngẫu nhiên từ phân phối Gaussian tiêu chuẩn 1 2 [ 1. 62434536 -0. 61175641 -0. 52817175 -1. 07296862 0. 86540763 -2. 3015387 1. 74481176 -0. 7612069 0. 3190391 -0. 24937038] Các giá trị từ phân phối Gaussian tiêu chuẩn có thể được chia tỷ lệ bằng cách nhân giá trị với độ lệch chuẩn và thêm giá trị trung bình từ phân phối theo tỷ lệ mong muốn. Ví dụ 1 giá trị tỷ lệ = trung bình + giá trị * stdev Trong đó giá trị trung bình và tiêu chuẩn là giá trị trung bình và độ lệch chuẩn cho phân phối Gaussian theo tỷ lệ mong muốn và giá trị là giá trị được tạo ngẫu nhiên từ phân phối Gaussian tiêu chuẩn Xáo trộn mảng NumPyMột mảng NumPy có thể được xáo trộn ngẫu nhiên tại chỗ bằng hàm shuffle() NumPy Ví dụ dưới đây trình bày cách xáo trộn một mảng NumPy 1 2 3 4 5 6 7 8 9 10 11 # xáo trộn ngẫu nhiên một chuỗi từ numpy. ngẫu nhiên nhập hạt từ numpy. ngẫu nhiên nhập xáo trộn # trình tạo số ngẫu nhiên hạt giống hạt(1) # chuẩn bị trình tự chuỗi = [i cho i in range(20)] in(trình tự) # xáo trộn ngẫu nhiên trình tự xáo trộn(trình tự) in(trình tự) Trước tiên, chạy ví dụ này sẽ tạo danh sách gồm 20 giá trị số nguyên, sau đó xáo trộn và in mảng đã xáo trộn |