转载

【数据分析/挖掘底层算法】原创实现几何分布算法以及应用

7.1 几何分布算法

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

摘要:本文继统计学几何分布、二项分布、泊松分布研究的深入,基于各种分布基础概念和核心知识介绍之后。就各种分布的实现和真实环境下应用方是目的。本文就算法文档规范和代码注释进行梳理,利用其基本核心算法,实现我们要达到的目的。大家通用的一些统计学或者数据挖掘的软件,底层代码也就是这些基础公式和算法,随后陆续发布其他分布的算法。 本算法中在 n 次伯努利试验中:试验 r 次得到第一次成功的概率、试验 r 次以上才第一次成功的概率、试验 r 次或者不到 r 次才第一次成功、几何分布的期望、几何分布方差的具体实现。

7.1.1 算法的基本描述,包括:定义、符号解释、具体的计算方法。

7.1.1.1 算法描述

在进行一系列相互独立实验,每次既有成功,又有失败的可能,且单次实验成功概率相等。为了取得第一次成功需要进行多少次实验。这种情况下适用于本算法。

本算法中在n次伯努利试验中:试验r次得到第一次成功的概率、试验r次以上才第一次成功的概率、试验r次或者不到r次才第一次成功、几何分布的期望、几何分布方差的具体实现。

7.1.1.2 定义

如果p代表成功概率,则1-p即q代表失败概率使用以下 公式叫做概率的几何分布。

7.1.1.3 符号解释

r:表示独立试验第r次才第一次成功(r-1次失败)

p:表示独立试验成功的概率

q:表示独立试验失败的概率

7.1.1.4 计算方法

假设成功概率为p,失败概率为q,n次伯努利试验中,试验次数为r的前提下满足:

1、第r次试验第一次成功:

2、需要试验r次以上才第一次成功:

3、试验r次或者不到r次才第一次成功:

4、期望:E(x)=np

5 方差: Var(x)=npq

7.1.2 算法的应用场景。具体地,以书中或研究中的实际场景为例,描述算法的使用方法,包括:在该场景下算法的定义、算法中包含的符号的具体含义解释,以及具体的计算方法。

7.1.2.1 该场景下算法描述

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

7.1.2.2 该场景下算法定义

案例定义:这位滑雪者单次独立成功概率为0.4,失败概率为0.6,如果知道r次试滑,即可求出相关解。

7.1.2.3 该场景下算法中符号解释

r:表示独立试验第r次才第一次成功(r-1次失败)

p:表示独立试验成功的概率

q:表示独立试验失败的概率

7.1.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

7.1.3算法的优点和缺点的描述,以及算法适用的场景及不适用的场景的描述,算法适用的数据类型描述。

7.1.3.1 本算法优点

优点:简化概率、数学期望、方差的计算

7.1.3.2 本算法缺点

缺点: 试验次数一定,求成功次数。或者成功与失败事件非独立。

7.1.3.3 本算法适应场景

进行一系列独立试验,每次试验成功或失败且每次成功概率相同。目的:取第一次成功需要进行多少次试验。

7.1.3.4 本算法不适应场景

在非独立试验情况,或者独立试验情况下获取成功次数不适应几何分布。

7.1.3.5 本算法适用的数据类型

本算法适用于double数据类型,默认保留两位小数,可以自行设定保留位数。

7.1.4 算法的输入数据、中间结果以及输出结果的图形化展示方法。

7.1.4.1 本算法输入数据

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

* @param r   int,实验次数

7.1.4.2 本算法中间结果

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

7.1.4.3 本算法输出结果

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

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

* @return EX        double,几何分布的期望

* @return VX        double,几何分布的方差

7.1.4.4 本算法图形化展示。

7.1.5 可能导致算法计算产生异常的状态描述,以及可行的解决方法。该部分内容一方面描述在具体的计算过程中可能导致计算结果错误或产生误差的情况,另一方面描述在程序中,什么情况下会导致何种类型的异常。

7.1.5.1 本算法可能异常或误差

异常1:输入数据不合法,如:要求输入double数据,输入字母。

异常2:输入数据特别大,超越计算能力

误差:保留小数位数造成不精确

7.1.5.2 本算法异常或误差处理

异常1:解决,输入不合法给予提示。

异常2:解决,进行异常捕获

误差:解决,进行小数点位数自定义保留封装,根据具体精度进行设置。

7.1.6 算法的代码参考。该点只需给出对应的类和方法的基本描述,即给出类名,并列出具体调用的方法。

7.1.6.1 类和方法基本描述

类源码:见源程序:Distributes. src. DistTools. GeoDist

本算法中在n次伯努利试验中:试验r次得到第一次成功的概率、试验r次以上才第一次成功的概率、试验r次或者不到r次才第一次成功、几何分布的期望、几何分布方差的具体实现。

7.1.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的自行设置

几何分布类代码实现以及相关详细注释

类的注释如下:

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
正文到此结束
Loading...