Numpy.random.seed (0) কি করে?


282

np.random.seedসাইকিট-লার্ন টিউটোরিয়াল থেকে নীচের কোডটিতে কী করবেন ? আমি নুমপির এলোমেলো রাষ্ট্র জেনারেটরের স্টাফগুলির সাথে খুব বেশি পরিচিত নই, তাই আমি এই বিষয়ে একজন সাধারণ ব্যক্তির শর্তাবলীর ব্যাখ্যাটির সত্যই প্রশংসা করব।

np.random.seed(0)
indices = np.random.permutation(len(iris_X))

উত্তর:


555

np.random.seed(0) এলোমেলো সংখ্যা অনুমানযোগ্য করে তোলে

>>> 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])

বীজ পুনরায় সেট করার সাথে (প্রতিবার), একই সংখ্যার সংকলন প্রতিবার উপস্থিত হবে।

যদি এলোমেলো বীজ পুনরায় সেট না করা হয় তবে প্রতিটি অনুরোধের সাথে বিভিন্ন সংখ্যা উপস্থিত হয়:

>>> 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])

(সিউডো-) এলোমেলো সংখ্যা একটি সংখ্যার (বীজ) দিয়ে শুরু করে, এটি একটি বৃহত সংখ্যায় গুণ করে, একটি অফসেট যোগ করে, এবং তার পরে যোগফলের মডুলো গ্রহণ করে কাজ করে। ফলস্বরূপ নম্বরটি পরবর্তী "এলোমেলো" নম্বর উত্পন্ন করতে বীজ হিসাবে ব্যবহৃত হয়। আপনি যখন বীজ সেট করেন (প্রতিবার), এটি প্রতিবার একই কাজ করে, আপনাকে একই নম্বর দেয়।

আপনি যদি আপাতদৃষ্টিতে এলোমেলো সংখ্যা চান তবে বীজ সেট করবেন না। আপনার যদি এমন কোড রয়েছে যা আপনি ডিবাগ করতে চান এমন এলোমেলো সংখ্যা ব্যবহার করে তবে, প্রতিটি রানের আগে বীজ সেট করা খুব সহায়ক হতে পারে যাতে প্রতিবার চালানোর সময় কোডটি একই কাজ করে।

প্রতিটি রানের জন্য সর্বাধিক এলোমেলো নম্বর পেতে কল করুন numpy.random.seed()এর ফলে/dev/urandom উইন্ডোজ অ্যানালগ থেকে প্রাপ্ত এলোমেলো সংখ্যায় বা তার উইন্ডোজ অ্যানালগকে বীজ সেট করতে বা যদি এটিগুলির কোনওটি উপলব্ধ না হয় তবে এটি ঘড়িটি ব্যবহার করবে।

সিউডো-এলোমেলো সংখ্যা উত্পন্ন করতে বীজ ব্যবহার সম্পর্কে আরও তথ্যের জন্য, উইকিপিডিয়া দেখুন


86
এই উত্তরটি নমপির ডকুমেন্টেশনে যুক্ত করা উচিত। ধন্যবাদ.
গর্জনজ

8
এছাড়াও, যখন আপনি কল করবেন numpy.random.seed(None), এটি "অন্যথায় ঘড়ি থেকে উপলব্ধ বা বীজ উপলব্ধ হলে / dev / urandom (বা উইন্ডোজ অ্যানালগ) থেকে ডেটা পড়ার চেষ্টা করবে"।
জোনাথন

1
@ জোনাথন সম্পর্কে দুর্দান্ত পয়েন্ট numpy.random.seed(None)। আমি সেই তথ্য এবং ডক্সের একটি লিঙ্ক সহ উত্তরটি আপডেট করেছি।
1024

@ কারিও 1729 বাস্তবায়নটি একটি অপারেটিং সিস্টেম থেকে পরবর্তীটিতে পরিবর্তিত হতে পারে তবে ন্যালি তার আদেশগুলি সহ seedসামঞ্জস্য করার চেষ্টা করে ।
1024

