একটি স্বেচ্ছাচারিত বিচ্ছিন্ন বিতরণের উপর ভিত্তি করে কীভাবে সংখ্যা উত্পন্ন করা যায়?


28

আমি কীভাবে একটি স্বেচ্ছাচারিত বিচ্ছিন্ন বিতরণের উপর ভিত্তি করে নম্বর তৈরি করব?

উদাহরণস্বরূপ, আমার কাছে সংখ্যার একটি সেট রয়েছে যা আমি উত্পন্ন করতে চাই। বলুন যে তারা নীচের হিসাবে 1-3 থেকে লেবেল করা হয়েছে।

1: 4%, 2: 50%, 3: 46%

মূলত, শতাংশগুলি সম্ভাবনা যা তারা এলোমেলো সংখ্যা জেনারেটর থেকে আউটপুট প্রদর্শিত হবে। আমার কাছে একটি পিসুডোর্যান্ডম নম্বর জেনারেটর রয়েছে যা বিরতিতে [0, 1] এ অভিন্ন বিতরণ উত্পন্ন করবে। এই কাজ করার কোন উপায় আছে কি?

আমার কতগুলি উপাদান থাকতে পারে তার কোনও সীমা নেই, তবে% 100% পর্যন্ত যোগ করবে।


2
আমি যদি শিরোনামে "... স্বেচ্ছাচারিত বিচ্ছিন্ন বিতরণ" নির্দিষ্ট করার পরামর্শ দিতে পারি তবে যদি এটি আপনার প্রশ্ন হয়। একটানা কেস আলাদা।
ডেভিড এম কাপলান

3
জেনেরিক উপায় হ'ল সম্ভাবনার তালিকার মধ্যে বাইনারি অনুসন্ধান করা, যা এই উদাহরণে । গড়ে এটি প্রতি প্রজন্মের ইভেন্টে প্রোব নেয় । কোনও সম্ভাবনা যদি খুব ছোট না হয় তবে আপনি সমান-ব্যবধানের মানগুলির একটি ভেক্টর তৈরি করে এবং (একটি পূর্ববর্তী পর্যায়ে) প্রতিটি মানকে একটি ফলাফল নির্ধারণ করে পারফরম্যান্স পেতে পারেন । উদাহরণস্বরূপ, এই উদাহরণে আপনি ভেক্টর তৈরি করতে পারেন ( 2 এবং 3 এর সাথে)। ইউনিফর্ম তৈরি করুন, 100 দ্বারা গুণিত করুন এবং এই ভেক্টরে সূচক: সম্পন্ন হয়েছে। লগ ( এন ) / 2 ( 1 ) [ 0 , 1 ] ( 1 , 1 , 1 , 1 , 2 , , 2 , 3 , , 3 ) 50 46(0,0.04,0.54,1.0)log(n)/2O(1)[0,1](1,1,1,1,2,,2,3,,3)5046
whuber


এই "এখানে" লিঙ্কটি আসলে এই খুব প্রশ্নের সাথে লিঙ্ক করে, @ গ্লেন_ বি ... কপি-এন-পেস্ট ত্রুটি?
বুড়োজমন

@ বুরুজায়েমন ধন্যবাদ হ্যাঁ এটি একটি ভুল ছিল; আমি এটি সংশোধন করেছি।
গ্লেন_বি -রিনস্টেট মনিকা

উত্তর:


26

একটি পৃথক বিতরণ থেকে স্যাম্পলিংয়ের জন্য সেরা অ্যালগরিদমগুলির একটি হ'ল ওরফে পদ্ধতি

সম্ভাব্যতার সাথে সমানুপাতিক অঞ্চলগুলিতে একটি আয়তক্ষেত্রকে বিভাজন করার জন্য উপনাম পদ্ধতি (দক্ষতার সাথে) দ্বি-মাত্রিক ডেটা স্ট্রাকচারকে সামঞ্জস্য করে।

ব্যক্তিত্ব

রেফারেন্সড সাইট থেকে এই পরিকল্পনাকারীতে, ইউনিটের উচ্চতার একটি আয়তক্ষেত্রকে চার ধরণের অঞ্চলে বিভক্ত করা হয়েছে - রঙ দ্বারা পৃথক করে - অনুপাতে , , , এবং , ইন এই সম্ভাব্যতাগুলির সাথে একটি পৃথক বিতরণ থেকে বারবার নমুনার আদেশ করুন। উল্লম্ব স্ট্রিপগুলির একটি ধ্রুবক (ইউনিট) প্রস্থ থাকে। প্রত্যেকটি কেবল একটি বা দুটি টুকরোতে বিভক্ত। টুকরাগুলির পরিচয় এবং উল্লম্ব বিভাগগুলির অবস্থানগুলি কলাম সূচকের মাধ্যমে অ্যাক্সেসযোগ্য টেবিলে সংরক্ষণ করা হয়।1 / 3 1 / 12 1 / 121/21/31/121/12

