1. 程式人生 > >【程式設計師眼中的統計學(6.1)】原創實現幾何分佈演算法以及應用

【程式設計師眼中的統計學(6.1)】原創實現幾何分佈演算法以及應用

作者 白寧超
2015年8月14日16:07:23

摘要:本文繼統計學幾何分佈、二項分佈、泊松分佈研究的深入,基於各種分佈基礎概念和核心知識介紹之後。就各種分佈的實現和真實環境下應用方是目的。本文就演算法文件規範和程式碼註釋進行梳理,利用其基本核心演算法,實現我們要達到的目的。大家通用的一些統計學或者資料探勘的軟體,底層程式碼也就是這些基礎公式和演算法,隨後陸續釋出其他分佈的演算法。本演算法中在n次伯努利試驗中:試驗r次得到第一次成功的概率、試驗r次以上才第一次成功的概率、試驗r次或者不到r次才第一次成功、幾何分佈的期望、幾何分佈方差的具體實現。 (本文原創,轉載註明出處: 幾何分佈演算法 )

目錄

1 演算法的基本描述,包括:定義、符號解釋、具體的計算方法。

1.1 演算法描述

在進行一系列相互獨立實驗,每次既有成功,又有失敗的可能,且單次實驗成功概率相等。為了取得第一次成功需要進行多少次實驗。這種情況下適用於本演算法。

本演算法中在n次伯努利試驗中:試驗r次得到第一次成功的概率、試驗r次以上才第一次成功的概率、試驗r次或者不到r次才第一次成功、幾何分佈的期望、幾何分佈方差的具體實現。

1.2 定義

如果p代表成功概率,則1-p即q代表失敗概率使用以下 公式叫做概率的幾何分佈。

1.3 符號解釋

      r:表示獨立試驗第r次才第一次成功(r-1次失敗)
  p:表示獨立試驗成功的概率
  q:表示獨立試驗失敗的概率

1.4 計算方法

假設成功概率為p,失敗概率為q,n次伯努利試驗中,試驗次數為r的前提下滿足:

1、第r次試驗第一次成功:  

2、需要試驗r次以上才第一次成功:  

3、試驗r次或者不到r次才第一次成功:  

4、期望:E(x)=np

5方差: Var(x)=npq

2 演算法的應用場景。

具體地,以書中或研究中的實際場景為例,描述演算法的使用方法,包括:在該場景下演算法的定義、演算法中包含的符號的具體含義解釋,以及具體的計算方法。

2.1 該場景下演算法描述

案例描述:一位滑雪者不出意外順利滑至坡底的概率是0.4,假設每一次滑雪都是獨立事件。

2.2 該場景下演算法定義

案例定義:這位滑雪者單次獨立成功概率為0.4,失敗概率為0.6,如果知道r次試滑,即可求出相關解。

2.3 該場景下演算法中符號解釋

r:表示獨立試驗第r次才第一次成功(r-1次失敗)
  p:表示獨立試驗成功的概率
  q:表示獨立試驗失敗的概率

2.4 該場景下演算法計算方法

假設成功概率為p=0.4,失敗概率為q=1-p,n次伯努利試驗中,試驗次數為4的前提下滿足:

1、第2次試驗第一次成功:  

2、需要試驗4次以上才第一次成功:  

3、試驗4次或者不到4次才第一次成功:    

4、期望:E(x)=np

5方差: Var(x)=npq

3 演算法的優點和缺點的描述

以及演算法適用的場景及不適用的場景的描述,演算法適用的資料型別描述。

3.1 本演算法優點

優點:簡化概率、數學期望、方差的計算

3.2 本演算法缺點

缺點: 試驗次數一定,求成功次數。或者成功與失敗事件非獨立。

3.3 本演算法適應場景

進行一系列獨立試驗,每次試驗成功或失敗且每次成功概率相同。目的:取第一次成功需要進行多少次試驗。

3.4 本演算法不適應場景

在非獨立試驗情況,或者獨立試驗情況下獲取成功次數不適應幾何分佈。

3.5 本演算法適用的資料型別

本演算法適用於double資料型別,預設保留兩位小數,可以自行設定保留位數。

4 演算法的輸入資料、中間結果以及輸出結果的圖形化展示方法。

4.1 本演算法輸入資料

* @param    p   double,表示成功的概率

* @param    r   int,實驗次數

4.2 本演算法中間結果

* @param   q   double,表示失敗的概率即1-p

4.3 本演算法輸出結果

* @return PX        double,需要試驗r次以上才第一次成功

* @return MorePX    double,需要試驗r次以上才第一次成功

* @return EX        double,幾何分佈的期望

* @return VX        double,幾何分佈的方差

4.4 本演算法圖形化展示。

5 可能導致演算法計算產生異常的狀態描述,以及可行的解決方法。

該部分內容一方面描述在具體的計算過程中可能導致計算結果錯誤或產生誤差的情況,另一方面描述在程式中,什麼情況下會導致何種型別的異常。

5.1 本演算法可能異常或誤差

異常1:輸入資料不合法,如:要求輸入double資料,輸入字母。

異常2:輸入資料特別大,超越計算能力

誤差:保留小數位數造成不精確

5.2 本演算法異常或誤差處理

異常1:解決,輸入不合法給予提示。

異常2:解決,進行異常捕獲

誤差:解決,進行小數點位數自定義保留封裝,根據具體精度進行設定。

6 演算法的程式碼參考。

該點只需給出對應的類和方法的基本描述,即給出類名,並列出具體呼叫的方法。

6.1 類和方法基本描述

類原始碼:見源程式:Distributes. src. DistTools. GeoDist

本演算法中在n次伯努利試驗中:試驗r次得到第一次成功的概率、試驗r次以上才第一次成功的概率、試驗r次或者不到r次才第一次成功、幾何分佈的期望、幾何分佈方差的具體實現。

6.2 類和方法呼叫介面

見源程式:Distributes. src. DistTools. GeoDist

GeoDist.java 下包含如下方法:

FirstSuccess(double p,double q,int r)   //試驗r次得到第一次成功的概率

MoreSuccess(double q,int r)          //試驗r次以上才第一次成功的概率

LessSuccess(double q,int r)           //試驗r次或者不到r次才第一次成功

Expectation(double p)               //幾何分佈的期望

Variance(double p,double q)          //幾何分佈方差

呼叫封裝方法:

NumFormat.java  下如下方法:

DecFormat(int n,double num)         //對num數值保留位數n的自行設定

7 幾何分佈類程式碼實現以及相關詳細註釋

類的註釋如下:

package DistTools;
/**
 * 
 * @(#)GeoDist.java 
 * @Description:描述:本演算法中在n次伯努利試驗中:試驗r次得到第一次成功的概率、試驗r次以上才第一次成功的概率、試驗r次或者不到r次才第一次成功、幾何分佈的期望、幾何分佈方差的具體實現。
 * @Definitions:定義:如果p代表成功概率,則1-p即q代表失敗概率使用以下:P(X=r)=q^(r-1)p公式叫做概率的幾何分佈。                
 * @Explanation:符號解釋:r:表示獨立試驗第r次才第一次成功(r-1次失敗);p:表示獨立試驗成功的概率;q:表示獨立試驗失敗的概率
 * @Comments:條件:1.正在進行一系列獨立試驗;2.每次試驗都存在失敗和成功的可能,每一次試驗的成功概率相同;3.為了取得第一次成功需要進行多少次實驗。
 * @優點:簡化概率、數學期望、方差的計算
 * @缺點:試驗次數一定,求成功次數。或者成功與失敗事件非獨立。
 * @適用場景:進行一系列獨立試驗,每次試驗成功或失敗且每次成功概率相同。目的:取第一次成功需要進行多少次試驗。
 * @不適用場景:在非獨立試驗情況,或者獨立試驗情況下獲取成功次數不適應幾何分佈。
 * @輸入/出引數:見具體方法
 * @異常/誤差:
 *          異常1:輸入資料不合法,如:要求輸入double資料,輸入字母。
 *          異常2:輸入資料特別大,超越計算能力
 *          誤差:保留小數位數造成不精確
 *       解決:
 *          異常1:解決,輸入不合法給予提示。
 *          異常2:解決,進行異常捕獲
 *           誤差:解決,進行小數點位數自定義保留封裝,根據具體精度進行設定。
 * @Create Date:  2015年8月3日20:29:13
 * @since   JDK1.6  s
 * @author Bai ningchao
 */

