Bilinməyən Önyargılı başqa bir sikkədən istifadə edərək bir Sikkə atmağı özbaşına qərəzlə simulyasiya etmək

Bu ilin yanvar ayında işə gedirdim və gündəlik kodlaşdırma problemi olan elektron poçtu müntəzəm olaraq açdım: “Günaydın! Budur bu gün üçün kodlaşdırma reportaj probleminiz. […] 0 və ya 1-i 50-50 olmayan (lakin eyni zamanda 0-100 və ya 100-0 olmayan) bir ehtimalla qaytaran toss_biased () funksiyasına daxil olduğunuzu düşünün. Sikkənin qərəzli olduğunu bilmirsən. Qərəzsiz sikkə atmağı simulyasiya etmək üçün bir funksiya yazın. ”

Məlum olduğu kimi, bu problem gözlədiyimdən çox daha böyük bir problem yaratdı. İlk həll yolu tapmağım üçün təxminən iki iş yeri və bir neçə Jupyter Notebook hüceyrəsi lazım oldu. Bəzi dərin ağac quruluşlarına və s. Güvənərək çox yavaş və səmərəsiz biri. Bu arada problemə bir az daha çox vaxt sərf etdim, araşdırma apardım və inamla deyə bilərəm ki, bu ilki ad günündə yazı kodlaşdırma probleminin daha ümumiləşdirilmiş versiyasına aydın və səmərəli bir həll təqdim edirəm.

Problem bəyanat

Burada tam olaraq nə etmək istədiyimizi anlamağa başlayaq. Tutaq ki, kimsə sizə bəzi qərəzli bir sikkə verdi. Zamanın 50% -ə və quyruqlara enmək əvəzinə, baş və quyruqlar üçün sizə məlum olmayan bəzi fərqli ehtimallar var. Məsələn, bütün atışların 99% -də torpaq başlığı ola bilər. Task, yalnız sizə təqdim olunan ilk, qərəzli sikkədən istifadə edərək başqa bir qərəzsiz sikkə simulyasiya etməkdir . Kiminsə sizdən "başlar" və ya "quyruqlar" deməsini istəməsi mənasında simulyasiya etmək və təsadüfi olaraq 50-50 ilə cavab vermək məcburiyyətindəsiniz. İndi kodlaşdırma problemi bizdən istənən budur, buna baxmayaraq bunu bir addım daha irəli aparacağıq və istənilən pulu simulyasiya edəcəyik.yalnız ilk sikkədən istifadə edərək özbaşına qərəz. Bu məqalənin qalan hissəsi problemin riyazi tərəfini Python tətbiqi və şifahi izahatlarla birləşdirir.

Yuxarıdan verilmiş, şifahi formulyasiya daha qısaca ifadə edilə bilər, burada $ \ operator adı \ left (\ cdot \ right) $ Bernoulli paylanmasıdır:

$ Y \ sim \ operator adını çıxarın Hər hansı bir $ p_2 \ in \ sol [0,1 \ sağ] $ üçün \ sol (p_2 \ sağ) $, verilən $ X \ sim \ operator adı \ sol (p_1 \ sağ) $ bilinməyən $ p_1 \ in (0,1) $ ilə.

Python'da bir Bernoulli paylanmasından sonra təsadüfi bir dəyişəni heç birdən 0 ya da 1-ə uyğun bir funksiya olaraq təyin etmək olar.

Sonra hər hansı bir qərəzli təsadüfi dəyişənlər yaradan daha yüksək səviyyəli bir funksiya təyin edirik. Bu qərəzli sikkə generatorumuzdur.

Bəzi $ p_1 $ verildiyi üçün, any_x_rv, çağırıldığı zaman 1 ehtimalı $ p_1 $ və 0 ($ -1-p_1) $ ehtimalı ilə qaytaran bir funksiyanı qaytarır.

Bir funksiya axtarırıq

