二項分佈演算法(伯努利實驗)
二項分佈
問題描述:
二項分佈就是重複n次獨立的伯努利試驗。在每次試驗中只有兩種可能的結果,而且兩種結果發生與否互相對立,並且相互獨立,與其它各次試驗結果無關,事件發生與否的概率在每一次獨立試驗中都保持不變,則這一系列試驗總稱為n重伯努利實驗,當試驗次數為1時,二項分佈服從0-1分佈。
假設伯努利實驗中事件發生的概率為p,求n次獨立的伯努利實驗,事件發生k次的概率。
數學公式
我們都知道,上述問題可採用公式(1):
計算,其中
我們還知道:
於是:
我們記
於是我們有:
演算法:
遞迴演算法:
演算法思想:
遞迴演算法思想就是來源於上面的公式(6),我們只需要找到遞迴出口,也就是最基本的情況就行了。
很明顯:我們有
遞迴演算法程式碼:
/**
* 時間複雜度:O(2^n)
* @param N
* @param K
* @param p
* @return 伯努利實驗n次,事件發生k次的概率
*/
public static double binomialRec(int N, int K, double p) {
if (N == 0 && K == 0)
return 1.0;
if (N < 0 || K < 0)
return 0.0;
return (1.0 - p) * binomialRec(N - 1, K, p) + p * binomialRec(N - 1, K - 1, p);
}
非遞迴演算法
演算法思想:
上述遞迴演算法的時間複雜度太高,當n比較大時,可能都執行不出結果。之所以時間複雜度太高,是因為有大量的重複計算,於是很直觀的想法就是,把已經算出來的結果儲存到數組裡。由於是計算實驗n次,事件發生k次的概率,所以我們可以用二維陣列存放計算的中間結果。
非遞迴演算法程式碼:
/**
*
* 伯努利實驗,實驗n次,出現k次的概率
* 非遞迴方式實現,採用二維陣列儲存已經計算過的值
* 時間複雜度:O(n * k),空間複雜度:O(n * k)
* @param n
* @param k
* @param p
* @return
*/
public static double binomialArray(int n, int k, double p) {
double[][] array = new double[n+1][k+1];
// Initilize array
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= k; j++) {
array[i][j] = 0;
}
}
array[0][0] = 1.0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) {
if (j > i) {
break;
}
if (i - 1 >= 0) {
array[i][j] += (1.0 - p) * array[i-1][j];
if (j - 1 >= 0) {
array[i][j] += p * array[i-1][j-1];
}
}
}
}
return array[n][k];
}
非遞迴演算法改進
演算法思想: 上述非遞迴演算法中,我們使用的是二維陣列存放計算過的值,但我們發現,在計算array[i][j]時,只與其上一行的array[i-1][j]和array[i-1][j-1]有關,與其他值無關,所以我們可以使用一維陣列來實現。這樣空間複雜度可以降低到O(k).
非遞迴演算法改進程式碼:
/**
* 伯努利實驗,實驗n次,出現k次的概率
* 非遞迴方式實現,採用一維陣列實現儲存計算過的值
* 時間複雜度:O(n * k),空間複雜度:O(k)
* @param n
* @param k
* @param p
* @return
*/
public static double binomial(int n, int k, double p) {
double[] array = new double[k+1];
for (int i = 0; i < array.length; i++) {
array[i] = 0.0;
}
array[0] = 1.0;
for (int i = 1; i <= n; i++) {
// 這裡要倒著計算,因為正序計算新值會覆蓋掉之前的舊值
for (int j = k; j >= 0; j--) {
if (j - 1 >= 0) {
array[j] = (1.0 - p) * array[j] + p * array[j-1];
}
else {
array[j] = (1.0 - p) * array[j];
}
}
}
return array[k];
}
相關推薦
二項分佈演算法(伯努利實驗)
二項分佈 問題描述: 二項分佈就是重複n次獨立的伯努利試驗。在每次試驗中只有兩種可能的結果,而且兩種結果發生與否互相對立,並且相互獨立,與其它各次試驗結果無關,事件發生與否的概率在每一次獨立試驗中都保持不變,則這一系列試驗總稱為n重伯努利實驗,當試驗次數
二項分佈演算法(遞迴)
關於用遞迴實現的二項分佈演算法 最近在看Sedgewick的《演算法》的時候有一題習題是關於改進用遞迴實現的二項分佈演算法。這裡我令服從二項分佈為$X\sim b(N,k,p)$,書本上習題給出
【程式設計師眼中的統計學(6.2)】原創實現二項分佈演算法以及應用
package DistTools; /** * * @(#)GeoDist.java * @Description:描述:本演算法中在n次伯努利試驗中:試驗n次得到r次成功的概率、二項分佈的期望、二項分佈方差的具體實現。 * @Definitions:定義:在相互獨立事件中
51nod 1228 (伯努利數 + 組合數學)
題目: 求這個∑i=1nik 題目給你 n , k。 分析: 伯努利數於冪數和的關係: 伯努利數: 這麼多性質可以直接寫了 Code: import java.util.Scanner; public class Main {
HDU 6439 2018CCPC網路賽 Congruence equationI(杜教篩 + 莫比烏斯反演 + 伯努利數)
大致題意:給你一個長度為k的序列a。對於序列c,當 時,;當時,取[0,m)中任意一個數字。令 表示滿足 的序列c的方案數。現在讓你求 。 首先,根據裴蜀定理,滿足的條件是,那麼我們不妨分為兩種情況處理。對於的數字,假設他們的gcd為g,那麼剩下的
洛谷3711:倉鼠的數學題(NTT+伯努利數)
題面 題意:給出a陣列,求 ∑nk=0Sk(x)ak 所表示多項式的每一項係數。 額,直接將伯努利數帶進S裡,得 =∑k=0nakk+1∑g=0kCgk+1Bgxk+1−g=∑k=0nakk!∑g=0nBgg!xk+1−g(k+1−g)! 設c=k+
伯努利分佈、二項分佈、Beta分佈、多項分佈和Dirichlet分佈與他們之間的關係,以及在LDA中的應用
在看LDA的時候,遇到的數學公式分佈有些多,因此在這裡總結一下思路。 一、伯努利試驗、伯努利過程與伯努利分佈 先說一下什麼是伯努利試驗: 維基百科伯努利試驗中: 伯努利試驗(Bernoulli trial)是隻有兩種可能結果的單次隨機試驗。 即:對於一個隨機變數而言,P(X
伯努利分佈、二項分佈、幾何分佈、超幾何分佈、泊松分佈
導語 對於任何一個學習概率論的童鞋來說,各種分佈都是很頭痛的一件事情,本篇主要討論的是離散型隨機變數. 伯努利分佈 伯努利分佈就
伯努利分佈、二項分佈、多項分佈、貝塔分佈、狄利克雷分佈、高斯分佈
伯努利分佈: 伯努利分佈(Bernoulli distribution)又名兩點分佈或0-1分佈,介紹伯努利分佈前首先需要引入伯努利試驗(Bernoulli trial)。 伯努利試驗是隻有兩種可能結果的單次隨機試驗,即對於一個隨機變數X而言: 伯努利試驗都可以表達為“是或否”
伯努利分佈、二項分佈、泊松分佈、指數分佈簡介
伯努利分佈: 首先說伯努利分佈, 這個是最簡單的分佈,就是0-1分佈 以拋硬幣為例, 為正面的概率為p, 反面的概率為q 是一種離散型概率分佈,也是很多分佈的基礎 二項分佈: 還是以伯努利分佈為基礎,假設伯努利分佈中得1的概率為p, 0的概率為q 那麼二項
統計與分佈之伯努利分佈與二項分佈
目錄 目錄 前文列表 伯努利分佈 二項分佈 前文列表 伯努利分佈 伯努利分佈(Bernoulli Distribution),是一種離散分佈,又稱為 “0-1 分佈” 或 “兩點分佈”。例如拋硬幣的正面或反面,物品有缺陷或沒缺陷,
數學(3) 各種數學分佈,高斯,伯努利,二項,多項,泊松,指數,Beta,Dirichlet
打算這裡記錄各種數學分佈,隨時更新 正態分佈 正態分佈又名高斯分佈。 若隨機變數X服從一個數學期望為μ,標準差為σ的正態分佈,則記為X~N(μ,σ2)。 其中期望μ決定了分佈位置,標準差σ決定了分佈幅度。 概率密度函式為: f(x)=1σ2π
Statistical Inference-伯努利分佈(Bernoulli Distribution)以及例子說明
Example: 扔硬幣8次,7次為頭(1)的概率? ·····································································
演算法學習——回溯之伯努利裝錯信封問題
演算法描述 某人給6個朋友每個人都寫了一封信,同時寫了這6個朋友地址的信封,有多少種投放信箋的方法,使得每封信與信封上的收信人都不相符? 演算法思路 6封信可能出現的結果: 所有的信都是在對應的信封中,也就是所有的信都放對了信封,這種情況只有一種 部分信放錯了信封
SPSS中八類常用非引數檢驗之二 二項分佈(Binomial)檢驗
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
第十一次作業——正太(高斯),多項式,伯努利
1.使用樸素貝葉斯模型對iris資料集進行花分類 嘗試使用3種不同型別的樸素貝葉斯: 高斯分佈型 多項式型 伯努利型 2.使用sklearn.model_selection.cross_val_score(),對模型進行驗證。 垃圾郵件分類 資料準備: 用csv讀取郵件資料
python 伯努利分佈
伯努利分佈 是一種離散分佈,有兩種可能的結果。1表示成功,出現的概率為p(其中0<p<1)。0表示失敗,出現的概率為q=1-p。這種分佈在人工智慧裡很有用,比如你問機器今天某飛機是否起飛了,它的回覆就是Yes或No,非常明確,這個分佈在分類演算法裡使用比較多,因此在這裡先學習 一下。
伯努利分佈和高斯分佈下的最大似然估計
最大似然估計: 由於每一個樣本是否出現都對應著一定的概率,而且一般來說這些樣本的出現都不那麼偶然,因此我們希望這個概率分佈的引數能夠以最高的概率產生這些樣本。如果觀察到的資料為D1 , D2 , D3 ,…, DN ,那麼極大似然的目標如下: 通常上面這個概率的計算並不容易。
R語言學習(三)——二項分佈
二項分佈統計推斷 dbinom(x, size, prob):計算某點的概率值 x:生成隨機數的數量;size:伯努利實驗的次數;prob:試驗成功的概率 pbinom(q, size, prob):生成累積概率 qbinom(p, size, prob):生成
伯努利分佈、泊松分佈
1. 伯努利分佈 伯努利分佈(Bernoulli distribution)又名兩點分佈或0-1分佈,介紹伯努利分佈前首先需要引入伯努利試驗(Bernoulli trial)。 伯努利試驗是隻有兩種可能結果的單次隨機試驗,即對於一個隨機變數X而言: 伯