方法一:第一次成功概率的方法註釋以及實現

	/**
	 * 在n次伯努利試驗中,試驗r次才得到第一次成功的機率 P(X=r)=pq^{r-1}
	 * @param p double型保留一位小數,表示成功的概率
	 * @param r 整型,實驗次數
	 * @return PX double型保留兩位小數,第一次成功的機率
	 */

 程式碼

public static double FirstSuccess(double p,int r) throws Exception
    {
        double PX=0;   //PX是第一次成功的概率,初始化為0
        double q=1-p;  //q是失敗的概率,由於p,q互斥,則q=1-p
        try
        {
            double k=(double)(r-1);
            PX= p*(Math.pow(q, k));//根據 P(X=r)=pq^{r-1}公式計算概率,其中k我double型別引數
            PX=NumFormat.DecFormat(3,PX);  
            System.out.println(">> 第2次試驗第一次成功的概率:" + PX); 
            return PX;
        }
        catch(Exception e)
        {
            System.out.println(">> 錯誤資訊描述:"+e.getMessage());
         }
        return PX;
    }
View Code

方法二:需要試驗r次以上才第一次成功的方法註釋以及實現

	/**
	 * 在n次伯努利試驗中,需要試驗r次以上才第一次成功: P(X>r)=q^r
	 * @param q double型保留一位小數,表示失敗的概率即1-p
	 * @param r 整型,實驗次數
	 * @return PX double型保留兩位小數,需要試驗r次以上才第一次成功
	 */

 程式碼

    public static double MoreSuccess(double p,int r) throws Exception
    {
        double PX=0;
        double q=1-p;//q是失敗的概率,由於p,q互斥,則q=1-p
        try
        {
            PX= Math.pow(q, r);//根據公式 P(X>r)=q^r進行計算
            PX=NumFormat.DecFormat(4,PX);  
            System.out.println(">> 需要試驗4次以上才第一次成功的概率:" + PX); 
        }
        catch(Exception e)
        {
            System.out.println(">> 錯誤資訊描述:"+e.getMessage());
         }
        return PX;
    }
View Code

方法三:需要試驗r次以上才第一次成功的概率方法註釋以及實現

	/**
	 * 在n次伯努利試驗中,試驗r次或者不到r次才第一次成功:P(X<=r)=1-q^r
	 * @param q double型保留一位小數,表示失敗的概率即1-p
	 * @param r 整型,實驗次數
	 * @return MorePX double型保留兩位小數,需要試驗r次以上才第一次成功
	 */

 程式碼:

    public static double LessSuccess(double p,int r) throws Exception
    {
        double MorePX=0;
        double q=1-p;   //q是失敗的概率,由於p,q互斥,則q=1-p
        try
        {
            MorePX= Math.pow(q, r);
            double PX=Double.valueOf(1.0-MorePX);//根據P(X<=r)=1-q^r公式進行計算
            PX=NumFormat.DecFormat(4,PX);  
            System.out.println(">> 試驗4次或者不到4次才第一次成功的概率:" + PX); 
        }
        catch(Exception e)
        {
            System.out.println(">> 錯誤資訊描述:"+e.getMessage());
         }
        return MorePX;
    }
View Code

方法四:幾何分佈的期望方法註釋以及實現

	/**
	 * 在n次伯努利試驗中,幾何分佈的期望E(X)=1/p 
	 * @param p double型保留一位小數,表示成功的概率
	 * @return EX double型保留兩位小數,幾何分佈的期望
	 */

 程式碼:

    public static double Expectation(double p) throws Exception
    {
        double EX=0;
        try
        {
            EX= 1.0/p;//根據E(X)=1/p 期望公式求期望,其中EX是期望返回值
            EX=NumFormat.DecFormat(4,EX);  
            System.out.println(">> 幾何分佈的期望是:" + EX); 
        }
        catch(Exception e)
        {
            System.out.println(">> 錯誤資訊描述:"+e.getMessage());
         }
        return EX;
    }
View Code