সারণীটি দুটি সহজ ধাপে নমুনাযুক্ত করা যেতে পারে (প্রতিটি সমন্বয়ের জন্য একটি) মাত্র দুটি স্বতন্ত্র ইউনিফর্ম মান এবং গণনা জন্মানোর প্রয়োজন। অন্যান্য উত্তরগুলিতে এখানে বর্ণিত হিসাবে পৃথক সিডিএফ উল্টানোর জন্য প্রয়োজনীয় গণনাতে এটি উন্নতি করে ।O(1)O(log(n))


2
এই অ্যালগরিদম কেবল তখনই সেরা যদি সম্ভাবনাগুলি গণনা করার জন্য সস্তা হয়। উদাহরণস্বরূপ যদি বিশাল হয় তবে পুরো গাছটি না বানানো ভাল। n
সম্ভাব্যতাব্লোগিক

3
+1 এখন পর্যন্ত এটি কোনও দক্ষ অ্যালগরিদমকে পরামর্শ এবং বর্ণনা করার একমাত্র জবাব।
হোবার

19

আপনি এটি আর এ সহজেই করতে পারেন, কেবল আপনার প্রয়োজনীয় আকারটি নির্দিষ্ট করুন:

sample(x=c(1,2,3), size=1000, replace=TRUE, prob=c(.04,.50,.46))

3
ব্যক্তিগতভাবে, আমি একটি অ্যালগরিদম পছন্দ করি (বা কোথাও প্রয়োজনীয় জ্ঞান শিখতে), যেহেতু আমি এটি তৈরি করছি এমন একটি অ্যাপের সাথে এটি অন্তর্ভুক্ত করার চেষ্টা করছি :) যদিও আপনার উত্তরের জন্য অনেক ধন্যবাদ :)
ফুর্তিফেলন

হুমমম ঠিক আছে ... আপনি কী করতে চান সে সম্পর্কে আরও কিছুটা জানতে আমাদের আপনাকে গাইড করতে সহায়তা করবে। আপনি এটি সম্পর্কে আরও বলতে পারেন? (উদ্দেশ্য, প্রসঙ্গ, ইত্যাদি)
ডমিনিক কম্টোইস

