解决今天的挑战要用的术语都高亮在下面
随机变量
一个随机变量X,是一个实值单值函数X:S → R。在X这个函数中,一个事件会以一个周期I发生,通过X函数产生一个属于R样本空间的值。I ∈R。你可以认为它是同一个样本空间中,一组可能出现的结果所对应的概率。例如,如果你扔两个四面的骰子,每个骰子的投出数字的和:
- X={2,3,4,5,6,7,8}
- P(X=2) = p({(1,1)}) = 1/16
假设两个四面骰子a,b各有有(1,2,3,4),如果要投两个得到2,必须是两个1,a投得1的概率是1/4,在此基础上b也是1的概率也是1/4,结果就是1/4 * 1/4 = 1/16
- P(X=3) = p({(1,2), (2,1)}) = 2/16
- P(X=4) = p({(1,3),(2,2),(3,1)}) = 3/16
- P(X=5) = p({(1,4),(2,3),(3,2),(4,1)}) = 4/16
- P(X=6) = p({(2,4),(3,3),(2,4)}) = 3/16
- P(X=7) = p({(3,4),(4,3)}) = 2/16
- P(X=8) = p({(4,4)}) = 1/16
投两个骰子,每个骰子的值是相互独立的。
二项分布实验
一个二项分布实验(又称伯努利实验),是一种有以下性质的统计实验:
- 实验有n次重复的测试
- 每次测试都是独立的
- 每次实验的结果都是要么成功(s)要么失败(f)
伯努利随机变量和分布
二项分布实验的样本空间就两个值,s和f。我们把伯努利随机变量定义成
随机变量X(s)=1和X(f)=0 。如果我们认为成功的概率是p且失败的概率是q(那么q=1 - p),则随机变量X的概率密度函数(probability mass function PMF)就是:
如果x=0,函数p(x)的结果就是失败的概率
如果x=1,函数p(x)的结果就是成功的概率
我们也可以写成这样
f(x) = px×(1 - p)1-x 其中x∈{0,1}
当x=0
f(0) = p0×(1 - p)1-0
=1×(1 - p)1 = 1 - p = q (失败的概率)
当x=1
f(1) = p1×(1 - p)1-1
=p×(1 - p)0 = p (成功的概率)
二项式分布
一个满足以下条件的二项式分布实验我们就认为是一个二项式过程
- 成功的次数是x
- 总共次数是n
- 一次成功的概率是p
- 一次失败的概率是q,那么q = 1 - p
- b(x, n, p)是二项式概率, 意味着n次实验中正好有x次成功
二项式随机变量就是n次实验中成功的次数x.
二项式分布就是二项式随机变量的概率分布, 由以下概率分布函数定义:
请注意: 这是组合
个人理解:
假设一个扔硬币的实验, 扔10次, 正面向上为成功(1), 一般扔硬币的概率都是0.5.
那扔10次中出现一次(不多不少)正面向上的概率是?
x = 1
n = 10
10!/(1! × (10 - 1)!) = 10! / 9! = 10
10 × p1 × q(10 - 1)
= 10 × 0.5 × (1 - 0.5)9 = 10 × 0.5 10 = 一个很小的概率
如果说要出现2次(不多不少)正面向上
x = 2
n = 10
10!/(2! × (10 - 2)!) = 10! / 8! = 90
90 × p2 × q(10 - 2)
= 90 × 0.52 × (1 - 0.5)8 = 90 × 0.5 10 = 一个很小的概率,但是比上一个大
要是5次正面向上呢?
x = 5
n = 10
10!/(5! × (10 - 5)!) = 6 × 7× 8× 9× 10 / 5! = 252
252 × p5 × q(10 - 5)
= 252 × 0.55 × (1 - 0.5)5 = 252 × 0.5 10 ≈ 0.24 概率要大得多
再往后推,又变小了
累积概率密度函数
当我们把概率密度函数应用在某些实数的随机变量上, X, 就成了 FX(x) = P(X ≤ x). 这是个不会减少(递增)函数, 因为它把X变量的值的概率累加起来,直到包括x. 我们称其为X的累加分布函数. 当一个累加分布函数表示一个累加范围的值, 我们可以用以下函数得到所有x ∈ [a, b] 的累加概率
P(a < X ≤ b) = FX(b) - FX(a)
注: 像计算某函数在区间[a,b]的积分.
例子
公平地扔10次硬币, 求以下概率:
- 五次正面
- 至少五次正面
- 至多五次正面
解:
对于这个实验,n = 10, p = 0.5且q = 0.5 所求的概率就是
- 正好五次正面是:
b(x = 5, n, p) = 0.24....
-
至少5次是:
-
至多5次是:
Java
public static long factorial(int n) {
return n != 0 ? LongStream.rangeClosed(1, n).reduce(1, (long a, long b)-> a * b) : 1;
}
public static double binomial(int n, int x, double p) {
return factorial(n) / (double)(factorial(x) * factorial(n - x)) * Math.pow(p, x) * Math.pow(1 - p, n - x);
}
@Test
public void examples() {
System.out.printf("exact 5 times out of 10 %f\n", binomial(10, 5, 0.5));
System.out.printf("at least 5 times out of 10 %f\n", IntStream.rangeClosed(5, 10).mapToDouble(i -> binomial(10, i, 0.5)).sum());
System.out.printf("at most 5 times out of 10 %f\n", IntStream.rangeClosed(0, 5).mapToDouble(i -> binomial(10, i, 0.5)).sum());
}
Scala
def factorial(n:Int):Long = if (n == 0) 1 else (1 to n).foldRight(1)(_ * _)
def binomial(n:Int, x:Int, p:Double, q:Double): Double = factorial(n).toDouble / (factorial(x) * factorial(n - x)) * Math.pow(p, x) * Math.pow(q, n - x)
Python
from math import factorial
def binomial(n, x, p, q):
return factorial(n) / (factorial(x) * factorial(n - x)) * pow(p, x) * pow(q, n - x)
题目
俄罗斯的男女比例是1.09比1, 假设不生多胞胎, 求那些有6个孩子的家庭中, 有百分之几的家庭有起码3个男孩?
解: 当n = 6
p = 1.09 / (1 + 1.09)
q = 1 / (1 + 1.09)
求在x = 3, =4, =5, =6 这几种情况下的概率值
求和得到最后答案
套以上公式和函数,得到0.696