1
@ L3viathan ভাল পয়েন্ট! আরও সম্পূর্ণ এবং নির্ভুল হতে, আমার উল্লেখ করা উচিত ছিল যে একটি অফসেট যুক্ত হয়েছে। উত্তর আপডেট হয়েছে। যারা আরও বিশদ চান তাদের জন্য, আমি উইকিপিডিয়ায় সিউডো-এলোমেলো সংখ্যা জেনারেটর সম্পর্কিত আলোচনার লিঙ্ক যুক্ত করেছি।
1024

38

আপনি np.random.seed(a_fixed_number)যখন নাম্বারটির অন্যান্য এলোমেলো ক্রিয়াকলাপটিকে কল করে প্রতিবার সেট করেন , ফলাফলটি একই হবে:

>>> import numpy as np
>>> np.random.seed(0) 
>>> perm = np.random.permutation(10) 
>>> print perm 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10) 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.rand(4) 
[0.5488135  0.71518937 0.60276338 0.54488318]
>>> np.random.seed(0) 
>>> print np.random.rand(4) 
[0.5488135  0.71518937 0.60276338 0.54488318]

তবে, আপনি যদি কেবল একবার কল করে এবং বিভিন্ন এলোমেলো ফাংশন ব্যবহার করেন, ফলাফলগুলি এখনও পৃথক হবে:

>>> import numpy as np
>>> np.random.seed(0) 
>>> perm = np.random.permutation(10)
>>> print perm 
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0) 
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> print np.random.permutation(10) 
[3 5 1 2 9 8 0 6 7 4]
>>> print np.random.permutation(10) 
[2 3 8 4 5 1 0 6 9 7]
>>> print np.random.rand(4) 
[0.64817187 0.36824154 0.95715516 0.14035078]
>>> print np.random.rand(4) 
[0.87008726 0.47360805 0.80091075 0.52047748]

3
এমন কোনও ফাংশন আছে যা একবারে বলা যেতে পারে যে np.randomবীজ পরিবর্তন না হওয়া অবধি পরবর্তী সমস্ত কলগুলির জন্য এলোমেলো বীজ সেট করা থাকে? প্রতিবার এটিকে কল করা অযথা ভার্জিক এবং ভুলে যাওয়া সহজ বলে মনে হচ্ছে।
lubed আপ স্লাগ্

@ লুবেডসপ্লাগ আপনি সেগুলি সাজাতে পারেন - কমপক্ষে কয়েকটি সাধারণ ক্ষেত্রে আমি পরীক্ষা করেছিলাম এটি কাজ করা উচিত। def seed_first(fun, seed=0):| \tdef wrapped(*args, **kwargs):| \t\tnp.random.seed(seed)| \t\treturn fun(*args, **kwargs)| \treturn wrapped, এবং তারপরে for m in np.random.__all__:| \tif m != 'seed':| \t\tsetattr(np.random, m, seed_first(getattr(np.random, m)))তবে এটি দীর্ঘমেয়াদে খুব সূক্ষ্ম বাগ এবং অদ্ভুত আচরণের দিকে পরিচালিত করতে পারে। (Space টিকে চারটি স্পেস দিয়ে এবং প্রতিস্থাপন করুন | লাইন ব্রেকগুলির সাথে ...)
সেবাস্তিয়ান হ্যাফনার

1
@ সেবাস্তিয়ানহফনার আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমার প্রশ্নটি কিছুটা বিভ্রান্ত হয়েছিল কারণ আমি এই বাক্যটি দ্বারা বিভ্রান্ত হয়ে পড়েছিলাম "তবে, আপনি যদি একবার এটি কল করেন এবং বিভিন্ন এলোমেলো ফাংশন ব্যবহার করেন, ফলাফলগুলি এখনও অন্যরকম হবে:" np.random.seed()কোনও প্রোগ্রামের শুরুতে একবার কল করা সর্বদা একই ফলাফল তৈরি করবে একই বীজের জন্য যেহেতু পরবর্তী np.randomক্রিয়াকলাপগুলিতে কলগুলি পরবর্তী কলগুলির জন্য নির্ধারিতভাবে বীজকে পরিবর্তন করবে। কল করা হচ্ছে np.random.seed()প্রতি কল করার আগে np.randomফাংশন সম্ভবত অবাঞ্ছিত ফলাফল উত্পাদন করা হবে।
লুবড আপ স্লাগ