এটা ভোট দেওয়ার জন্য। উদাহরণস্বরূপ, আমার কাছে প্রচুর ফটোগুলি রয়েছে এবং আমি একবারে কেবল কোনও ব্যবহারকারীর কাছে show টি দেখাতে পারি, আমি একবারে কোনও ব্যবহারকারীর কাছে "সেরা" অন্তর্ভুক্ত করতে চাই এবং ব্যবহারকারী প্রতিটি ফটোতে উপরে বা নীচে ভোট দিতে পারে । সবচেয়ে সহজ সমাধান যা এখনই কাজ করতে পারে আমি সেই স্কিমটি হিসাবে উল্লেখ করেছি যে (প্রতিটি সংখ্যা একটি ছবির প্রতিনিধিত্ব করে, প্রতিটি নিচে ভোট সেই
ফটোগুলির

1
@ ফুর্টিভেলন, আপনি সর্বদা আর থেকে কোডটি পোর্ট করতে পারেন, হে কোড থেকে অ্যালগরিদম বের করে এটিকে পুনরায় প্রয়োগ করতে পারেন।
এমপিটকাস

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

19

আপনার উদাহরণস্বরূপ, বলুন যে আপনি আপনার সিউডোরেন্ডম ইউনিফর্ম [0,1] মান আঁকুন এবং এটি ইউ ডাকুন Then তারপরে আউটপুট:

1 যদি ইউ <0.04

2 যদি ইউ> = 0.04 এবং ইউ <0.54 হয়

3 যদি ইউ> = 0.54

নির্দিষ্ট% যদি একটি, খ, ..., কেবল আউটপুট হয়

মান 1 যদি ইউ

U> = a এবং U <(a + b) হলে মান 2

প্রভৃতি

মূলত, আমরা% কে [0,1] এর সাবটাইটে ম্যাপ করছি, এবং আমরা জানি যে অভিন্ন র্যান্ডম মান যে কোনও পরিসরের মধ্যে পড়ে তা কেবল সেই ব্যাপ্তির দৈর্ঘ্য। ব্যাপ্তিগুলি যথাযথভাবে স্থাপন করা সহজ, যদি অনন্য না হয় তবে এটি করার উপায় মনে হয়। এটি ধরে নেওয়া হচ্ছে যে আপনি কেবল বিযুক্ত বিতরণ সম্পর্কে জিজ্ঞাসা করছেন; অবিচ্ছিন্নতার জন্য, "প্রত্যাখ্যানের নমুনা" ( উইকিপিডিয়া এন্ট্রি ) এর মতো কিছু করতে পারে ।


8
আপনি সম্ভাবনার ক্রম হ্রাসে বিভাগগুলিকে বাছাই করলে অ্যালগরিদম দ্রুত হয়। এইভাবে, আপনি উত্পাদিত এলোমেলো সংখ্যায় কম পরীক্ষা (গড়) করেন।
jboman

1
কেবল বাছাইয়ের ক্ষেত্রে একটি দ্রুত নোট যুক্ত করতে - এটি কেবল তখনই কার্যকর হবে যখন আপনি একটি নমুনা স্কিম শুরু করার সময় একবার এটি করেন - সুতরাং সম্ভাব্যতাগুলি বৃহত্তর সামগ্রিক স্কিমের অংশ হিসাবে নিজেরাই নমুনা প্রাপ্ত ক্ষেত্রে এটি ভাল করবে না ( যেমন, এবং তারপরে পি আর ( ওয়াই = জে ) = পি জে )। এই ক্ষেত্রে বাছাই করে আপনি নমুনার প্রতিটি পুনরাবৃত্তিতে বাছাই ক্রিয়াকলাপ যোগ করছেন - যা ( এন লগ ( এন ) ) যোগ করবেpjDistPr(Y=j)=pjO(nlog(n))প্রতিটি পুনরাবৃত্তির সময়। তবে, এই ক্ষেত্রে শুরুতে সম্ভাবনার আকারের একটি আনুমানিক অনুমান অনুসারে বাছাই করা কার্যকর হতে পারে।
সম্ভাব্যতা ব্লগ

4

ধরুন আছে সম্ভব বিযুক্ত ফলাফল। পার্টিশনযুক্ত ( 0 , 1 ) বিরতি দেওয়ার জন্য আপনি সংক্ষিপ্ত সম্ভাবনা ভর ফাংশন, এফ এর উপর ভিত্তি করে বিরতি [ 0 , 1 ] কে সাবিনটিভরে ভাগ করুনm[0,1]F(0,1)

I1I2Im

যেখানে এবং এফ ( 0 ) 0 । আপনার উদাহরণে মি = 3 এবংIj=(F(j1),F(j))F(0)0m=3

I1=(0,.04),     I2=(.04,.54),     I3=(.54,1)

যেহেতু এবং এফ ( 2 ) = .54 এবং এফ ( 3 ) = 1F(1)=.04F(2)=.54F(3)=1

তারপরে আপনি নিম্নোক্ত অ্যালগরিদম ব্যবহার করে ডিস্ট্রিবিউশন এফ সহ উত্পন্ন করতে পারবেন :XF

(1) UUniform(0,1)

(2) যদি , তবে এক্স = জেUIjX=j

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

লক্ষ্য করুন ঠিক অন্তর এক হতে হবে আমি যেহেতু তারা অসংলগ্ন করা এবং পার্টিশন হয় [ 0 , 1 ]UIj[0,1]


এই অন্তরগুলি সমস্ত অর্ধ-বন্ধ হওয়া উচিত নয়? অন্যথায় অন্তরগুলির মধ্যে সীমানা অন্তর্ভুক্ত করা হয় না .. অর্থাৎ। {[0,0.04), [0.04,0.54), [0.54,1]}
naught101

1
যে কোনো স্থানে জন্য U (অর্থাত অর্ধেক খোলা বিরতি এর Lebesgue পরিমাপ খোলা বিরতি যে একই হয়) তাই আমি এটা গুরুত্বপূর্ণ মনে করি না। P(U=u)=0u
ম্যাক্রো

1
একটি সুনির্দিষ্ট-নির্ভুলতা ডিজিটাল মেশিনে, যদিও, মহাবিশ্বের সমাপ্তির আগে কোনও দিন এটি বিবেচনা করবে ...
jboman

1
যথেষ্ট পরিমাণে, @ শুভ্র, আমার সম্পাদনা দেখুন।
ম্যাক্রো

1
ঠিক আছে, এটি একটি অ্যালগরিদম। বিটিডব্লিউ, কেন আপনি ঠিক এমন কিছু ফিরিয়ে দেন না min(which(u < cp))? প্রতিটি কলটিতে সংখ্যার যোগফলটি পুনর্নির্মাণ করা এড়ানো ভাল good যে পূর্বনির্ধারিত সঙ্গে, পুরো অ্যালগরিদম হ্রাস করা হয় min(which(runif(1) < cp))। বা আরও ভাল, কারণ ওপি নম্বর ( বহুবচন ) তৈরি করতে বলে , এটি হিসাবে ভেক্টরাইজ করুন n<-10; apply(matrix(runif(n),1), 2, function(u) min(which(u < cp)))
হোবার

2

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

এটি দুর্দান্ত যে মান / সম্ভাবনার সংখ্যা অসীম হতে পারে তবে আপনি কেবল তখনই সেই সম্ভাবনাগুলি গণনা করতে হবে যখন আপনি এই সংখ্যার কাছাকাছি আসবেন (কোনও পয়সন বা নেতিবাচক দ্বিপদী বিতরণ থেকে উত্পন্ন করার মতো কিছু))

