五、数据科学导论------数学基础之概率
第1关:概率基础之贝叶斯
任务描述
本关任务:根据相关知识,完成与数据概率相关的选择题。
相关知识
我们可以把概率论视为从事件空间中抽取的事件的不确定性进行量化的一种方式。空间是指所有可能的结果的集合,这些结果的任何一部分就是一个事件。比如,"骰子掷出的点数为1","骰子掷出的点数是偶数"等都是事件。
不独立和独立
如果 E 发生意味着 F 发生或者 F 发生意味着 E 发生,我们就称事件 E 与事件 F 为不相互独立(dependent)。反之,E 与 F 就相互独立。
举个例子,如果两次掷起一枚均匀的硬币,那么我们无法根据第一次掷硬币的结果是否是正面朝上来判断第二次的结果是否正面朝上。第一次掷硬币的结果和第二次掷硬币的结果,这两个事件就是独立的。
相反,如果第一次掷硬币的结果是正面朝上,那么我们能很明显能判断出两次掷硬币是否都是反面朝上。(如果第一次掷硬币的结果是正面朝上,那么很明显两次掷硬币的结果不可能都是反面朝上。)因此,第一次结果正面朝上和两次结果不可能都是反面朝上,这两个事件就是不独立的。
从数学角度讲,事件 E 和事件 F 独立意味着两个事件同时发生的概率等于它们分别发生的概率的乘积:
P(E,F)=P(E)P(F)
在上例中,"第一次掷硬币正面朝上"的概率为 1/2,"两次掷硬币都是背面朝上"的概率为 1/4,但"第一次掷硬币正面朝上并且两次掷硬币都是背面朝上"的概率为 0。
条件概率
如果事件 E 与事件 F 独立,那么定义式如下:
P(E,F)=P(E)P(F)
如果两者不一定独立并且 F 的概率不为零,那么 E 关于 F 的条件概率式如下:
P(E,F)=P(E∣F)P(F)
如果 E 和 F 独立,则上式应该表示为:
P(E∣F)=P(E)
上式表示,F 是否发生并不会影响 E 是否发生的概率。
如果我们假设:
每个孩子是男孩和是女孩的概率相同
第二个孩子的性别概率与第一个孩子的性别概率独立
那么,事件"没有女孩"的概率是 1/4,事件"一个男孩,一个女孩"的概率为 1/2,事件"两个女孩"的概率为 1/4。现在,我们的问题是,事件 B"两个孩子都是女孩"关于事件 G"大孩子是女孩"的条件概率是多少?用条件概率的定义式进行计算如下:
P(B∣G)=P(B,G)/P(G)=P(B)/P(G)=1/2
事件B与G的交集("两个孩子都是女孩并且大孩子是女孩")刚好是事件 B 本身。(一旦你知道两个孩子都是女孩,那大孩子必然是女孩。)
贝叶斯定理
贝叶斯定理是条件概率的某种逆运算
假设我们需要计算事件 E 基于已发生的事件 F 的条件概率,但我们已知的条件仅仅是事件 F 基于已发生的事件 E的条件概率。两次利用条件概率的定义,可以得到下式:
P(E∣F)=P(E,F)/P(F)=P(E∣F)P(E)/P(F)
事件 F 可以分割为两个互不重合的事件"F 和 E 同时发生"与"F 发生 E 不发生"。我们用符号 !E 指代"非 E"(即"E 没有发生"),有下式:
P(F)=P(F,E)+P(F,!E)
因此:
P(E∣F)=P(F∣E)P(E)/[P(F∣E)P(E)+P(F∣!E)P(!E)
假设有这样一种病,10000 个人中会有一个得这个病。还假设有种针对该病的测试,具有 99% 的可能性能给出正确判断(如果患病,测试显示"有病",如果健康,则显示"无病")。
阳性的测试结果意味着什么呢?我们用T表示"测试结果阳性",用 D 表示"你患有该病"。那么,根据贝叶斯定理,如果测试结果为阳性,那么你患有该病的概率是:
P(D∣T)=P(T∣D)P(D)/[P(T∣D)P(D)+P(T∣!D)P(!D)
我们知道,P(T|D),即一个人测试结果为阳性并且本人实际患病的概率为 0.99。P(D),即一个人实际患病的概率是 1/10000=0.0001。P(T |J D),即一个不患病的人检测结果呈阳性的概率是 0.01。P(J D),即一个人实际上不患该病的概率为 0.9999。如果将以上数据代入贝叶斯定理,可得:
P(D∣T)=0.98
结果表示,测试结果为阳性的人实际患病的概率不到 1%。
编程要求
根据相关知识,按照要求完成右侧选择题任务。
测试说明
平台会对你选择的答案进行判断,全对则通过测试。
开始你的任务吧,祝你成功!

第2关:概率基础之数据分布
任务描述
本关任务:根据下列的相关知识,完成与数据概率相关的选择题。
相关知识
模型的基线取决于数据的好坏,数据的好坏取决与你对数据的理解。所以为了更加懂数据,就先理解一下数据有哪些分布。
随机变量
随机变量指这样一种变量,其可能的取值有一种联合概率分布。定义一个简单的随机变量:掷起一枚硬币,如果正面朝上,随机变量等于1,如果背面朝上,随机变量等于0。
可以再定义更复杂些的随机变量,如掷起一枚硬币 10 次,查看正面朝上的次数,或者从range(10) 取出的一个值,每个数值被取到的可能性都相等。
联合分布对变量实现每种可能值都赋予了概率。通过掷硬币得到的随机变量等于 0 的概率为 0.5,等于 1 的概率也为 0.5。
从 range(10) 中生成随机变量的分布为从 0 到 9 之间的每个数值赋予 0.1 的概率。
随机变量也可以基于某些条件事件产生,就像其他事件一样。
比如上关中提到的双生子例子:如果X 是表示女孩个数的随机变量,那么 X 等于 0 的概率为 1/4 ,等于1 的概率为 1/2 ,等于 2 的概率为 1/4。
在已知至少一个孩子是女孩后,接着再定义一个新的随机变量 Y,表示基于这个条件的女孩的个数。Y 等于 1 的概率为 2/3,等于 2 的概率为 1/3 。
还定义另一个新的随机变量 Z,表示基于大孩子是女孩的条件之上的女孩的个数,Z 等于 1 的概率为1/2 ,等于 2 的概率为 1/2。
大部分情况下,我们会隐式使用随机变量的概念,即在使用时,并没有对此加以特别关注。
连续分布
掷硬币对应的是离散分布对离散的结果赋予正概率。我们常常希望对连续结果的分布进行建模。例如,均匀分布函数对 0 到 1 之间的所有值都赋予相同的权重。
因为 0 和 1 之间有无数个数字,因而对每个点而言,赋予的权重几乎是零。因此,我们用带概率密度函数的连续分布来表示概率,一个变量位于某个区间的概率等于概率密度函数在这个区间上的积分。
均匀分布的密度函数如下:
def uniform_pdf(x):
return 1 if x >= 0 and x < 1 else 0
一个服从均匀分布的随机变量落在 0.2 和 0.3 之间的概率为 1/10 。在 Python 中,random.random() 是按均匀分布生成的伪随机数的函数。
累积分布函数如下:
def uniform_cdf(x):
if x < 0: return 0 # 均匀分布的随机变量不会小于0
elif x < 1: return x # e.g. P(X <= 0.4) = 0.4
else: return 1 # 均匀分布的随机变量总是小于1
这个函数给出了一个随机变量小于等于某一特定值的概率。
正态分布
正态分布是典型的钟型曲线形态分布函数,可以完全由两个参数决定:均值 μ(mu)和标准差 σ (sigma)。
均值描述钟型曲线的中心,标准差描述曲线有多"宽"。正态分布的分布函数如下:

实现代码:
def normal_pdf(x, mu=0, sigma=1):
sqrt_two_pi = math.sqrt(2 * math.pi)
return (math.exp(-(x-mu) ** 2 / 2 / sigma ** 2) / (sqrt_two_pi * sigma))
让我们来绘制一些概率密度函数,来看看它们的形状如何:
xs = x / 10.0 for x in range(-50, 50)
plt.plot(xs,normal_pdf(x,sigma=1) for x in xs,'-',label='mu=0,sigma=1')
plt.plot(xs,normal_pdf(x,sigma=2) for x in xs,'--',label='mu=0,sigma=2')
plt.plot(xs,normal_pdf(x,sigma=0.5) for x in xs,':',label='mu=0,sigma=0.5')
plt.plot(xs,normal_pdf(x,mu=-1) for x in xs,'-.',label='mu=-1,sigma=1')
plt.legend()
plt.title("多个正态分布的概率密度函数")
plt.show()

如果 μ=0 并且σ =1,这个分布称为标准正态分布。如果 Z 是服从标准正态分布的随机变量,则有如下转换式:
X=σZ+μ
其中 X 也是正态分布,但均值是 μ,标准差是 σ 。相反,如果 X 是均值为 μ 标准差为σ的正态分布,那么:
Z=(X−μ)/σ
是标准正态分布的随机变量。
标准正态分布的累积分布函数无法用"基本"的解析形式表示,但在 Python 中可以用函数 math.erf 描述:
def normal_cdf(x, mu=0,sigma=1):
return (1 + math.erf((x - mu) / math.sqrt(2) / sigma)) / 2
再绘出一系列概率累积分布函数:
xs = x / 10.0 for x in range(-50, 50)
plt.plot(xs,normal_cdf(x,sigma=1) for x in xs,'-',label='mu=0,sigma=1')
plt.plot(xs,normal_cdf(x,sigma=2) for x in xs,'--',label='mu=0,sigma=2')
plt.plot(xs,normal_cdf(x,sigma=0.5) for x in xs,':',label='mu=0,sigma=0.5')
plt.plot(xs,normal_cdf(x,mu=-1) for x in xs,'-.',label='mu=-1,sigma=1')
plt.legend(loc=4) # 底部右边
plt.title("多个正态分布的累积分布函数")
plt.show()

中心极限定理
正态分布的运用如此广泛,很大程度上归功于中心极限定理。这个定理说,一个定义为大量独立同分布的随机变量的均值的随机变量本身就是接近于正态分布的。
特别地,如果 x1 ,...,xn 都是均值为 μ、标准差为 σ 的随机变量,且 n 很大,那么:

近似正态分布,且均值为 μ。等价于:

上式近似正态分布,均值为 0 ,标准差为 1。
举一个例子,带有n和p两个参数的二项式随机变量。
一个二项式随机变量Binonimal(n,p) 是 n 个独立伯努利随机变量 Bernoulli(p) 之和,每个伯努利随机变量等于 1 的概率是 p,等于 0 的概率是 1-p:
def bernoulli_trial(p):
return 1 if random.random() < p else 0
def binomial(n, p):
return sum(bernoulli_trial(p) for _ in range(n))
每个伯努利随机变量 Bernoulli(p) 的均值为 p,标准差为:

根据中心极限定理,当 n 变得很大,一个二项式随机变量 Binonimal(n,p)近似于一个正态分布的随机变量,其中均值为 μ=np,标准差为:

如果把两个分布都在图上绘出来,很容易看出相似性:
def make_hist(p, n, num_points):
data = binomial(n, p) for _ in range(num_points)
用条形图绘出实际的二项式样本
histogram = Counter(data)
plt.bar(x - 0.4 for x in histogram.keys(),
v / num_points for v in histogram.values(),
0.8,
color='0.75')
mu = p * n
sigma = math.sqrt(n * p * (1 - p))
用线形图绘出正态近似
xs = range(min(data), max(data) + 1)
ys = normal_cdf(i + 0.5, mu, sigma) - normal_cdf(i - 0.5, mu, sigma) for i in xs
plt.plot(xs,ys)
plt.title("二项分布与正态近似")
plt.show()
make_hist(0.75, 100, 10000)

近似表达的意义在于,如果你想知道掷起一枚均匀的硬币 100 次中正面朝上超过 60 次的概率,那么可以用一个正态分布 Normal(50, 5) 的随机变量大于 60 的概率来估计。这比计算二项式分布 Binonimal(100, 0.5) 的累积分布函数更容易。
编程要求
根据相关知识,按照要求完成右侧选择题任务。
测试说明
平台会对你选择的答案进行判断,全对则通过测试。
开始你的任务吧,祝你成功!

有任何问题都可以随时关注私信!