方法五:幾何分佈的方差的方法註釋以及實現

	/**
	 * 在n次伯努利試驗中,幾何分佈的方差Var(X)=q/p^2
	 * @param p double型保留一位小數,表示成功的概率
	 * @return VX double型保留兩位小數,幾何分佈的方差
	 */

 程式碼

    public static double Variance(double p) throws Exception
    {
        double VX=0;
        double q=1-p;  //表示失敗的概率即1-p
        try
        {
            VX= q/Math.pow(p, 2);  //根據Var(X)=q/p^2方差公式求期望,其中VX是方差返回值
            VX=NumFormat.DecFormat(4,VX);  
            System.out.println(">> 幾何分佈的方差是:" + VX); 
            
        }
        catch(Exception e)
        {
            System.out.println(">> 錯誤資訊描述:"+e.getMessage());
         }
        return VX;
    }
View Code

主函式:

    public static void main(String[] args) throws Exception {
        
          //PX是返回第2次試驗第一次成功的概率       0.24      
          GeoDist.FirstSuccess(0.4,2);   //實參1:獨立事件成功的概率p,引數2:實驗的次數r

         //PX是返回在n次伯努利試驗中,需要試驗4次以上才第一次成功的成功   0.1296
          GeoDist.MoreSuccess(0.4, 4);  //實參1:獨立事件失敗的概率q,引數2:實驗的次數r
          
         //PX是返回在n次伯努利試驗中,試驗4次或者不到4次才第一次成功的概率  0.8704
          GeoDist.LessSuccess(0.4, 4);   //實參1:獨立事件失敗的概率q,引數2:實驗的次數r

          //EX是幾何分佈的期望 2.5
          GeoDist.Expectation(0.4);  //實參1:獨立事件成功的概率p
         
          //VX是幾何分佈的方差  3.75
          GeoDist.Variance(0.4);   //實參1:獨立事件成功的概率p
    }
View Code

相關推薦

程式設計師眼中統計學6.1原創實現幾何分佈演算法以及應用

作者 白寧超 2015年8月14日16:07:23 摘要:本文繼統計學幾何分佈、二項分佈、泊松分佈研究的深入,基於各種分佈基礎概念和核心知識介紹之後。就各種分佈的實現和真實環境下應用方是目的。本文就演算法文件規範和程式碼註釋進行梳理,利用其基本核心演算法,實現我們要達到的目的。大家通用的一些統計

程式設計師眼中統計學6.2原創實現二項分佈演算法以及應用