təsadüfi bir dəyişən (məsələn any_x_rv tərəfindən qaytarılmış bəzi funksiya) və ikinci bir ehtimal $ p_2 $ alır. Qeyd edək ki, any_y_rv x_rv-nin daxili hissələrini bilmir. Yalnız təmin olunan funksiyanı qiymətləndirə bilər. Any_y_rv-nin qaytarma növü yenə də təsadüfi bir dəyişəndir, yəni qiymətləndirilə bilən bir funksiyadır. $ P_2 $ ehtimalı ilə 1-i qaytarmaq lazım idi.

Problemi özünüz həll etmək istəyirsinizsə, indi fasilə vermək və düşünmək üçün yaxşı zamandır. Any_y_rv tətbiq etməyə çalışın!

Problemi iki mərhələdə həll edəcəyik: Birincisi, sikkədən bizə verilən ədalətli bir sikkə yaratmaq. İkincisi, hər hansı bir qərəzli pulu simulyasiya etmək üçün süni ədalətli sikkədən istifadə etmək.

Ədalətli Sikkəni qərəzli Coin ilə simulyasiya etmək

İlk addımda, $ \ operator adından sonra təsadüfi bir $ Z $ dəyişənini qururuq \ sol (0.5 \ sağ) $ -dan $ X $. Xatırladaq ki, $ \ Pr \ sol [X = 1 \ sağ] = p_1 $ bizə məlum deyil. $ (X_1, X_2) $ təsadüfi $ X $ nümunəsidir. Kassanın bütün mümkün nəticələri üçün ehtimallar: \ başlamaq

\ Pr \ sol [X_1 = 0, X_2 = 0 \ sağ] & = \ sol (1-p_1 \ sağ) ^ 2 \\

\ Pr \ sol [X_1 = 0, X_2 = 1 \ sağ] & = \ sol ( 1-p_1 \ sağ) \ dəfə p_1 \\

\ Pr \ sol [X_1 = 1, X_2 = 0 \ sağ] & = p_1 \ dəfə \ sol (1-p_1 \ sağ) \\

\ Pr \ sol [X_1 = 1 , X_2 = 1 \ sağ] & = p_1 ^ 2 \ ,.

\ end

Dörd nəticədən ikisinin ehtimalı bərabərdir, yəni $ X_1 \ ne X_2 $, yəni $ \ Pr \ sol [X_1 = 0, X_2 = 1 \ sağ] = \ Pr \ sol [X_1 = 1, X_2 = 0 \ sağ] $. Bu həqiqət ədalətli bir sikkə qurarkən faydalıdır. $ Z_1-i $ X_1 = 1 olduqda 1, X_2 = 0 $ və $ X_1 = 0, X_2 = 1 $ olduqda 0 olaraq təyin edirik. Bütün digər hallarda yenidən $ (X_1, X_2) $ cədvəlindən çəkirik. $ X $ qeyri-deterministik olduğundan həmişə 0 və ya həmişə 1 olmur, nəticədə ilk vəziyyətlə qarşılaşacağımıza zəmanət verilir.

Bu fikir John von Neumann tərəfindən “Təsadüfi rəqəmlərlə əlaqəli istifadə olunan müxtəlif texnika” (1951) əsərində təqdim edilmişdir. Şifahi olaraq təlimatlar bunlardır:

  1. Qərəzli sikkəni iki dəfə atın.
  2. İki nəticə eynidirsə, onları görməməzliyə vurun (1).
  3. İki nəticə fərqlənirsə, ilk sikkənin nəticəsini ədalətli sikkələrin atılması nəticəsində istifadə edin.

Alqoritmin Python tətbiqi belə görünür:

Z_rv funksiyası $ Z $ -ı təmsil edir. Qərəzli sikkəni təmsil edən başqa bir təsadüfi dəyişən $ X $ tələb olunur. Funksiya nümunələri $ X $ -dan bir nümunə toplusu fərqlənənə qədər. Vəziyyət belə olduqda, xəndəyin ilk elementini qaytarır, yəni x_1.

Bu nöqtədə qərəzli hər hansı bir sikkə əsaslanan süni bir ədalətli sikkə əldə edə bilərik. Bunu atmaq üçün sadəcə z_rv deyirik. İkinci addımın vaxtı.

Ədalətli Coin verilmiş hər hansı bir qərəz ilə bir Coin simulyasiya