17

যেমন উল্লেখ করা হয়েছে, numpy.random.seed (0) এলোমেলো বীজ 0 তে নির্ধারণ করে, সুতরাং আপনি এলোমেলোভাবে পাওয়া সিউডো এলোমেলো সংখ্যা একই পয়েন্ট থেকে শুরু হবে। এটি কিছু ক্ষেত্রে ডিবাগিংয়ের জন্য ভাল হতে পারে। যাইহোক, কিছু পাঠের পরে, এটি থ্রেডটি নিরাপদ নয় বলে যদি আপনার থ্রেড থাকে তবে এটি যেতে ভুল উপায় বলে মনে হচ্ছে।

অজগর-এ-র্যান্ডম-এলোমেলো-এ-পাইথনের মধ্যে পার্থক্যগুলি থেকে :

Numpy.random.seed () এর জন্য, প্রধান অসুবিধা হ'ল এটি থ্রেড-নিরাপদ নয় - অর্থাত্ যদি আপনার মৃত্যুর অনেকগুলি থ্রেড থাকে তবে এটি ব্যবহার করা নিরাপদ নয়, কারণ দুটি ভিন্ন থ্রেড কার্যকর হলে এটি কাজ করার গ্যারান্টিযুক্ত নয় if একই সময়ে ফাংশন। আপনি যদি থ্রেড ব্যবহার করছেন না, এবং আপনি যদি যুক্তিসঙ্গতভাবে আশা করতে পারেন যে ভবিষ্যতে আপনার প্রোগ্রামটি পুনরায় লেখার দরকার নেই, numpy.random.seed () পরীক্ষার উদ্দেশ্যে ভাল হতে হবে। ভবিষ্যতে আপনার থ্রেডগুলির প্রয়োজন হতে পারে এমন সন্দেহের যদি কোনও কারণ থাকে তবে প্রস্তাবিত হিসাবে কাজ করা এবং numpy.random.Random শ্রেণীর স্থানীয় উদাহরণ তৈরি করা দীর্ঘমেয়াদে অনেক বেশি নিরাপদ। আমি যতদূর বলতে পারি, random.random.seed () থ্রেড-নিরাপদ (বা কমপক্ষে, আমি এর বিপরীতে কোনও প্রমাণ পাইনি)।

এটি সম্পর্কে কিভাবে যেতে উদাহরণ:

from numpy.random import RandomState
prng = RandomState()
print prng.permutation(10)
prng = RandomState()
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)

দিতে পারে:

[3 0 4 6 8 2 1 9 7 5]

[1 6 9 0 2 7 8 3 5 4]

[8 1 5 0 7 2 9 4 3 6]

[8 1 5 0 7 2 9 4 3 6]

শেষ অবধি, মনে রাখবেন যে কিছু ক্ষেত্রে 0 হতে শুরু করা হয়েছে (এমন কোনও বীজের বিপরীতে যা সমস্ত বিট 0 নয়) জোর কাজ করার কারণে কিছু প্রথম পুনরাবৃত্তির জন্য অ-ইউনিফর্ম বিতরণ করতে পারে, তবে এটি আলগোরিদিমের উপর নির্ভর করে , এবং আমার বর্তমান উদ্বেগ এবং এই প্রশ্নের ক্ষেত্রের বাইরে।


12

আমি নিউরাল নেটওয়ার্কগুলিতে এটি প্রায়শই ব্যবহার করেছি। এটি সর্বজনবিদিত যে আমরা যখন নিউরাল নেটওয়ার্ক প্রশিক্ষণ শুরু করি তখন আমরা এলোমেলোভাবে ওজনকে সূচনা করি। মডেলটি একটি নির্দিষ্ট ডেটাसेटে এই ওজনগুলিতে প্রশিক্ষিত হয়। বহু যুগের পরে আপনি ওজন নিয়ে প্রশিক্ষিত সেট পান।