package DistTools; /** * * @(#)GeoDist.java * @Description:描述:本演算法中在n次伯努利試驗中:試驗n次得到r次成功的概率、二項分佈的期望、二項分佈方差的具體實現。 * @Definitions:定義:在相互獨立事件中

程式設計師眼中統計學6幾何分佈、二項分佈及泊松分佈:堅持離散

/** * 在n次伯努利試驗中,試驗r次才得到第一次成功的機率 P(X=r)=pq^{r-1} * @param p double型保留一位小數,表示成功的概率 * @param q double型保留一位小數,表示失敗的概率即1-p * @param r 整型,實驗次數 *

程式設計師眼中統計學1資訊圖形化:第一印象

package pictuer; import java.awt.Dimension; import java.awt.Font; import java.io.PrintStream; import java.text.DecimalFormat; import java.text.Simpl

程式設計師眼中統計學7正態分佈的運用:正態之美

作者 白寧超 2015年10月15日18:30:07 摘要:程式設計師眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨著科學技術的發展和機器智慧的普及,統計學在機器智慧中的作用越來

程式設計師眼中統計學8統計抽樣的運用:抽取樣本

作者 白寧超 2015年10月15日18:30:07 摘要:程式設計師眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨著科學技術的發展和機器智慧的普及,統計學在機器智慧中的作用越來

程式設計師眼中統計學12相關與迴歸:我的線條如何?

作者 白寧超 2015年10月25日22:16:07 摘要:程式設計師眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨著科學技術的發展和機器智慧的普及,統計學在機器智慧中的作用越來

程式設計師眼中統計學2集中趨勢度量:分散性、變異性、強大的距

// 用於統計輸入了多少資料 static int n = 0; static String a1[]; static int b1[]; /** * @Title: set * @Description: 資料賦值 *

程式設計師眼中統計學5排列組合:排序、排位、排

/** * 獲取無重線排列總數目 * 描述:從n個元數中選取m個元數進行全排列,得出一共有多少種排法 * 公式:A(m,n)=m!/(n-m)! * 優缺點:輸入資料必須互不相同。求階乘時,使用了for迴圈,避免了遞迴方法導致記憶體溢位的風險。

程式設計師眼中統計學11卡方分佈應用

作者 白寧超 2015年8月9日22:33:00 摘要:程式設計師眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨著科學技術的發展和機器智慧的普及,統計學在機器智慧中的作用越

程式設計師眼中統計學9總體和樣本的估計:進行預測

作者 白寧超 2015年10月15日18:30:07 摘要:程式設計師眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨著科學技術的發展和機器智慧的普及,統計學在機器智慧中的作用越來

程式設計師眼中統計學4離散概率分佈的運用:善用期望

/** * @ClassName ScoreUtil * @Description 分數處理工具類 * @author candymoon * @Date 2014-4-25 */ public class ScoreUtil { /** * 使用jav

Tiny6410 And Linux6.1—LCD 驅動測試程式——程式碼

又過了好幾天了,呵呵,應該說玩了好幾天! 貌似要找工作了,有點發愁啊,不過現在還是堅持寫寫東西吧,暫時不想去想那麼多(如果突然有那麼份工作擺在面前,那該多好啊!)。 由於這裡沒有涉及到寫驅動,所以也就沒有這部分,不過把測試程式弄完,然後就寫一篇驅動程式出來應該問題也就不

一個程式設計師的自白延遲滿足

你有沒有覺得你在時間觀上有那麼一點模糊?被這麼一問,他瞬間陷入了沉思。“時間觀”三字不少掛嘴邊,但認真想想,好像還真是那麼一回事。時間在他心目中還真可能只是一秒、一分、一小時、一天、一週、一月以及一年的概念。 一秒等於多少? 一秒可以等於一千毫秒,也可以等於一百萬微妙.,

重構-改善既有的程式碼設計-重新組織函式6-1

6.1.提煉函式(Extract Mothod) 動機:長度不是問題,關鍵在於函式名稱和函式本體之間的語義距離。如果提煉可以強化程式碼的清晰度,那就去做,就算函式名稱比提煉出來的程式碼還長也無所謂。但如果你想不出一個更有意義的名字,就別動。 6.2.行內函數(Inline M

一個資深程式設計師看12306終結篇

“喂?老兄,今晚我請吃飯,你有時間沒”? “有,當然有了。” “很好,你今晚幫我值班吧!” 上面的臺詞估計很多人都看了都會一笑。為什麼會有笑料?因為脫離了人的慣性思維。日常生活中,大家可能只會當笑話,或者會引用這些笑話,會擴散思維,想到很多更為搞笑的笑話。但技術不能這樣,技

程式設計師的奮鬥史十八——人活著,只是一種態度

人活著,只是一種態度。          同一個世界,你的態度怎麼樣,它就是怎麼樣。同一件事情,你是怎麼認為的,它就是怎麼樣的。          只要心情好,一切都不會太壞。你對生活什麼態度,

詞向量原始碼解析:6.1fasttext原始碼解析

fasttext是word2vec的作者mikolov參與的製作的一個工具包,可以用來訓練詞向量和進行文字分類。目前已經引起了廣泛的關注。這個工具包在github上面的地址是 https://github.com/facebookresearch/fastText 這個專案

通過python呼叫adb命令對app進行效能測試6 -1

上篇文章中講述了adb是什麼,以及常用的命令,下面我們來看下通過adb來檢視手機裝置中的效能引數,首先要檢視apk的包名和預設Activity的名字有好幾種方式,下面介紹2種 第一種 1 開啟cmd 切換目錄D:\tool\android-sdk_r24.

神級以下必讀! ~程式設計師學習資料圖書&原始碼 01

 感謝博主的辛苦整理和分享!!! 前言:     由於上傳檔案大小限制所以大部分都是通過壓縮成幾部分,除了《JavaSwing圖形介面開發與案例詳解》與《Java Web開發實戰1200例》這兩本書的程式碼需要一個積分,其它全是不需要積分的,請大家積極評價,我很期