1. 程式人生 > >二項分佈演算法(伯努利實驗)

二項分佈演算法(伯努利實驗)

二項分佈

問題描述:

二項分佈就是重複n次獨立的伯努利試驗。在每次試驗中只有兩種可能的結果,而且兩種結果發生與否互相對立,並且相互獨立,與其它各次試驗結果無關,事件發生與否的概率在每一次獨立試驗中都保持不變,則這一系列試驗總稱為n重伯努利實驗,當試驗次數為1時,二項分佈服從0-1分佈。

假設伯努利實驗中事件發生的概率為p,求n次獨立的伯努利實驗,事件發生k次的概率。

數學公式

我們都知道,上述問題可採用公式(1):

P(X=k)=Cknpk(1p)nk(1)
計算,其中 Ckn=n!k!(nk)!(2)

我們還知道:

Ckn=n!k!(nk)!=
(n1)!k!(n1k)!+(n1)!(k1)!(nk)!=Ckn1+Ck1n1(3)

於是:

Cknpk(1p)nk=(1p)Ckn1pk(1p)n1k+pCk1n1pk1(1p)nk(4)

我們記

f(n,k)=Cknpk(1p)nk(5)

於是我們有:

f(n,k)=(1p)f(n1,k)+pf(n1,k1)(6)

演算法:

遞迴演算法:

演算法思想:

遞迴演算法思想就是來源於上面的公式(6),我們只需要找到遞迴出口,也就是最基本的情況就行了。
很明顯:我們有

f(n,k)=(1p)
f(n1,k)+pf(n1,k1)ifn>k,k>0
1.0ifk=n=0(7)0.0ifk>nn<0k<0

遞迴演算法程式碼:

    /**
     * 時間複雜度: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而言: 伯