এখন ধরা যাক আপনি আবার স্ক্র্যাচ থেকে প্রশিক্ষণ নিতে চান বা আপনার ফলাফল পুনরুত্পাদন করতে আপনি অন্যদের কাছে মডেলটি পাস করতে চান, ওজনগুলি আবার এলোমেলো সংখ্যায় শুরু করা হবে যা বেশিরভাগ পূর্বেরগুলির চেয়ে আলাদা হবে। আগের মতো একই সংখ্যক যুগের (একই ডেটা এবং অন্যান্য পরামিতিগুলি রেখে) প্রাপ্ত প্রশিক্ষিত ওজনগুলি পৃথক হবে। সমস্যাটি হ'ল আপনার মডেলটি পুনরায় প্রজননযোগ্য নয় যা প্রতিবার আপনি আপনার মডেলটিকে স্ক্র্যাচ থেকে প্রশিক্ষণ দিন এটি আপনাকে বিভিন্ন ওজনের বিভিন্ন সেট সরবরাহ করে। এটি কারণ প্রতিবার বিভিন্ন এলোমেলো সংখ্যা দ্বারা মডেলটি আরম্ভ করা হচ্ছে।

প্রতিবার যদি আপনি স্ক্র্যাচ থেকে প্রশিক্ষণ শুরু করেন তবে মডেলটি এলোমেলোভাবে প্রাথমিক ওজনের একই সেট থেকে আরম্ভ করা হবে? এই ক্ষেত্রে আপনার মডেল প্রজননযোগ্য হতে পারে। এটি numpy.random.seed (0) দ্বারা অর্জন করা হয়েছে। কোনও নির্দিষ্ট সংখ্যায় বীজ () উল্লেখ করে আপনি সর্বদা এলোমেলো সংখ্যার একই সংখ্যায় ঝুলছেন।


3

কল্পনা করুন আপনি কীভাবে কিছু লোককে "এলোমেলো" সংখ্যার কোড দিয়ে কীভাবে দেখিয়ে দিচ্ছেন। নোংরা বীজ ব্যবহার করে তারা একই বীজ নম্বর ব্যবহার করতে পারে এবং একই সাথে "এলোমেলো" সংখ্যার সেট পেতে পারে।

সুতরাং এটি ঠিক এলোমেলো নয় কারণ একটি অ্যালগরিদম সংখ্যাগুলি ছড়িয়ে দেয় তবে এটি এলোমেলোভাবে উত্পন্ন গুচ্ছের মতো লাগে looks


0

যখন একটি কম্পিউটার এলোমেলো সংখ্যা ক্রম উত্পন্ন করে একটি এলোমেলো বীজ শুরুর পয়েন্টটি নির্দিষ্ট করে।

উদাহরণস্বরূপ, ধরা যাক আপনি এক্সেলের মধ্যে একটি এলোমেলো সংখ্যা তৈরি করতে চেয়েছিলেন (দ্রষ্টব্য: এক্সেল বীজের জন্য 9999 এর সীমা নির্ধারণ করে)। প্রক্রিয়া চলাকালীন আপনি যদি এলোমেলো বীজ বাক্সে একটি নম্বর প্রবেশ করেন, আপনি আবার এলোমেলো সংখ্যার সেটটি ব্যবহার করতে সক্ষম হবেন। আপনি যদি বাক্সে "77" টাইপ করেন, এবং পরের বার আপনি এলোমেলো নম্বর জেনারেটরটি চালান, এক্সেল সেই একই সংখ্যক র্যান্ডম সংখ্যার প্রদর্শন করবে। আপনি যদি "99" টাইপ করেন তবে আপনি সম্পূর্ণ ভিন্ন সংখ্যার সেট পাবেন। তবে আপনি যদি 77 এর বীজে ফিরে যান, তবে আপনি শুরু করা এলোমেলো সংখ্যার একই সেট পাবেন।

