আমি কীভাবে একটি অভিন্ন বিতরণকে (বেশিরভাগ এলোমেলো সংখ্যা জেনারেটর উত্পাদন করে, যেমন 0.0 এবং 1.0 এর মধ্যে) একটি সাধারণ বিতরণে রূপান্তর করতে পারি? আমি যদি আমার নির্বাচনের গড় এবং মানক বিচ্যুতি চাই?
আমি কীভাবে একটি অভিন্ন বিতরণকে (বেশিরভাগ এলোমেলো সংখ্যা জেনারেটর উত্পাদন করে, যেমন 0.0 এবং 1.0 এর মধ্যে) একটি সাধারণ বিতরণে রূপান্তর করতে পারি? আমি যদি আমার নির্বাচনের গড় এবং মানক বিচ্যুতি চাই?
উত্তর:
প্রাচীন মেসোপটেমিয়ার ধাপওয়ালা পিরামিড আকৃতির মন্দির যার শীর্ষে নির্মিত হত উপাসনাগার অ্যালগরিদম এই জন্য সুন্দর দক্ষ যদিও হয়, বক্স-মুলার রুপান্তর বাস্তবায়ন সহজ গোড়া থেকে (এবং পাগল ধীর নয়)।
প্রচুর পদ্ধতি রয়েছে:
অন্য যে কোনও ফাংশনের ডিস্ট্রিবিউশন পরিবর্তন করা আপনার নিজের প্রয়োজন ফাংশনের বিপরীতটি ব্যবহার করে using
অন্য কথায়, যদি আপনি একটি নির্দিষ্ট সম্ভাব্যতা ফাংশন পি (এক্স) লক্ষ্য করে থাকেন তবে আপনি এর সাথে সংহত করে বন্টন পাবেন -> ডি (এক্স) = ইন্টিগ্রাল (পি (এক্স)) এবং এর বিপরীতটি ব্যবহার করুন: ইনভ (ডি (এক্স)) । এখন এলোমেলো সম্ভাব্যতা ফাংশন (যা অভিন্ন বন্টন রয়েছে) ব্যবহার করুন এবং ইনভ (ডি (এক্স)) ফাংশনটির মাধ্যমে ফলাফলের মানটি ফেলে দিন। আপনার পছন্দসই ফাংশন অনুযায়ী বিতরণ সহ এলোমেলো মানগুলি পাওয়া উচিত।
এটি জেনেরিক গণিতের পদ্ধতির - এটি ব্যবহার করে আপনি এখন যে কোনও সম্ভাবনা বা বিতরণ ফাংশন বেছে নিতে পারেন যতক্ষণ না এর বিপরীত বা ভাল বিপরীত সীমাবদ্ধতা থাকে।
আশা করি বিতরণটি ব্যবহার করার বিষয়ে ক্ষুদ্র মন্তব্যটির জন্য এটি সাহায্য করেছে এবং ধন্যবাদ এবং সম্ভাবনা নিজেই নয় thanks
বক্স-মুলার রূপান্তরটির মেরু রূপটি ব্যবহার করে এখানে একটি জাভাস্ক্রিপ্ট বাস্তবায়ন করা হচ্ছে।
/*
* Returns member of set with a given mean and standard deviation
* mean: mean
* standard deviation: std_dev
*/
function createMemberInNormalDistribution(mean,std_dev){
return mean + (gaussRandom()*std_dev);
}
/*
* Returns random number in normal distribution centering on 0.
* ~95% of numbers returned should fall between -2 and 2
* ie within two standard deviations
*/
function gaussRandom() {
var u = 2*Math.random()-1;
var v = 2*Math.random()-1;
var r = u*u + v*v;
/*if outside interval [0,1] start over*/
if(r == 0 || r >= 1) return gaussRandom();
var c = Math.sqrt(-2*Math.log(r)/r);
return u*c;
/* todo: optimize this algorithm by caching (v*c)
* and returning next time gaussRandom() is called.
* left out for simplicity */
}
আপনার সুবিধার জন্য কেন্দ্রীয় সীমাবদ্ধ উপপাদ্য উইকিপিডিয়া এন্ট্রি ম্যাথওয়ার্ল্ড এন্ট্রি ব্যবহার করুন।
অভিন্ন বিতরণকারী সংখ্যার এন তৈরি করুন, তাদের যোগফলগুলি, n * 0.5 কে বিয়োগ করুন এবং আপনার 0 এর সমান গড় এবং বৈকল্পিক সমান (1/12) * (1/sqrt(N))( প্রায় শেষের জন্য ইউনিফর্ম বিতরণে উইকিপিডিয়া দেখুন ) সহ একটি প্রায় সাধারণ বিতরণের আউটপুট রয়েছে
n = 10 আপনাকে অর্ধেক শালীন দ্রুত উপহার দেয়। আপনি যদি অর্ধেকেরও বেশি শালীন চান তবে টাইলার সলিউশনে যান (যেমন সাধারণ বিতরণে উইকিপিডিয়া প্রবেশে উল্লিখিত )
আমি বক্স-মুলার ব্যবহার করব। এই সম্পর্কে দুটি জিনিস:
যেখানে আর 1, আর 2 এলোমেলো ইউনিফর্ম সংখ্যা:
1 এর এসডি সহ সাধারণ ডিস্ট্রিবিউটশন: স্কয়ার্ট (-2 * লগ (আর 1)) * কোস (2 * পাই * আর 2)
এটি হুবহু ... এই সমস্ত ধীর লুপগুলি করার দরকার নেই!
এটি অবিশ্বাস্য মনে হয় যে আমি আট বছর পরে এগুলিতে কিছু যুক্ত করতে পারলাম, তবে জাভার ক্ষেত্রে আমি পাঠকদের র্যান্ডম.অ্যানেক্সটগুশিয়ায় নির্দেশ করতে চাই point পদ্ধতিতে , যা আপনার জন্য গড় 0.0 এবং স্ট্যান্ডার্ড বিচ্যুতি 1.0 নিয়ে একটি গাউসিয়ান বিতরণ উত্পন্ন করে।
একটি সাধারণ সংযোজন এবং / বা গুণগুলি আপনার প্রয়োজনের গড় এবং মান বিচ্যুতি পরিবর্তন করবে।
স্ট্যান্ডার্ড পাইথন লাইব্রেরি মডিউলটি এলোমেলোভাবে যা চায় তা রয়েছে:
সাধারন বিতরণ (মিউ, সিগমা) সাধারণ বিতরণ। মিউ মানে, এবং সিগমা হ'ল মানক বিচ্যুতি।
নিজেই অ্যালগরিদমের জন্য পাইথন লাইব্রেরিতে এলোমেলো.পি.তে ফাংশনটি একবার দেখুন।
ডোনাল্ড নুথের বইটি আর্ট অফ কম্পিউটার প্রোগ্রামিংয়ের বই ৩.৪.১ বিভাগ থেকে এটি অ্যালগরিদম পি ( সাধারণ বিচ্যুতির জন্য পোলার পদ্ধতি ) এর আমার জাভাস্ক্রিপ্ট বাস্তবায়ন :
function normal_random(mean,stddev)
{
var V1
var V2
var S
do{
var U1 = Math.random() // return uniform distributed in [0,1[
var U2 = Math.random()
V1 = 2*U1-1
V2 = 2*U2-1
S = V1*V1+V2*V2
}while(S >= 1)
if(S===0) return 0
return mean+stddev*(V1*Math.sqrt(-2*Math.log(S)/S))
}
এক্সেলটিতে আপনার চেষ্টা করা উচিত বলে আমি মনে করি: =norminv(rand();0;1)। এটি এলোমেলো সংখ্যার উত্পাদন করবে যা সাধারণত শূন্যের সাথে বিতরণ করা উচিত এবং বৈকল্পিকতা একত্রিত করা উচিত। "0" যে কোনও মান দিয়ে সরবরাহ করা যেতে পারে, যাতে সংখ্যাগুলি পছন্দসই গড় হতে পারে এবং "1" পরিবর্তন করে আপনি আপনার ইনপুটটির বর্গক্ষেত্রের সমান বৈকল্পিক পাবেন।
উদাহরণস্বরূপ: =norminv(rand();50;3)MEAN = 50 VARIANCE = 9 এর সাথে সাধারণত বিতরণ করা সংখ্যায় ফল পাবেন।
প্রশ্ন আমি কীভাবে ইউনিফর্ম বিতরণকে (যেমন এলোমেলো সংখ্যা জেনারেটর উত্পাদন করে, যেমন 0.0 এবং 1.0 এর মধ্যে) একটি সাধারণ বিতরণে রূপান্তর করতে পারি?
সফ্টওয়্যার বাস্তবায়নের জন্য আমি এমন কয়েকটি দম্পতি র্যান্ডম জেনারেটরের নাম জানি যা আপনাকে [0,1] (মের্সেন টুইস্টার, লিনিয়ার কংগ্রুয়েট জেনারেটর) এর মধ্যে সিউডো অভিন্ন র্যান্ডম ক্রম দেয়। একে এটিকে ইউ (এক্স) বলি
এটি গাণিতিক অঞ্চল যা সম্ভাব্যতা তত্ত্ব বলা হয়। প্রথম জিনিস: আপনি যদি অবিচ্ছেদ্য ডিস্ট্রিবিউশন এফ দিয়ে আরভি মডেল করতে চান তবে আপনি কেবল এফ ^ -1 (ইউ (এক্স)) মূল্যায়নের চেষ্টা করতে পারেন। প্রাথমিকভাবে এটি প্রমাণিত হয়েছিল যে এই জাতীয় আরভিতে অবিচ্ছেদ্য বিতরণ এফ থাকবে।
পদক্ষেপ 2 কোনও সমস্যা ছাড়াই বিশ্লেষণাত্মকভাবে এফ ^ -1 উদ্ভূত হতে পারে যখন কোনও গণনা পদ্ধতি ব্যবহার না করেই আরভি ~ এফ উত্পাদন করার জন্য উপযুক্ত হতে পারে। (যেমন এক্সপ্রেস ডিস্ট্রিবিউশন)
সাধারণ বিতরণকে মডেল করার জন্য আপনি y1 * কোস (y2) কে ক্যাক্কুলেট করতে পারেন, যেখানে y1 [[0,2pi] তে সমান। এবং y2 হ'ল রিলে বিতরণ।
প্রশ্ন: আমি যদি আমার নির্বাচনের কোনও গড় এবং মানক বিচ্যুতি চাই?
আপনি সিগমা * এন (0,1) + এম গণনা করতে পারেন।
এটি দেখানো যেতে পারে যে এ জাতীয় স্থানান্তর এবং স্কেলিং N (মি, সিগমা) এর দিকে পরিচালিত করে
বক্স-মুলার রূপান্তরটির মেরু রূপটি ব্যবহার করে এটি একটি মতলব বাস্তবায়ন :
ফাংশন randn_box_muller.m:
function [values] = randn_box_muller(n, mean, std_dev)
if nargin == 1
mean = 0;
std_dev = 1;
end
r = gaussRandomN(n);
values = r.*std_dev - mean;
end
function [values] = gaussRandomN(n)
[u, v, r] = gaussRandomNValid(n);
c = sqrt(-2*log(r)./r);
values = u.*c;
end
function [u, v, r] = gaussRandomNValid(n)
r = zeros(n, 1);
u = zeros(n, 1);
v = zeros(n, 1);
filter = r==0 | r>=1;
% if outside interval [0,1] start over
while n ~= 0
u(filter) = 2*rand(n, 1)-1;
v(filter) = 2*rand(n, 1)-1;
r(filter) = u(filter).*u(filter) + v(filter).*v(filter);
filter = r==0 | r>=1;
n = size(r(filter),1);
end
end
এবং histfit(randn_box_muller(10000000),100);এটি অনুরোধ ফলাফল:

স্পষ্টতই এটি মাতলাব অন্তর্নির্মিত র্যাঙ্কের সাথে তুলনায় সত্যিই অদক্ষ ।
আমার কাছে নিম্নলিখিত কোড রয়েছে যা সম্ভবত সাহায্য করতে পারে:
set.seed(123)
n <- 1000
u <- runif(n) #creates U
x <- -log(u)
y <- runif(n, max=u*sqrt((2*exp(1))/pi)) #create Y
z <- ifelse (y < dnorm(x)/2, -x, NA)
z <- ifelse ((y > dnorm(x)/2) & (y < dnorm(x)), x, z)
z <- z[!is.na(z)]
এটি সাধারণ বিতরণের জন্য এলোমেলো সংখ্যা জেনারেটর লেখার চেয়ে দ্রুততর হওয়ার কারণে প্রয়োগকৃত ফাংশন রনরম () ব্যবহার করাও সহজ। নীচের কোডটি প্রমাণ হিসাবে দেখুন
n <- length(z)
t0 <- Sys.time()
z <- rnorm(n)
t1 <- Sys.time()
t1-t0
function distRandom(){
do{
x=random(DISTRIBUTION_DOMAIN);
}while(random(DISTRIBUTION_RANGE)>=distributionFunction(x));
return x;
}