np.random.seed(0)
membuat angka acak dapat diprediksi
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55, 0.72, 0.6 , 0.54])
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55, 0.72, 0.6 , 0.54])
Dengan reset benih (setiap kali), sama set nomor akan muncul setiap kali.
Jika seed acak tidak diatur ulang, nomor yang berbeda akan muncul di setiap permintaan:
>>> numpy.random.rand(4)
array([ 0.42, 0.65, 0.44, 0.89])
>>> numpy.random.rand(4)
array([ 0.96, 0.38, 0.79, 0.53])
(pseudo-) angka acak bekerja dengan mulai dengan angka (seed), mengalikannya dengan angka besar, menambahkan offset, kemudian mengambil modulo dari jumlah itu. Angka yang dihasilkan kemudian digunakan sebagai benih untuk menghasilkan nomor "acak" berikutnya. Ketika Anda mengatur seed (setiap waktu), ia melakukan hal yang sama setiap kali, memberi Anda nomor yang sama.
Jika Anda menginginkan angka yang tampaknya acak, jangan atur seed. Namun, jika Anda memiliki kode yang menggunakan angka acak yang ingin Anda debug, akan sangat membantu untuk mengatur seed sebelum setiap kali dijalankan sehingga kode tersebut melakukan hal yang sama setiap kali Anda menjalankannya.
Untuk mendapatkan nomor paling acak untuk setiap proses, hubungi numpy.random.seed()
. Ini akan menyebabkan numpy untuk mengatur seed ke nomor acak yang diperoleh dari /dev/urandom
atau analog Windows-nya atau, jika tidak ada yang tersedia, ia akan menggunakan jam.
Untuk informasi lebih lanjut tentang menggunakan benih untuk menghasilkan angka pseudo-random, lihat wikipedia .
numpy.random.seed(None)
, itu "akan mencoba membaca data dari / dev / urandom (atau analog Windows) jika tersedia atau seeded dari jam sebaliknya".numpy.random.seed(None)
. Saya memperbarui jawabannya dengan info itu dan tautan ke dokumen.seed
, kompatibel.Jika Anda mengatur
np.random.seed(a_fixed_number)
setiap kali Anda memanggil fungsi acak numpy lainnya, hasilnya akan sama:Namun, jika Anda hanya memanggilnya sekali dan menggunakan berbagai fungsi acak, hasilnya akan tetap berbeda:
sumber
np.random
panggilan berikutnya sampai seed diubah? Harus memanggilnya setiap kali tampaknya tidak perlu dan mudah untuk dilupakan.def seed_first(fun, seed=0):
|\tdef wrapped(*args, **kwargs):
|\t\tnp.random.seed(seed)
|\t\treturn fun(*args, **kwargs)
|\treturn wrapped
, dan kemudianfor m in np.random.__all__:
|\tif m != 'seed':
|\t\tsetattr(np.random, m, seed_first(getattr(np.random, m)))
Namun, ini bisa menyebabkan bug yang sangat halus dan perilaku aneh dalam jangka panjang. (Ganti dengan empat spasi, dan | dengan jeda baris ...)np.random.seed()
satu kali di awal program akan selalu menghasilkan hasil yang sama untuk seed yang sama karena pemanggilannp.random
fungsi selanjutnya secara deterministik akan mengubah seed untuk pemanggilan selanjutnya. Memanggilnp.random.seed()
sebelum setiap panggilan kenp.random
fungsi mungkin akan menghasilkan hasil yang tidak diinginkan.Seperti disebutkan, numpy.random.seed (0) menetapkan seed acak ke 0, sehingga angka acak semu yang Anda dapatkan dari acak akan mulai dari titik yang sama. Ini bisa baik untuk men-debug dalam beberapa kasus. NAMUN, setelah membaca beberapa kali, ini tampaknya cara yang salah untuk melakukannya, jika Anda memiliki utas karena bukan utas yang aman.
dari perbedaan-antara-numpy-acak-dan-acak-acak-di-python :
contoh cara melakukannya:
dapat memberi:
Terakhir, perhatikan bahwa mungkin ada kasus di mana inisialisasi ke 0 (sebagai lawan dari seed yang tidak memiliki semua bit 0) dapat mengakibatkan distribusi yang tidak seragam untuk beberapa iterasi pertama karena cara xor bekerja, tetapi ini tergantung pada algoritma , dan berada di luar kekhawatiran saya saat ini dan ruang lingkup pertanyaan ini.
sumber
Saya sudah sering menggunakan ini dalam jaringan saraf. Diketahui bahwa ketika kita mulai melatih jaringan saraf kita secara acak menginisialisasi bobot. Model dilatih tentang bobot ini pada dataset tertentu. Setelah sejumlah zaman, Anda mendapatkan serangkaian bobot yang terlatih.
Sekarang anggaplah Anda ingin melatih lagi dari awal atau Anda ingin meneruskan model itu kepada orang lain untuk mereproduksi hasil Anda, bobot akan kembali diinisialisasi ke angka acak yang sebagian besar akan berbeda dari yang sebelumnya. Bobot terlatih yang diperoleh setelah jumlah zaman yang sama (menyimpan data yang sama dan parameter lainnya) seperti yang sebelumnya akan berbeda. Masalahnya adalah model Anda tidak lagi dapat direproduksi. Setiap kali Anda melatih model Anda dari awal, model itu memberi Anda set bobot yang berbeda. Ini karena model diinisialisasi dengan angka acak yang berbeda setiap kali.
Bagaimana jika setiap kali Anda memulai pelatihan dari awal, model diinisialisasi ke set bobot inisialisasi acak yang sama? Dalam hal ini model Anda dapat direproduksi. Ini dicapai oleh numpy.random.seed (0). Dengan menyebutkan seed () ke nomor tertentu, Anda selalu bergantung pada set angka acak yang sama.
sumber
Bayangkan Anda menunjukkan kepada seseorang cara membuat kode dengan sekelompok angka "acak". Dengan menggunakan benih numpy, mereka dapat menggunakan nomor benih yang sama dan mendapatkan set angka "acak" yang sama.
Jadi itu tidak benar-benar acak karena suatu algoritma mengeluarkan angka tetapi sepertinya banyak yang dihasilkan secara acak.
sumber
Benih acak menentukan titik awal ketika komputer menghasilkan urutan nomor acak.
Misalnya, katakanlah Anda ingin membuat angka acak di Excel (Catatan: Excel menetapkan batas 9999 untuk seed). Jika Anda memasukkan nomor ke kotak Benih Acak selama proses, Anda akan dapat menggunakan set angka acak yang sama lagi. Jika Anda mengetik "77" ke dalam kotak, dan mengetik "77" saat berikutnya Anda menjalankan generator angka acak, Excel akan menampilkan set angka acak yang sama. Jika Anda mengetik "99", Anda akan mendapatkan serangkaian angka yang sama sekali berbeda. Tetapi jika Anda kembali ke seed of 77, maka Anda akan mendapatkan set angka acak yang sama dengan yang Anda mulai.
Misalnya, "ambil angka x, tambahkan 900 + x, lalu kurangi 52." Agar proses dimulai, Anda harus menentukan nomor awal, x (seed). Mari kita mulai nomor 77:
Tambahkan 900 + 77 = 977 Kurangi 52 = 925 Mengikuti algoritma yang sama, angka "acak" kedua adalah:
900 + 925 = 1825 Kurangi 52 = 1773 Contoh sederhana ini mengikuti sebuah pola, tetapi algoritma di balik pembuatan nomor komputer jauh lebih rumit
sumber
Semua angka acak yang dihasilkan setelah menetapkan nilai seed tertentu sama di semua platform / sistem.
sumber
Ada penjelasan yang bagus dalam dokumen Numpy: https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.random.RandomState.html mengacu pada generator nomor pseudo-acak Mersenne Twister . Lebih detail tentang algoritme di sini: https://en.wikipedia.org/wiki/Mersenne_Twister
sumber
Ini menghasilkan output berikut:
array([5, 0, 3, 3, 7])
Sekali lagi, jika kita menjalankan kode yang sama kita akan mendapatkan hasil yang sama.Sekarang jika kita mengubah nilai seed 0 menjadi 1 atau yang lain:
Ini menghasilkan output berikut:
array([5 8 9 5 0])
tetapi sekarang output tidak sama seperti di atas.sumber
Semua jawaban di atas menunjukkan implementasi dari
np.random.seed()
dalam kode. Saya akan mencoba yang terbaik untuk menjelaskan secara singkat mengapa itu benar-benar terjadi. Komputer adalah mesin yang dirancang berdasarkan algoritma yang telah ditentukan. Setiap output dari komputer adalah hasil dari algoritma yang diterapkan pada input. Jadi ketika kami meminta komputer untuk menghasilkan angka acak, tentu saja angka itu acak tetapi komputer tidak hanya membuatnya secara acak!Jadi, ketika kita menulis
np.random.seed(any_number_here)
algoritme akan menampilkan serangkaian angka tertentu yang unik untuk argumenany_number_here
. Hampir seperti seperangkat angka acak tertentu dapat diperoleh jika kita melewati argumen yang benar. Tetapi ini akan mengharuskan kita untuk mengetahui tentang bagaimana algoritma bekerja yang cukup membosankan.Jadi, misalnya jika saya menulis
np.random.seed(10)
set angka tertentu yang saya peroleh akan tetap sama bahkan jika saya mengeksekusi baris yang sama setelah 10 tahun kecuali algoritme berubah.sumber