উদাহরণস্বরূপ, "একটি সংখ্যা এক্স নিন, 900 + x যোগ করুন, তারপরে 52 টি বিয়োগ করুন” " প্রক্রিয়াটি শুরু করার জন্য, আপনাকে একটি প্রারম্ভিক সংখ্যা, x (বীজ) নির্দিষ্ট করতে হবে। আসুন 77 77 নম্বরটি শুরু করা যাক:

900 + 77 = 977 বিয়োগ করুন 52 = 925 একই অ্যালগরিদম অনুসরণ করে, দ্বিতীয় "এলোমেলো" নম্বরটি হবে:

900 + 925 = 1825 বিয়োগ 52 = 1773 এই সাধারণ উদাহরণটি একটি নিদর্শন অনুসরণ করে, তবে কম্পিউটার নম্বর জেনারেশনের পিছনে থাকা অ্যালগোরিদমগুলি আরও জটিল are


0

নির্দিষ্ট বীজের মান নির্ধারণের পরে উত্পন্ন সমস্ত এলোমেলো সংখ্যা সমস্ত প্ল্যাটফর্ম / সিস্টেমগুলিতে সমান।


0

নম্পি ডক্সে একটি দুর্দান্ত ব্যাখ্যা রয়েছে: https://docs.scipy.org/doc/numpy-1.15.1/references/generated/numpy.random.RandomState.html এটি মার্সেন টুইস্টার সিউডো-র্যান্ডম নম্বর জেনারেটরকে বোঝায় । এখানে অ্যালগরিদম সম্পর্কে আরও বিশদ: https://en.wikedia.org/wiki/Mersenne_Twister


0
numpy.random.seed(0)
numpy.random.randint(10, size=5)

এটি নিম্নলিখিত আউটপুট উত্পাদন করে: array([5, 0, 3, 3, 7]) আবার আমরা যদি একই কোডটি চালাই তবে আমরা একই ফল পেয়ে যাব।

এখন যদি আমরা বীজের মান 0 বা 1 বা অন্যকে পরিবর্তন করি:

numpy.random.seed(1)
numpy.random.randint(10, size=5)

এটি নিম্নলিখিত আউটপুট উত্পাদন করে: array([5 8 9 5 0])কিন্তু এখন আউটপুট উপরের মতো হয় না।


0

উপরের সমস্ত উত্তর বাস্তবায়ন দেখায় np.random.seed() কোডের । আমি আসলে কেন এটি ঘটে তা সংক্ষেপে ব্যাখ্যা করার জন্য যথাসাধ্য চেষ্টা করব। কম্পিউটারগুলি এমন মেশিন যা পূর্বনির্ধারিত অ্যালগরিদমের ভিত্তিতে নকশাকৃত। কম্পিউটার থেকে যে কোনও আউটপুট হ'ল ইনপুটটিতে প্রয়োগ করা অ্যালগরিদমের ফলাফল। সুতরাং আমরা যখন কোনও কম্পিউটারকে এলোমেলো সংখ্যা উত্পন্ন করার জন্য অনুরোধ করি তখন নিশ্চিত যে সেগুলি এলোমেলো তবে কম্পিউটার কেবল এলোমেলোভাবে তাদের সাথে আসে নি!

সুতরাং আমরা যখন np.random.seed(any_number_here)অ্যালগরিদম লিখব আর্গুমেন্টের জন্য অনন্য একটি নির্দিষ্ট সংখ্যার আউটপুট আসবে any_number_here। এটি প্রায় মতোই একটি নির্দিষ্ট সেটের এলোমেলো সংখ্যার সংখ্যা পাওয়া যায় যদি আমরা সঠিক যুক্তিটি পাস করি। তবে এটি আমাদের কীভাবে অ্যালগরিদমটি কাজ করে যা বেশ ক্লান্তিকর তা জানতে হবে।

সুতরাং, উদাহরণস্বরূপ, আমি যদি np.random.seed(10)প্রাপ্ত সংখ্যার নির্দিষ্ট সেটটি লিখি তবে অ্যালগরিদম পরিবর্তন না হওয়া পর্যন্ত 10 বছর পরে আমি একই লাইনটি সম্পাদন করি এমনকি যদি তা একই থাকে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.