Birisi bana nasıl benzetileceğini söyleyebilir mi , nerede , bir bozuk para kullanarak (istediğiniz kadar) ?
Reddetme örneklemesi kullanmayı düşünüyordum ama çivilemedim.
Birisi bana nasıl benzetileceğini söyleyebilir mi , nerede , bir bozuk para kullanarak (istediğiniz kadar) ?
Reddetme örneklemesi kullanmayı düşünüyordum ama çivilemedim.
Yanıtlar:
Sayılamayacak kadar çok çözüm olduğu için verimli bir çözüm bulalım .
Bunun arkasındaki fikir, bir Bernoulli değişkenini uygulamanın standart bir yoluyla başlar: tek tip rastgele bir değişkeni karşılaştırın parametreye . Ne zaman, dönüş ; aksi halde geri dön.
Biz kullanabilirsiniz -örnek rastgele sayı üreteci olarak para . Sayı oluşturmak için herhangi bir aralıkta eşit olarak , parayı Çevir. Kafalar olduğunda, özyinelemeli olarak eşit bir değer üretin İlk olarak aralığın bir kısmı; kuyruk olduğunda, özyineli olarak üretmek sondan aralığın bir parçası. Bir noktada hedef aralığı o kadar küçük olur ki, ondan nasıl bir sayı seçeceğiniz önemli değildir: özyineleme bu şekilde başlar. Bu prosedürün, indüksiyonla kolayca kanıtlandığı gibi, tekdüze değişkenler (istenen herhangi bir hassasiyete kadar) oluşturduğu açıktır.
Bu fikir etkili değildir, ancak etkili bir yönteme yol açar. Her aşamada belirli bir aralıktan bir sayı çizeceğiniz için, neden ilk önce çizmeniz gerekip gerekmediğini kontrol etmiyorsunuz? Hedef değeriniz bu aralığın dışındaysa , rastgele değer ile hedef arasındaki karşılaştırmanın sonucunu zaten biliyorsunuzdur. Böylece, bu algoritma hızla sona ermeye meyillidir. (Bu , soruda istenen ret örnekleme prosedürü olarak yorumlanabilir .)
Bu algoritmayı daha da optimize edebiliriz. Herhangi bir aşamada, aslında kullanabileceğimiz iki jetonumuz var: jetonumuzu yeniden etiketleyerek, şans eseri olan bir paraya dönüştürebiliriz. Bu nedenle, bir ön hesaplama olarak, hangi yeniden etiketlemenin sonlandırma için gerekli olan daha düşük sayıdaki döndürmeye yol açacağını yinelemeli olarak seçebiliriz. (Bu hesaplama pahalı bir adım olabilir.)
Örneğin, bozuk para kullanmak Bernoulli'yi taklit etmekdoğrudan değişken: ortalama olarak yaklaşık on döndürür. Ama eğer bir madeni para, o zaman sadece iki döndürme yapıldığından emin olacağız ve beklenen döndürme sayısı sadece .
Detaylar burada.
Herhangi bir yarı açık aralığı bölme aralıklarla
Bu iki dönüşümü tanımlar ve yarı açık aralıklarla çalışan
Bir terminoloji meselesi olarak, herhangi bir gerçek sayı kümesi ifade izin
demek istediğim için bir alt sınır : hepsi için . Benzer şekilde, anlamına geliyor için bir üst sınır .
Yazmak . (Aslında, eğer fark etmezrasyonel yerine gerçek; sadece buna ihtiyacımız var.)
İşte bir değişken üretmek için algoritma istenen Bernoulli parametresiyle:
Ayarlamak ve .
Süre {Üretmek için jetonu atın . Ayarlamak artım .}
Eğer sonra ayarla . Aksi takdirde,.
Açıklamak gerekirse, burada R
aloritmanın bir işlevi olarak uygulanması söz konusudur draw
. Argümanları hedef değerdir ve aralık , başlangıçta . Yardımcı fonksiyon s
uygulamasını kullanır. Gerek duymasa da, madeni para sayısını da izler. Rastgele değişkeni, fırlatma sayısını ve incelediği son aralığı döndürür.
s <- function(x, ab, p) {
d <- diff(ab) * p
if (x == 1) c(ab[1], ab[1] + d) else c(ab[1] + d, ab[2])
}
draw <- function(target, p) {
between <- function(z, ab) prod(z - ab) <= 0
ab <- c(0,1)
n <- 0
while(between(target, ab)) {
n <- n+1; ab <- s(runif(1) < p, ab, p)
}
return(c(target > ab[2], n, ab))
}
Kullanımının ve doğruluğunun testinin bir örneği olarak, davayı ele alın ve . Hadi çizelim algoritmayı kullanarak değerleri, ortalama (ve standart hatasını) rapor edin ve kullanılan ortalama döndürme sayısını belirtin.
target <- 0.01
p <- 0.9
set.seed(17)
sim <- replicate(1e4, draw(target, p))
(m <- mean(sim[1, ])) # The mean
(m - target) / (sd(sim[1, ]) / sqrt(ncol(sim))) # A Z-score to compare to `target`
mean(sim[2, ]) # Average number of flips
Bu simülasyonda döndürürlerin kafaları vardı. Hedefinden daha düşük olmasına rağmen, Z puanı önemli değildir: bu sapma şansa bağlanabilir. Ortalama döndürme sayısı- ondan biraz daha az. Eğer kullansaydık sikke, ortalama olurdu --Hedeften önemli ölçüde farklı değil, sadece flips ortalama olarak gerekli olurdu.
İşte bir çözüm (dağınık bir çözüm, ama bu benim ilk bıçakım). Aslında yok sayabilirsiniz ve WLOG varsayalım . Neden? İki önyargılı madeni para saygısından tarafsız bir madeni para çevirme üretmek için akıllı bir algoritma vardır . Böylece 1/2 olduğunu varsayabiliriz .
Bir oluşturmak için iki çözüm düşünebilirim (birincisi benim değil, ikincisi bir genellemedir):
Tarafsız parayı çevirin zamanlar. Eğerkafalar mevcut değil, baştan başla. Eğerkafaları vardır (nedeniyle ilk para bir heads olup dönüş olup, bu)
Bu herhangi bir değere genişletilebilir . Yazmakikili biçimde. Örneğin,
Bozuk para kullanarak yeni bir ikili sayı oluşturacağız. İle başlave bir kafa (1) veya kuyruk (0) görünmesine bağlı olarak rakam ekleyin. Her kapakta, yeni ikili numaranızı, aynı basamağa kadar . Sonunda ikisi birbirinden ayrılacak ve eğer ikili numaranızdan büyük.
Python'da:
def simulate(p):
binary_p = float_to_binary(p)
binary_string = '0.'
index = 3
while True:
binary_string += '0' if random.random() < 0.5 else '1'
if binary_string != binary_p[:index]:
return binary_string < binary_p[:index]
index += 1
Bazı kanıtlar:
np.mean([simulate(0.4) for i in range(10000)])
yaklaşık 0.4 (hızlı değil)
Basit bir çözüm görüyorum, ancak şüphesiz bunu yapmanın birçok yolu var, bazıları muhtemelen bundan daha basit. Bu yaklaşım iki adıma ayrılabilir:
Eşit olmayan bir madeni para atma prosedürü (belirli madalyonun kombinasyonu ve olasılıkla bir kafa üretme yönteminin kombinasyonu) eşit olasılıkla iki olaydan üretilir ). Bu iki eşit olay olabilir, ve . [Bunun için çiftler fırlatmayı gerektiren basit bir yaklaşım var ve eşit derecede olası iki sonuç üretmek için, diğer tüm sonuçlar tekrar denemek için yeni bir çift rulo üretilmesine yol açar.]
Simüle edilmiş adil parayı kullanarak iki emici durumla rastgele bir yürüyüş oluşturuyorsunuz. Emici durumların başlangıç noktasından uzaklığını (bir üst ve bir alt) seçerek, üst emme durumunun istenen tamsayı oranı olduğunu söyleyerek emilim şansını ayarlayabilirsiniz. Özellikle, üst emici bariyeri ve altta (ve süreci başlangıç noktasından başlatın) ve emilim kadar rastgele yürüyüşü çalıştırın, üst bariyerdeki emilim olasılığı .
(Burada göstermek için bazı hesaplamalar var, ancak rekürrens ilişkileri ile çalışarak olasılıkları kolayca elde edebilirsiniz ... ya da sonsuz serileri toplayarak yapabilirsiniz ... ya da başka yollar var.)
[self-study]
etiketi ekleyin ve wiki'sini okuyun . Sorunuzun sonunda yardım talebinde bulunmanıza gerek olmadığını unutmayın - burada mesaj gönderen herkesin yardım umduğunu biliyoruz!