Change Dir

先知cd——热爱生活是一切艺术的开始

统计

留言簿(18)

积分与排名

“牛”们的博客

各个公司技术

我的链接

淘宝技术

阅读排行榜

评论排行榜

Commons Math学习笔记——分布

 

看其他篇章到目录选择。

概率分布是概率论的一个基础。

Commons Math包中也专门有一个子包对概率分布进行了封装实现。在distribution包中,定义了一个基本接口Distribution。该接口只有两个方法,一个是double cumulativeProbability(double x),一个是double cumulativeProbability(double x0, double x1)。前者对于服从某种分布的随机变量X,返回P(X<=x);后者则返回P(x0<=X<=x1)。正如其名所示,这样也就得到了概率。

具体distribution包中实现了基本所有的概率分布,分为连续型分布和离散型分布,连续型包括了像熟悉的指数分布、柯西分布等,离散型包括了泊松分布和二项分布等等。具体的类图结构见下图:



 

在连续型的ContinuousDistribution接口中,添加了一个double inverseCumulativeProbability(double p)的方法,这个方法返回P(X<x)=p中的x。也就是说通过已知概率,可以求得随机变量Xx范围。当然看api文档还应注意一句,在3.0的版本中会加入public double density(double x)这个求概率密度函数的方法,敬请期待吧。离散型的接口DiscreteDistribution中则添加了double probability(double x)方法,用来计算P(X=x)的概率。

具体的代码我们以离散型的泊松分布和连续型的正态分布来讲解。泊松分布的接口继承了IntegerDistribution接口,在此基础上加了getMean()方法和normalApproximateProbability()方法。正态分布NormalDistribution继承了ContinuousDistribution,又添加了getMean()方法和double density(double x)方法以及getStandardDeviation()方法。

 

 1/**
 2 * 
 3 */
 4package algorithm.math;
 5
 6import org.apache.commons.math.MathException;
 7import org.apache.commons.math.distribution.NormalDistribution;
 8import org.apache.commons.math.distribution.NormalDistributionImpl;
 9import org.apache.commons.math.distribution.PoissonDistribution;
10import org.apache.commons.math.distribution.PoissonDistributionImpl;
11
12/**
13 * @author Jia Yu
14 * @date   2010-11-28
15 */
16public class DistributionTest {
17
18    /**
19     * @param args
20     */
21    public static void main(String[] args) {
22        // TODO Auto-generated method stub
23        poisson();
24        System.out.println("------------------------------------------");
25        normal();
26        test();
27    }
28
29    /**
30     * test for example
31     * 《饮料装填量不足与超量的概率》
32     * 某饮料公司装瓶流程严谨,每罐饮料装填量符合平均600毫升,标准差3毫升的常态分配法则。随机选取一罐,容量超过605毫升的概率?容量小于590毫升的概率
33     * 容量超过605毫升的概率 = p ( X > 605)= p ( ((X-μ) /σ) > ( (605 – 600/ 3) )= p ( Z > 5/3= p( Z > 1.67= 0.0475
34     * 容量小于590毫升的概率 = p (X < 590= p ( ((X-μ) /σ) < ( (590 – 600/ 3) )= p ( Z < -10/3= p( Z < -3.33= 0.0004
35     */
36    private static void test() {
37        // TODO Auto-generated method stub
38        NormalDistribution normal = new NormalDistributionImpl(600,3);
39        try {
40            System.out.println("P(X<590) = "+normal.cumulativeProbability(590));
41            System.out.println("P(X>605) = "+(1-normal.cumulativeProbability(605)));
42        } catch (MathException e) {
43            // TODO Auto-generated catch block
44            e.printStackTrace();
45        }
46    }
47
48    private static void poisson() {
49        // TODO Auto-generated method stub
50        PoissonDistribution dist = new PoissonDistributionImpl(4.0);
51        try {
52            System.out.println("P(X<=2.0) = "+dist.cumulativeProbability(2.0));
53            System.out.println("mean value is "+dist.getMean());
54            System.out.println("P(X=1.0) = "+dist.probability(1.0));
55            System.out.println("P(X=x)=0.8 where x = "+dist.inverseCumulativeProbability(0.8));
56        } catch (MathException e) {
57            // TODO Auto-generated catch block
58            e.printStackTrace();
59        }
60    }
61
62    private static void normal() {
63        // TODO Auto-generated method stub
64        NormalDistribution normal = new NormalDistributionImpl(0,1);
65        try {
66            System.out.println("P(X<2.0) = "+normal.cumulativeProbability(2.0));
67            System.out.println("mean value is "+normal.getMean());
68            System.out.println("standard deviation is "+normal.getStandardDeviation());
69            System.out.println("P(X=1) = "+normal.density(1.0));
70            System.out.println("P(X<x)=0.8 where x = "+normal.inverseCumulativeProbability(0.8));
71        } catch (MathException e) {
72            // TODO Auto-generated catch block
73            e.printStackTrace();
74        }
75    }
76
77}
78

 

 

输出:
P(X<=2.0) = 0.23810330555354414
mean value is 4.0
P(X=1.0) = 0.07326255555493674
P(X=x)=0.8 where x = 5
------------------------------------------
P(X<2.0) = 0.9772498680518208
mean value is 0.0
standard deviation is 1.0
P(X=1) = 0.24197072451914337
P(X<x)=0.8 where x = 0.8416212335731417
P(X<590) = 4.290603331968401E-4
P(X>605) = 0.047790352272814696


泊松分布只需要给定参数
λ即可,而其期望就是λ。所以构造方法一般就是new PoissonDistributionImpl(double mean)这样的形式了。

正态分布需要知道均值和方差,因此要在构造函数时传入,另外程序中以一个维基百科上的示例来验证正态分布的正确性。

相关资料:

概率分布:http://zh.wikipedia.org/zh-cn/%E6%A6%82%E7%8E%87%E5%88%86%E5%B8%83

泊松分布:http://zh.wikipedia.org/zh-cn/%E6%B3%8A%E6%9D%BE%E5%88%86%E5%B8%83

正态分布:http://zh.wikipedia.org/zh-cn/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83

Commons math包:http://commons.apache.org/math/index.html

posted on 2010-12-23 20:03 changedi 阅读(5113) 评论(0)  编辑  收藏 所属分类: 数学


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问