tất cả các bài tập trong bài viết này có thể được thực hiện trực tiếp trong trình duyệt thông qua trang web fundaml
số ngẫu nhiên đóng một vai trò cực kỳ quan trọng trong lập trình nói chung và lập trình máy học nói riêng.
Trong bài học này, chúng ta sẽ làm quen với các trình tạo số ngẫu nhiên cơ bản.
3.1. mảng ngẫu nhiên của các số được phân phối đồng đều
Một trong những điều quan trọng nhất khi lập trình bất kỳ ngôn ngữ nào là cách sử dụng các hàm ngẫu nhiên. Trong bài viết này, chúng ta sẽ làm quen với các hàm ngẫu nhiên trong numpy và cách sử dụng chúng trong các bài toán máy học.
3.1.1. function numpy.random.rand
hàm numpy.random.rand trả về một mảng các số ngẫu nhiên trong đó mỗi phần tử là một số ngẫu nhiên có phân bố đồng đều trong khoảng giữa [0, 1]):
-
nếu số lượng đầu vào là 0, hàm trả về một đại lượng vô hướng.
nếu có các mục nhập (là số nguyên dương), hàm này trả về một mảng ngẫu nhiên có kích thước bằng số mục nhập, mỗi kích thước bằng giá trị của các mục nhập.
3.1.2. function np.random.seed
Các ngôn ngữ lập trình nói chung không tạo ra các giá trị ‘thực sự ngẫu nhiên’. trên thực tế, nếu bạn mở python và bắt đầu bằng:
thì kết quả luôn là các số giống nhau mọi lúc (thoát khỏi python và thử lại nhiều lần). như trong máy tính của tôi kết quả luôn là 0.38919680466308004. do đó, hàm ngẫu nhiên không thực sự tạo ra các giá trị ngẫu nhiên. tuy nhiên, nếu chúng ta chạy hàm này nhiều lần, chúng ta sẽ nhận được các số trong phạm vi [0, 1) trong đó xác suất một điểm nằm trong khoảng [a, b] với 0 & lt; = a & lt; b & lt; 1 bằng b – a.
function np.random.seed () là một hàm được coi là để giúp khởi tạo các trình tạo ngẫu nhiên. biến trong hạt giống thường là một số nguyên không âm 32 bit. với các giá trị biến khác nhau, các số ngẫu nhiên khác nhau sẽ được tạo.
Chức năng này được sử dụng để so khớp kết quả trên các lần chạy khác nhau của các vấn đề học máy. nhiều thuật toán học máy chạy trên tính toán ngẫu nhiên (ví dụ, giảm độ dốc ngẫu nhiên được sử dụng rộng rãi trong tối ưu hóa mạng nơ-ron). Để so sánh kết quả qua nhiều lần chạy, thông thường người ta khởi chạy các trình tạo ngẫu nhiên với các hạt giống nhau.
Bạn có thể nhận thấy rằng trong các bài viết trước đây, tôi đã từng sử dụng np.random.seed (). làm điều này để đảm bảo kết quả bạn nhận được giống với mã mẫu.
bài tập: cho các số a, b, m, n trong đó a & lt; b là hai số thực bất kỳ; m, n là các số nguyên dương. viết hàm tạo mảng hai chiều có dạng = (m, n), có các phần tử là số ngẫu nhiên phân bố đồng đều trên khoảng giữa [a, b).
chú ý:
- Để kiểm tra xem mảng được trả về có phải là một mảng ngẫu nhiên của các phần tử ở giữa a ([a, b) ) hay không, tôi sẽ tính giá trị trung bình và phương sai của các phần tử trong mảng đó. Tôi biết rằng nếu (x ) là một biến ngẫu nhiên tuân theo phân phối chuẩn ở giữa khoảng ([a, b) ) thì nó sẽ có kỳ vọng và phương sai là: [ frac {b, lần lượt là: + a} {hai}; quad frac {(b-a) ^ 2} {12} ]
Lưu ý rằng đây chỉ là điều kiện cần, không phải là điều kiện đủ.
- nếu x là biến ngẫu nhiên tuân theo phân phối chuẩn trong khoảng giữa [0, 1) thì y = ax + b là biến ngẫu nhiên tuân theo phân phối chuẩn trong khoảng giữa [b, a + b ) nếu a là số dương hoặc [a + b, b) nếu a là số âm.
3.2. mảng ngẫu nhiên của các số được phân phối chuẩn
Phân phối chuẩn hoặc phân phối gassian rất quan trọng trong thực tế và trong các vấn đề kỹ thuật.
function numpy.random.randn () (n cuối cùng là viết tắt của normal) có cùng chức năng với np.random.rand nhưng trả về một mảng với các phần tử được phân phối theo tiêu chuẩn phân phối, nó có kỳ vọng là 0 và a phương sai.
bài tập: cho các số a, s, m, n với:
- a là một số thực bất kỳ.
- s là một số thực dương.
- m, n là các số nguyên dương.
Xây dựng ma trận ngẫu nhiên hai chiều có dạng = (m, n) có các phần tử được phân phối chuẩn với kỳ vọng bằng a và phương sai s.
lưu ý: ký hiệu ( mathcal {n} ( mu, sigma ^ 2) ) cho biết phân phối chuẩn dự kiến ( mu ) và phương thức sai ( sigma ^ 2 ). một biến ngẫu nhiên (x ) tuân theo phân phối chuẩn dự kiến ( mu ), phương sai ( sigma ^ 2 ) sẽ được biểu thị bằng (x sim mathcal {n} ( mu, sigma ^ 2) ).
if (x sim mathcal {n} ( mu, sigma ^ 2) ) thì:
- (x + a sim mathcal {n} ( mu + a, sigma ^ 2) ) trong đó (a ) là bất kỳ số thực nào.
- (kx sim mathcal {n} (k mu, k ^ 2 sigma ^ 2) ) trong đó (k ) là bất kỳ số thực nào.
3.3. mảng số nguyên ngẫu nhiên
hàm tạo cho mảng các số tự nhiên ngẫu nhiên. bạn đọc có thể tham khảo trực tiếp cách sử dụng trong tài liệu numpy:
lưu ý cụm từ phân phối “đồng nhất rời rạc”. điều này có nghĩa là mọi số nguyên trong phạm vi trung bình [thấp, cao] sẽ xuất hiện với cùng một xác suất. ví dụ:
Phần này không có bài tập.
3.4. hoán vị
Ví dụ trên nhằm mục đích tạo một mảng có 10 phần tử bao gồm các số tự nhiên từ 0 đến 9 được sắp xếp theo thứ tự ngẫu nhiên. mảng này còn được gọi là hoán vị của các số từ 0 đến 9.
hoán vị ngẫu nhiên được sử dụng rộng rãi khi xử lý dữ liệu trong học máy. đây là hai ví dụ điển hình.
3.4.1. giảm dần độ dốc ngẫu nhiên.
Trong quá trình giảm dần độ dốc ngẫu nhiên, điều quan trọng nhất là tại mỗi kỷ nguyên, chúng ta cần xáo trộn thứ tự của dữ liệu và lấy từng lô nhỏ trong đó. cụ thể, nếu tất cả dữ liệu được coi là ma trận, thì mỗi hàng là một điểm dữ liệu và có tổng số (n ) điểm. ở mỗi lần lặp, chúng tôi sẽ truy xuất một tập con gồm (k ) điểm dữ liệu, với (k ll n ) để cập nhật giải pháp. trong một kỷ nguyên, chúng ta phải đảm bảo rằng tất cả các điểm dữ liệu được truy xuất trong một số đợt nhỏ và không có điểm nào được truy xuất nhiều hơn một lần (giả sử (n ) chia hết cho (k )). và ngoài ra, việc trích xuất các lô nhỏ trong mỗi kỷ nguyên là khác nhau.
Điều này có thể được thực hiện bằng cách tạo một hoán vị ngẫu nhiên của các số từ (0 ) (thành (n-1 ) và coi chúng là chỉ số của các điểm dữ liệu. Trong lô nhỏ đầu tiên, chúng tôi truy xuất các hàng có chỉ số tương ứng với số đầu tiên (k ) trong hoán vị tìm được, và cứ tiếp tục như vậy cho đến khi truy xuất lô nhỏ cuối cùng, sau đó chúng tôi xáo trộn dữ liệu một lần nữa bằng một hoán vị ngẫu nhiên khác.
3.4.2. chia nhỏ dữ liệu đào tạo và kiểm tra
(bạn đọc có thể xem cách sử dụng trực tiếp thư viện tại đây)
Khi kiểm tra thuật toán học máy, người ta thường chia tập dữ liệu thu được thành hai phần: đào tạo và kiểm tra (có thể có thêm xác nhận). điều quan trọng là sự phân tách này được tạo ngẫu nhiên để ngăn dữ liệu bị phân tách quá lệch (lệch). và đây là nơi chúng ta có thể sử dụng hoán vị ngẫu nhiên.
Giả sử có 100 điểm dữ liệu, chúng ta cần loại bỏ ngẫu nhiên 70 điểm cho bài kiểm tra huấn luyện, 30 điểm còn lại làm bộ kiểm tra. cách đơn giản nhất là tạo một hoán vị ngẫu nhiên của các số từ 0 đến 99. Sau đó 70 điểm được lập chỉ mục từ 70 phần tử đầu tiên của ma trận hoán vị được sử dụng làm tập huấn luyện, 30 điểm còn lại được sử dụng làm tập kiểm tra.
bài tập: cho hai số tự nhiên n & gt; k & gt; 0 viết một hàm sample_no_replace (n, k) trả về ngẫu nhiên k số tự nhiên trong tập {0, 1, …, n-1} sao cho không có hai số nào giống nhau.
tính ngẫu nhiên ở đây sẽ được kiểm tra bằng cách gọi sample_no_replace (n, k) nhiều lần. trong tất cả các kết quả trả về, tần suất xuất hiện của mỗi số trong tập hợp {0, 1, …, n-1} phải gần như bằng nhau.
giả sử x là một ma trận chứa n điểm dữ liệu trong các hàng. nếu idx = sample_no_replace (n, k) là kết quả trả về của hàm bạn đã viết, thì x [idx, 🙂 có thể lấy k điểm ngẫu nhiên từ x.
(còn nữa)