概率论本质上是一种简化为计算的常识。这就是拉普拉斯的“常识演算化”观点。
日常生活中经常听到这样的描述,投掷一枚(均匀的)硬币,落地时正面朝上的概率是50%。但这究竟意味着什么呢?实际上,对概率存在两种不同的解释。一种被称为频率学派(frequentist)解释。在频率学派的观点中,概率表示可能多次发生的事件的长期频率。例如,上面的说法意味着,如果多次投掷硬币,那么预计硬币落地时大约有一半机会正面朝上。另一种被称为概率的贝叶斯学派(Bayesian)解释。在贝叶斯学派的观点中,概率被用来量化我们对某事的不确定性(uncertainty)或未知性(ignorance)。因此,概率从根本上与信息有关,而与重复试验关系不大。在贝叶斯学派的观点中,上述说法意味着我们相信硬币在下一次投掷时正面向上落地或反面向上落地的概率相同。
在基于频率的解释中, 被认为是无限次重复试验时事件 发生的频率,例如,当我们说随机抛硬币出现正面的概率为 ,是指当重复抛硬币足够多次时,出现正面的频率趋近于 。这种解释在一些重复试验困难的问题中面临挑战,例如,假如我们要预测明天下雨的概率,频率的解释就无能为力了--显然,明天的天气是不可重复的。而基于信度的解释认为 是观察者认为事件 发生的可信程度。这两种解释实际上分别对应了频率学派和贝叶斯学派。
贝叶斯学派解释的一大优势在于,对于不存在长期频率的一次性事件,这种解释可以用来对其不确定性进行建模。例如,我们可能想预测某桥梁在地震作用下垮塌的概率。该事件将发生0次或1次,但不可能重复发生。
下面用python模拟抛硬币实验
import matplotlib.pyplot as plt
import numpy as np
def coin_flip(size):
flips = np.random.randint(0, 2, size=size)
return flips.mean()
vec_coin_flip = np.frompyfunc(coin_flip, 1, 1)
x = np.arange(10, 100001, 20) #x中每一个值都表示一次随机试验,比如10就代表抛掷硬币10次
y = vec_coin_flip(x) #x中一次随机试验,正面朝上的频率
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
fig, ax = plt.subplots()
ax.plot(x, y)
ax.axhline(y = 0.5, color = 'r', linestyle = '--', linewidth = 2)
ax.set_xscale('log')
ax.set( title = '抛硬币模拟图')
ax.set_xlabel('实验次数')
ax.set_ylabel('频率变化')
fig.savefig("z216.png",dpi = 300)
plt.show()
上述代码中,coin_flip函数接受一个参数size,表示抛掷硬币的次数。它使用np.random.randint(0, 2, size=size)生成size个0或1的随机整数,其中0表示反面,1表示正面。然后返回这些随机数的平均值,即正面朝上的频率。使用np.frompyfunc将coin_flip函数转换为一个NumPy的通用函数vec_coin_flip,使之向量化,具体见文末附录。np.arange(10, 10000, 50)生成一个从10到100000的整数数组,表示抛掷硬币的次数。 最后分别调用vec_coin_flip通用函数两次,计算不同抛掷次数下正面朝上的频率,得到y。
▲图1
一个常见的误解是,如果你抛一枚公平的硬币10或20次,正面的比例接近一半.记住这只有在大样本才能实现,如图1所示。
附录
python自定义函数并调用:
def func_x(a):
y = a + 1
return y
# 调用
print( func_x(1) )
#结果:2
但是如果a不是一个数,而是一个向量/数组呢?这时候就需要借助Numpy中的通用函数np.frompyfunc(func, 1, 1)这里的参数func指的是你要使用的函数,第二个参数为func中的参数个数,第三个参数为func中的返回值的个数。假设A=[0,1,2]
def func_x(a):
y = a + 1
return y
A = [0, 1, 2]
vec_func = np.frompyfunc(func_x, 1, 1)
y = vec_func(A)
print(y)
#结果: [1,2,3]