যদি আপনার সম্ভাবনার একটি সীমাবদ্ধ সেট থাকে, তবে সেগুলি থেকে অনেকগুলি সংখ্যা উত্পন্ন করা হয় তবে সম্ভাব্যতাগুলিকে সাজানোর জন্য এটি আরও দক্ষ হতে পারে যাতে আপনি প্রথম বৃহত্তমটিকে বিয়োগ করতে পারেন, তারপরে ২ য় বৃহত্তম এবং পরবর্তী।


2

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

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


2

আমারও একই সমস্যা ছিল। এমন একটি সেট দেওয়া যেখানে প্রতিটি আইটেমটির সম্ভাবনা থাকে এবং যার আইটেমগুলির সম্ভাব্যতা একত্রে যোগ হয়, আমি দক্ষতার সাথে একটি নমুনা আঁকতে চেয়েছিলাম, কোনও কিছু বাছাই না করে এবং বার বার সেটটির উপরে বারবার না ঘটাতে

N[a,1)r[0,1)

next(N,a)=1(1a)rN

(ai)NN=10

a0=next(10,0)
a1=next(9,a0)
a2=next(8,a1)

a9=next(1,a8)

(ai)P0k<|P|pkPaikp0pk>aipkai+1


{(1,0.04),(2,0.5),(3,0.46)}N=10

i ai i k Sum অঙ্কন
0 0.031 0 0.04 1
1 0.200 1 0.54 2
2 0.236 1 0.54 2
3 0.402 1 0.54 2
4 0.488 1 0.54 2
5 0.589 2 1.0 3
6 0.625 2 1.0 3
7 0.638 2 1.0 3
8 0.738 2 1.0 3
0. 0.942 2 1.0 3

(1,2,2,2,2,3,3,3,3,3)


nextN[a,x)x1


এটা তোলে সমস্যা অ্যাড্রেসিং হঠাৎ এক থেকে দ্বিতীয় অনুচ্ছেদে পরিবর্তিত হয় যে প্রদর্শিত হবে একটি থেকে নমুনা নির্বিচারে A থেকে স্যাম্পলিং করার বিযুক্ত বন্টন অভিন্ন বন্টন। এটির সমাধানটি এখানে জিজ্ঞাসিত প্রশ্নের সাথে প্রাসঙ্গিক বলে মনে হচ্ছে না।
হোয়বার

আমি শেষ অংশটি পরিষ্কার করেছিলাম।
ক্যাসি

{1,2,3}

আমি একটি উদাহরণ যুক্ত করেছি। আমার উত্তরটির ডেভিড এম কাপলানের উত্তরের সাথে কিছু মিল রয়েছে ( stats.stackexchange.com/a/26860/93386 ), তবে এন এন আঁকার ব্যয়ে সেটটিতে এন (= নমুনার আকার) পুনরাবৃত্তির পরিবর্তে কেবল একটি প্রয়োজন requires শিকড় আমি উভয় পদ্ধতি প্রোফাইল করেছিলাম, এবং আমারটি আরও দ্রুত ছিল।
কাসি

aj=i=1jlog(ui)i=1N+1log(ui)
u1,,uN+1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.