Ədalətli sikkə $ Z \ sim \ operator adı verilmişdir \ sol (0.5 \ sağ) $, $ Y \ sim \ operator adını simulyasiya etməyə çalışırıq $ Z $ istifadə edərək hər hansı bir $ p_2 $ üçün \ sol (p_2 \ sağ) $. Bu bölmədə irəli sürülən metod, Александър Макелов tərəfindən “Bir sikkəni 2 gözlənilən atışda özbaşına tərəfləşdirmək” blog yazısından götürülmüşdür.

$ A_i \ in \ left \ $ ikili genişlənməsini $ i \ in \ mathbb ilə təyin etməyə başlayırıq. $, verilən $ p_2 $ ehtimalından $$ p_2 = \ sum_ ^ \ infty \ frac \,. $$ $ a_1, a_2, \ dots $ dəyərlərini $ p_2 $: $ p_2 = 0.a_1a_2 \ dots $ ikili təsvirinin kəsr rəqəmləri kimi düşünə bilərsiniz. $ P_2 $ verildiyi üçün ardıcıllıq tamamilə bizə məlumdur. Budur bir nümunə: Tutaq ki, $ p_2 = 0.8 $. $$ p_2 = 0.8 = \ frac + \ frac + \ frac + \ frac + \ frac + \ nöqtələr \ ,, $$ burada $ a = (1,1,0,0,1, \ nöqtələr) $. $ a $ sonsuz və dövri ola bilər, amma bizim üçün heç bir əhəmiyyəti yoxdur.

$ a $, bir generatoru qaytaran bir Python funksiyası olaraq həyata keçirilir ki, sonsuz dəyər axını tələbə uyğun olaraq ardıcıl oxunsun:

$ Z_1, Z_2, \ dots $ təsadüfi $ Z $ nümunəsi olsun. $$ \ hat təyin edirik (i): = \ başlayın

0 & >Z_i>a_i \\

1 & >Z_i
\ hat (i + 1) & \ ,,>

\ end $$ , $ p_2 $ kəsrli rəqəmləri üzərində təkrarlanır və hər biri üçün $ i $ - $ Z $ nümunəsini istifadə edir. Hər addımda $ Z_i $ ilə $ a_i $ rəqəmini müqayisə edir və $ Z_i \ ne a_i $ olduqda sona çatır. Alex Irpanın bu blog yazısı bunun nə üçün işlədiyini yaxşı bir vizual intuisiya ilə təmin edir. İndi $ Y $, $ Y: = \ hat olaraq təyin edilə bilər (1) $.

Tətbiqimizdə $ Y $ əvvəlcədən təyin olunmuş iki z_rv (qərəzsiz sikkə simulyatoru) və a ($ p_2 $ ikili genişlənmə) funksiyalarından istifadə edən bir funksiyadır:

Son Çözüm

Parçaları bir araya gətirərək aşağıdakı Python parçasını alırıq:

Məsələn, $ p_1 = 0.1 $ ilə yeni, qərəzli bir sikkə $ X $ yarada bilərik (bu, hər hansı bir $ \ in (0,1) $ ola bilər)

və bəzi fərqli qərəzli yeni, qərəzli bir $ Y $ sikkəsini alın, deyək ki, $ p_2 = 0.73 $

yalnız 20 dəfə atmaq üçün:

Və oraya gedirik: naməlum qərəzli başqa bir sikkə əsasında özbaşına qərəzli bir sikkə düzəltdik! İndi atıla bilər:

Problemə bir ton maraq göstərdiyinə və tamamilə fərqli, eyni zamanda zərif bir şəkildə riyazi şəkildə həll etdiyinə görə həmkarım Lennart van der Gotenə çox təşəkkür edirəm. Tələbə yoldaşım Tanja Bien bu yazı üçün gözəl görünən fotoları çəkdi. Çox sağ olun!

Çözümün düzgünlüyünü qiymətləndirmək üçün hər hansı bir $ p_2 \ in \ sol [0,1 \ sağ] $ üçün bir sikkə simulyasiya etdim və dəfələrlə atdım: