花书《深度学习》代码实现:02 概率部分:概率密度函数+期望+常见概率分布代码实现

简介: 随机变量 (Random Variable):⼀个可能随机取不同值的变量。例如:抛掷⼀枚硬币,出现正⾯或者反⾯的结果

1 概率


1.1 概率与随机变量


  • 频率学派概率 (Frequentist Probability):认为概率和事件发⽣的频率相关。


  • 贝叶斯学派概率 (Bayesian Probability):认为概率是对某件事发⽣的确定程度,可以理解成是确信的程度。


  • 随机变量 (Random Variable):⼀个可能随机取不同值的变量。例如:抛掷⼀枚硬币,出现正⾯或者反⾯的结果


2 概率分布


2.1 概率质量函数


2.1.1 定义


对于离散型变量,我们先定义⼀个随机变量,然后⽤~符号来说明它遵循的分布:x∼P(x),函数P是随机变量x的PMF。


2.1.2 举例


⼀个离散型x有k个不同的值,我们可以假设x是均匀分布的(也就是将它的每个值视为等可能的),通过将它的PMF设为


7aeb782bc7be46b3bf1681c8dce2dd9d.png


对于所有的i都成⽴。


2.2 概率密度函数


研究的对象是连续型时,可以引⼊同样的概念。


2.2.1 定义


如果⼀个函数 p 是概率密度函数:


caf9fb888e7241429064c01bacd10192.png


2.2.2 举例


在 (a; b) 上的均匀分布:



abfbe93d425b4ccc817e4dc7fcbb3681.png


分母表示在(a,b)内为1,否则为0。


2.3 累积分布函数(Cummulative Distribution Function)


累积分布函数表示对小于 x 的概率的积分:



3dd29fc73d0d419bb0d5b155024cadd7.png


2.4 代码实现:均匀分布


# 函数功能:返回范围内的均匀分布
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import uniform
# 生成样本
fig, ax = plt.subplots(1, 1)
r = uniform.rvs(loc=0, scale=1, size=1000)
ax.hist(r, density=True, histtype='stepfilled', alpha=0.5)
# numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
# (返回的是 [start, stop]之间的均匀分布)
# start:返回样本数据开始点
# stop:返回样本数据结束点
# num:生成的样本数据量,默认为50
# endpoint:True则包含stop;False则不包含stop
# retstep:即如果为True,则结果会给出数据间隔
# dtype:输出数组类型
# axis:0(默认)或-1
# 均匀分布 pdf
x = np.linspace(uniform.ppf(0.01), uniform.ppf(0.99), 100)
ax.plot(x, uniform.pdf(x), 'r-', lw=5, alpha=0.8, label='uniform pdf')
plt.show()


9bba2c0ab17c4fc4987b229902a953a8.png


2.5 条件概率与条件独立


2.5.1 边缘概率 (Marginal Probability)


如果已知⼀组变量的联合概率分布,但想了解其中⼦集的概率分布。这种定义在子集上的概率分布被称为边缘概率分布。


7e7ed1b9cc7b4e39840ea30126c30efa.png


2.5.2 条件概率(Conditional Probability)


在很多情况下,我们感兴趣的是某个事件,在给定其他事件发⽣时出现的概率。这种概率叫做条件概率。


5a4aa756990b4b38a03ee349412812df.png


2.5.3 条件概率的链式法则 (Chain Rule of Conditional Probability)


任何多维随机变量的联合概率分布,都可以分解成只有⼀个变量的条件概率相乘形式


b41f403cd9b149308618dbdb44998223.png


2.5.4 独立性 (Independence)


两个随机变量 x 和 y,如果它们的概率分布可以表⽰成两个因⼦的乘积形式,并且⼀个因⼦只包含 x 另⼀个因⼦只包含y,我们就称这两个随机变量是相互独⽴的。


c50a0e36861240b2b804923b7af4a668.png


2.5.5 条件独立性 (Conditional Independence)


如果关于 x 和 y 的条件概率分布对于 z 的每⼀个值都可以写成乘积的形式,那么这两个随机变量 x 和y 在给定随机变量 z 时是条件独⽴的。


53d853b615f146059cfb5c9aa9809357.png


2.6 随机变量的度量


2.6.1 期望


期望(Expectation):函数f关于概率分布P(x)或p(x)的期望表⽰为由概率分布产⽣x,再计算f作⽤到x上后f(x)的平均值。


期望是线性的:


1aefa56750104ed7ab57479a25d2f1ed.png


2.6.2 离散型随机变量的期望


通过求和得到:


6c45d0c4c8dc4da0a30202c60a83aba1.png


2.6.3 连续型随机变量的期望


连续型随机变量可以通过求积分:


91ad250d97f84a75bfac0fd0252e3cb3.png


2.6.4 方差(Variance)


衡量的是当我们对 x 依据它的概率分布进⾏采样时,随机变量 x 的函数值会呈现多⼤的差异,描述采样得到的函数值在期望上下的波动程度:


ddc1d56dcbd34032ab5e80889c744310.png


2.6.5 标准差 (Standard Deviation)


将⽅差开平⽅即为标准差。


2.6.6 协方差


⽤于衡量两组值之间的线性相关程度:


01e06a5ff8ac4cc2bf036072c6724f31.png


独⽴⽐零协⽅差要求更强,因为独立还排除了非线性的相关。


2.7 代码实现:协方差


import numpy as np
x = np.array([1,2,3,4,5,6,7,8,9])
y = np.array([9,8,7,6,5,4,3,2,1])
Mean = np.mean(x)
Var = np.var(x) # 默认总体方差
Var_unbias = np.var(x, ddof=1) # 样本方差(无偏方差)
Cov = np.cov(x,y)
print("平均值:",Mean) #  5.0
print("总体方差:",Var) # 6.666666666666667
print("样本方差(无偏方差):",Var_unbias) # 7.5
print("协方差:",Cov) # [[ 7.5 -7.5] [-7.5  7.5]]


3 常见概率分布


3.1 伯努利分布 (两点分布) (Bernoulli Distribution)


3.1.1 定义


04e2add3e34f470e84097caaeedd8c9f.png


3.1.2 代码实现:伯努利分布


import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import bernoulli
def plot_distribution(X, axes=None):
    """ 给定随机变量,绘制 PDF, PMF, CDF"""
    if axes is None:
        fig, axes = plt.subplots(1, 2, figsize=(10, 3))
    x_min, x_max = X.interval(0.99)
    x = np.linspace(x_min, x_max, 1000)
    if hasattr(X.dist, 'pdf'): # 判断有没有 pdf,即是不是连续分布
        axes[0].plot(x, X.pdf(x), label="PDF")
        axes[0].fill_between(x, X.pdf(x), alpha=0.5) # alpha 是透明度, alpha=0 表示 100% 透明, alpha=100 表示完全不透明
    else: # 离散分布
        x_int = np.unique(x.astype(int))
        axes[0].bar(x_int, X.pmf(x_int), label="PMF") # pmf 和 pdf 是类似的
        axes[1].plot(x, X.cdf(x), label="CDF")
    for ax in axes:
        ax.legend()
    return axes
fig, axes = plt.subplots(1, 2, figsize=(10, 3)) # 画布
p = 0.3
X = bernoulli(p) # 伯努利分布
plot_distribution(X, axes=axes)
plt.show()
possibility = 0.3
def trials(n_samples):
    samples = np.random.binomial(n_samples, possibility) # 成功的次数
    proba_zero = (n_samples-samples)/n_samples
    proba_one = samples/n_samples
    return [proba_zero, proba_one]
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
# 一次试验, 伯努利分布
n_samples = 1
axes[0].bar([0, 1], trials(n_samples), label="Bernoulli")
# n 次试验, 二项分布
n_samples = 1000
axes[1].bar([0, 1], trials(n_samples), label="Binomial")
for ax in axes:
    ax.legend()
plt.show()



352fa7fe527448c6ba12f6d0ba33f187.png



3.2 范畴分布 (分类分布) (Multinoulli Distribution)


3.2.1 定义


范畴分布是指在具有 k 个不同值的单个离散型随机变量上的分布


3.2.2 代码实现:范畴分布 (分类分布)


import numpy as np
import matplotlib.pyplot as plt
def k_possibilities(k):
    """
    随机产生一组 10 维概率向量
    """
    res = np.random.rand(k)
    _sum = sum(res)
    for i, x in enumerate(res):
        res[i] = x / _sum
    return res
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
# 一次试验, 范畴分布
k, n_samples = 10, 1
samples = np.random.multinomial(n_samples, k_possibilities(k)) # 各维度“成功”的次数
axes[0].bar(range(len(samples)), samples/n_samples, label="Multinoulli")
# n 次试验, 多项分布
n_samples = 1000
samples = np.random.multinomial(n_samples, k_possibilities(k))
axes[1].bar(range(len(samples)), samples/n_samples, label="Multinomial")
for ax in axes:
    ax.legend()
plt.show()

7750cc328b9348c580f03343941a31a0.png



3.3 高斯分布 (正态分布)


3.3.1 定义


3f1cc7186d494e9ebe7279df6cf0e7c7.png

7374a770a4b3477a9d54459295d6dbdc.png


中⼼极限定理 (Central Limit Theorem) 认为,⼤量的独⽴随机变量的和近似于⼀个正态分布,因此可以认为噪声是属于正态分布的。


3.3.2 代码实现:正态分布


import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
def plot_distribution(X, axes=None):
    """ 给定随机变量,绘制 PDF, PMF, CDF"""
    if axes is None:
        fig, axes = plt.subplots(1, 2, figsize=(10, 3))
    x_min, x_max = X.interval(0.99)
    x = np.linspace(x_min, x_max, 1000)
    if hasattr(X.dist, 'pdf'): # 判断有没有 pdf,即是不是连续分布
        axes[0].plot(x, X.pdf(x), label="PDF")
        axes[0].fill_between(x, X.pdf(x), alpha=0.5) # alpha 是透明度, alpha=0 表示 100% 透明, alpha=100 表示完全不透明
    else: # 离散分布
        x_int = np.unique(x.astype(int))
        axes[0].bar(x_int, X.pmf(x_int), label="PMF") # pmf 和 pdf 是类似的
        axes[1].plot(x, X.cdf(x), label="CDF")
    for ax in axes:
        ax.legend()
    return axes
fig, axes = plt.subplots(1, 2, figsize=(10, 3)) # 画布
mu, sigma = 0, 1
X = norm(mu, sigma) # 标准正态分布
plot_distribution(X, axes=axes)
plt.show()

22f05a6802964188aa7af5ec53963b0b.png


3.4 多元高斯分布 (多元正态分布)


3.4.1 定义


58a905d85aba463db6ad21b0b5dcf902.png


3.4.2 代码实现:


import numpy as np
from scipy.stats import multivariate_normal
import matplotlib.pyplot as plt
x, y = np.mgrid[-1:1:.01, -1:1:.01]
pos = np.dstack((x, y))
fig = plt.figure(figsize=(4,4))
axes = fig.add_subplot(111)
mu = [0.5, -0.2] # 均值
sigma = [[2.0, 0.3], [0.3, 0.5]] # 协方差矩阵
X = multivariate_normal(mu, sigma) # 多元高斯分布
axes.contourf(x, y, X.pdf(pos))
plt.show()


17690313af3b4556a89cc31eefa758c9.png



3.5 指数分布 (Exponential Distribution)


3.5.1 定义


ac72b8306e084a78ad8d7acd4737e426.png


是用于在x=0处获得最⾼的概率的分布,其中λ>0是分布的⼀个参数,常被称为率参数。


3.5.2 代码实现:指数分布


import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import expon
def plot_distribution(X, axes=None):
    """ 给定随机变量,绘制 PDF, PMF, CDF"""
    if axes is None:
        fig, axes = plt.subplots(1, 2, figsize=(10, 3))
    x_min, x_max = X.interval(0.99)
    x = np.linspace(x_min, x_max, 1000)
    if hasattr(X.dist, 'pdf'): # 判断有没有 pdf,即是不是连续分布
        axes[0].plot(x, X.pdf(x), label="PDF")
        axes[0].fill_between(x, X.pdf(x), alpha=0.5) # alpha 是透明度, alpha=0 表示 100% 透明, alpha=100 表示完全不透明
    else: # 离散分布
        x_int = np.unique(x.astype(int))
        axes[0].bar(x_int, X.pmf(x_int), label="PMF") # pmf 和 pdf 是类似的
        axes[1].plot(x, X.cdf(x), label="CDF")
    for ax in axes:
        ax.legend()
    plt.show()
    return axes
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
# 定义 scale = 1 / lambda
X = expon(scale=1)
# 指数分布
plot_distribution(X, axes=axes)

b6f9004117e74d329e411b12eef8cfa3.png


3.6 拉普拉斯分布(Laplace Distribution)


3.6.1 定义


9a1377f9031642bbaba61090c746a706.png


这也是可以在⼀个点获得⽐较⾼的概率的分布。


3.6.2 代码实现:拉普拉斯分布


import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import laplace
def plot_distribution(X, axes=None):
    """ 给定随机变量,绘制 PDF, PMF, CDF"""
    if axes is None:
        fig, axes = plt.subplots(1, 2, figsize=(10, 3))
    x_min, x_max = X.interval(0.99)
    x = np.linspace(x_min, x_max, 1000)
    if hasattr(X.dist, 'pdf'): # 判断有没有 pdf,即是不是连续分布
        axes[0].plot(x, X.pdf(x), label="PDF")
        axes[0].fill_between(x, X.pdf(x), alpha=0.5) # alpha 是透明度, alpha=0 表示 100% 透明, alpha=100 表示完全不透明
    else: # 离散分布
        x_int = np.unique(x.astype(int))
        axes[0].bar(x_int, X.pmf(x_int), label="PMF") # pmf 和 pdf 是类似的
        axes[1].plot(x, X.cdf(x), label="CDF")
    for ax in axes:
        ax.legend()
    plt.show()
    return axes
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
mu, gamma = 0, 1
X = laplace(loc=mu, scale=gamma)
plot_distribution(X, axes=axes)


7d1d717bfa484e38ba4804a3b8fb007d.png


3.5  Dirac 分布


39637bcb26124c78a4cbe4f7023f8530.png


4 常用函数的有用性质


4.1 logistic sigmoid 函数


5ba9d9ae847a4a0b8f14385a8b372495.png


logistic sigmoid函数通常⽤来产⽣伯努利分布中的参数ϕ,因为它的范围是(0;1),处在ϕ的有效取值范围内。


sigmoid函数在变量取绝对值⾮常⼤的正值或负值时会出现饱和现象,意味着函数会变得很平,并且对输⼊的微⼩改变会变得不敏感。


4.2 softplus 函数


38b460278622470fb86f40b8ea6fc1b7.png


softplus函数可以⽤来产⽣正态分布的β和σ参数,因为它的范围是(0,∞)。当处理包含sigmoid函数的表达式时它也经常出现。


softplus函数名来源于它是另外⼀个函数的平滑(或软化)形式,这个函数是:


072c769fbecc4c2ea09c7e8be18f7e5e.png


4.3 代码实现: logistic sigmoid函数 + softplus函数


import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 100)
sigmoid = 1/(1 + np.exp(-x))
softplus = np.log(1 + np.exp(x))
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
axes[0].plot(x, sigmoid, label='sigmoid')
axes[1].plot(x, softplus, label='softplus')
for ax in axes:
    ax.legend()
plt.show()


a7efe861a4d64a71a51ab588a264e8db.png


目录
相关文章
|
1月前
|
机器学习/深度学习
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
本文探讨了深度可分离卷积和空间可分离卷积,通过代码示例展示了它们在降低计算复杂性和提高效率方面的优势。
60 2
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的兼容性函数:原理、类型与未来趋势
深度学习中的兼容性函数:原理、类型与未来趋势
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
【10月更文挑战第1天】深度学习中,模型微调虽能提升性能,但常导致“灾难性遗忘”,即模型在新任务上训练后遗忘旧知识。本文介绍弹性权重巩固(EWC)方法,通过在损失函数中加入正则项来惩罚对重要参数的更改,从而缓解此问题。提供了一个基于PyTorch的实现示例,展示如何在训练过程中引入EWC损失,适用于终身学习和在线学习等场景。
79 4
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
|
1月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
66 2
|
1月前
|
机器学习/深度学习 编解码
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
本文介绍了九种常用的神经网络激活函数:Sigmoid、tanh、ReLU、ReLU6、Leaky ReLU、ELU、Swish、Mish和Softmax,包括它们的定义、图像、优缺点以及在深度学习中的应用和代码实现。
129 0
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
|
1月前
|
机器学习/深度学习 算法 算法框架/工具
深度学习在图像识别中的应用及代码示例
【9月更文挑战第32天】本文将深入探讨深度学习在图像识别领域的应用,包括其原理、技术、优势以及挑战。我们将通过一个简单的代码示例,展示如何使用深度学习技术进行图像识别。无论你是初学者还是有经验的开发者,都可以从中获得启发和帮助。让我们一起探索这个充满无限可能的领域吧!
72 8
|
2月前
|
机器学习/深度学习 算法框架/工具 Python
深度学习在图像识别中的应用及其代码实现
【9月更文挑战第24天】本文将探讨深度学习在图像识别领域的应用,并展示如何通过代码实现这一过程。我们将介绍深度学习的基本原理,以及它在图像识别中的优势和挑战。然后,我们将通过一个简单的代码示例,展示如何使用深度学习进行图像识别。最后,我们将讨论深度学习在未来图像识别中的潜力和可能的发展方向。
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】深度学习的概述及应用,附带代码示例
深度学习(Deep Learning,简称DL)是机器学习领域中的一个重要分支,其目标是通过模拟人脑神经网络的工作机制,构建多层次的抽象特征表示,使机器能够自动从原始数据中提取关键信息,从而实现高精度的任务执行。深度学习通过多层神经网络结构及其训练方式,实现了从低级像素级别到高级概念级别的递进式知识层次。 深度学习的主要组件包括输入层、隐藏层和输出层。隐藏层的数量和层数决定了模型的复杂度和表达能力。在训练过程中,权重更新和梯度下降法是关键步骤,目的是最小化损失函数,提高预测精度。深度学习主要基于反向传播算法(BP Algorithm)来优化模型参数,通过正向传播、损失计算、反向传播和梯度下降等
174 8
|
3月前
|
机器学习/深度学习 算法 算法框架/工具
深度学习在图像识别中的应用及代码实现
【8月更文挑战第3天】深度学习技术在图像识别领域取得了显著的成果,通过构建深度神经网络模型,实现了对复杂图像数据的高效处理和准确识别。本文将介绍深度学习在图像识别中的原理、关键技术及应用实例,并通过代码示例展示如何利用深度学习框架进行图像识别任务的实现。
|
3月前
|
机器学习/深度学习 算法
下一篇
无影云桌面