核心思想:人工智能面对的是一个充满不确定性的现实环境。
直观理解:概率用于衡量某一事件发生的可能性,数值介于0到1之间。
定义:P(A|B) 表示在事件 B 已经发生的前提下,事件 A 发生的概率。
垃圾邮件识别:
P(垃圾邮件 | 包含"免费") = 0.9
解释:若一封邮件中出现“免费”一词,则其为垃圾邮件的概率高达90%。需要注意的是,这并不意味着所有邮件中有90%是垃圾邮件,而是指在包含“免费”的邮件中,90%属于垃圾邮件。
P(A|B) = P(A和B同时发生) / P(B)
理解方式:在事件 B 发生的所有情况中,A 同时发生的占比即为条件概率 P(A|B)。
已知条件如下:
问题:如果一封邮件包含“免费”,它是垃圾邮件的概率是多少?
============================================================
垃圾邮件检测示例(贝叶斯定理)
============================================================
先验概率:
P(垃圾邮件) = 30.0%
P(正常邮件) = 70.0%
条件概率:
P(包含'免费'|垃圾邮件) = 90.0%
P(包含'免费'|正常邮件) = 10.0%
全概率:
P(包含'免费') = 0.9×0.3 + 0.1×0.7
= 0.340 = 34.0%
贝叶斯定理:
P(垃圾邮件|包含'免费') = P(包含'免费'|垃圾邮件) × P(垃圾邮件) / P(包含'免费')
= 0.9 × 0.3 / 0.340
= 0.794 = 79.4%
结论:
如果邮件包含'免费',是垃圾邮件的概率: 79.4%
这比先验概率30.0%显著提高,说明“免费”是一个强烈的垃圾邮件信号
贝叶斯定理是概率论中极为关键的工具,它提供了一种系统的方法,利用观测到的数据来更新我们对某一事件发生可能性的认知。这一过程体现了“从经验中学习”的核心思想。
先验概率(Prior):
指在未观察具体数据前,基于已有知识或假设对某事件发生的初始判断。
举例来说,若历史数据显示30%的邮件为垃圾邮件,则我们可以设定任意一封新邮件是垃圾邮件的先验概率为30%。
后验概率(Posterior):
是在获得新的证据或数据之后,对原信念进行修正所得到的更新概率。
例如,在收到一封包含“免费”字样的邮件后,结合关键词特征重新评估其为垃圾邮件的概率可能上升至79.4%。
贝叶斯定理的作用:
该定理使我们能够将先验知识与实际观测相结合,动态调整判断。比如,从原本认为“有30%可能是垃圾邮件”,经过分析文本内容后更新为“高达79.4%的可能性是垃圾邮件”。
贝叶斯定理的标准表达式如下:
P(A|B) = P(B|A) × P(A) / P(B)
其中各部分含义如下:
记忆技巧可参考下图所示的形象化模型:
后验 = (似然 × 先验) / 证据
更深入的理解:
该方法以18世纪英国数学家托马斯·贝叶斯命名,他首次提出了通过新证据不断修正信念的思想框架。
朴素贝叶斯分类器:
广泛应用于文本分类任务,如垃圾邮件识别。其“朴素”之处在于假设各个特征之间相互独立,虽然现实中未必完全成立,但在许多场景下仍表现出色且计算高效。
贝叶斯神经网络:
不同于传统神经网络输出单一预测值,贝叶斯神经网络输出的是一个概率分布,不仅能给出预测结果,还能量化不确定性。模型参数本身被视为随机变量,具有相应的分布形式。
参数估计:
在建模过程中,使用贝叶斯方法可以从数据中推断模型参数,同时融合专家先验知识,实现数据驱动与领域知识的有机结合。
贝叶斯思维的核心流程:
这正是机器学习中“从数据中学习”这一理念的数学体现。
什么是概率分布?
概率分布用于刻画一个随机变量可能取哪些值,以及每个值出现的可能性大小。它是统计推断和机器学习建模的重要基础。
正态分布简介:
又称高斯分布,是统计学中最重要、最常用的连续型概率分布之一,原因包括:
正态分布的主要特征:
为何在回归问题中常用正态分布假设?
以房价预测为例:
真实房价 = 模型预测值 + 随机误差
我们通常设误差 ε ~ N(0, σ),即均值为0、方差为σ的正态分布。这意味着:
为什么选择正态分布作为误差模型?
数学上的便利性:
现实中的合理性:
此外,最小二乘法之所以被广泛采用,正是因为当误差服从正态分布时,最小化平方损失等价于最大化似然函数——这是其坚实的理论依据。
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# 正态分布示例
mu, sigma = 0, 1 # 均值0,标准差1
x = np.linspace(-4, 4, 100)
y = stats.norm.pdf(x, mu, sigma)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label=f'Normal distribution N({mu}, {sigma}?)')
plt.fill_between(x, y, alpha=0.3)
plt.xlabel('value')
plt.ylabel('probability density')
plt.title('Normal distribution')
plt.legend()
plt.grid(True)
plt.show()
# 生成随机样本
samples = np.random.normal(mu, sigma, 1000)
print(f"样本均值: {samples.mean():.3f}")
print(f"样本标准差: {samples.std():.3f}")
什么是二项分布?
二项分布用于描述在n次独立重复试验中,每次成功概率为p的情况下,恰好取得k次成功的概率分布。
生活中的应用场景:
主要参数说明:
在二分类问题中的应用:
在机器学习中,尤其是评估分类器性能时,二项分布可用于建模预测正确的次数分布。例如,若某个分类器在100个样本上的准确率为80%,我们可以用二项分布来分析它真正表现是否显著优于随机猜测。
每个样本只能属于类别0或类别1,即分类结果是二元的。
假设模型预测正确的概率为 p,那么在 n 个独立样本中恰好有 k 个被正确预测的概率遵循二项分布规律。
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
# 模拟抛硬币实验:二项分布示例
n = 10 # 抛掷次数
p = 0.5 # 单次出现正面的概率
k_values = range(n + 1)
probabilities = [stats.binom.pmf(k, n, p) for k in k_values]
plt.figure(figsize=(10, 6))
plt.bar(k_values, probabilities)
plt.xlabel('number of heads')
plt.ylabel('probability') # 成功次数对应的概率
plt.title(f'Binomial distribution (n={n}, p={p})')
plt.grid(True)
plt.show()
P(A|B) = P(A和B同时发生) / P(B)
什么是参数估计?
在机器学习任务中,通常需要从观测数据中推断出模型的关键参数。例如:
最大似然估计(MLE)的核心思想
选择一组参数值,使得当前观测到的数据出现的可能性最大。
直观理解举例
假设你进行了10次硬币抛掷,观察到7次正面朝上。
- 若硬币公平(p=0.5),则出现7次正面的概率较低
- 若正面概率为0.7,则该结果更有可能发生
因此,MLE会选择让“7次正面”这一事件发生的概率达到最大的 p 值作为估计结果。
“似然”与“概率”的区别
- 概率:已知参数,求某事件发生的可能性
- 似然:已知事件结果,反推哪个参数值更可能生成此结果
实际案例:估计硬币正面朝上的概率
def maximum_likelihood_estimation():
"""
最大似然估计示例:估计硬币正面的概率
"""
print("=" * 60)
print("最大似然估计(MLE)示例")
print("=" * 60)
# 实际观测数据:10次抛硬币的结果(1表示正面,0表示反面)
observations = [1, 1, 0, 1, 1, 0, 1, 1, 1, 0]
n = len(observations) # 总试验次数
k = sum(observations) # 正面出现次数
print(f"观测数据: {observations}")
print(f"正面次数: {k}/{n}")
# MLE 的估计公式:p = k / n
# 对于二项分布,使似然函数取得最大值的 p 即为样本频率
p_mle = k / n
print(f"\nMLE估计:")
print(f" 正面概率 p = k/n = {k}/{n} = {p_mle:.2f}")
# 验证不同 p 值下的似然大小
print(f"\n验证:不同p值的似然(概率)")
print(f" (似然越大,说明这个p值越能解释当前数据)")
from scipy import stats
for p in [0.5, 0.6, 0.7, 0.8]:
likelihood = stats.binom.pmf(k, n, p)
print(f" p={p:.1f}: 似然={likelihood:.4f}")
print(f"\n结论:")
print(f" 当 p={p_mle:.2f} 时,似然值最大,故MLE估计结果为 {p_mle:.2f}")
return p_mle
maximum_likelihood_estimation()
P(A|B) = P(B|A) × P(A) / P(B)
MLE的优点
MLE的缺点
什么是MAP?
最大后验估计(Maximum A Posteriori, MAP)是对MLE的扩展,它不仅考虑观测数据,还结合了参数的先验分布信息。
MLE 与 MAP 的对比
| 方法 | 考虑因素 | 典型公式 |
|---|---|---|
| MLE | 仅依赖数据 | p = k / n |
| MAP | 数据 + 先验知识 | p = (k + α) / (n + α + β) |
为什么引入MAP?
考虑一个极端情况:连续抛掷一枚硬币3次,结果全部为正面。
先验知识的影响程度
与MLE的本质区别
MAP不仅仅依据观测数据进行判断,而是综合了先验信念与当前证据,从而得到更为稳健的参数估计。
后验 = (似然 × 先验) / 证据
def maximum_a_posteriori_estimation():
# 观测数据
observations = [1, 1, 0, 1, 1, 0, 1, 1, 1, 0]
n = len(observations)
k = sum(observations)
# 先验设定:假设硬币偏向公平,使用Beta分布作为先验
alpha_prior = 2 # 先验参数,反映对正面出现概率的初始信念
beta_prior = 2
# 最大后验估计(MAP):结合观测数据与先验知识
# 使用公式 (k + alpha) / (n + alpha + beta)
p_map = (k + alpha_prior) / (n + alpha_prior + beta_prior)
# 极大似然估计(MLE):仅基于观测数据
p_mle = k / n
print(f"MLE估计: {p_mle:.2f}")
print(f"MAP估计(考虑先验): {p_map:.2f}")
print("MAP估计更接近0.5,因为先验认为硬币是公平的")
maximum_a_posteriori_estimation()
多元正态分布简介
作为一维正态分布在多维情况下的自然扩展,多元正态分布是人工智能领域中最为基础且广泛应用的概率模型之一。它能够有效描述多个连续变量联合变化的统计规律。
数学表达形式
对于一个n维随机向量 x,其概率密度函数定义如下:
p(x) = (1/(2π)^(n/2) |Σ|^(1/2)) × exp(-1/2 (x-μ)^T Σ^(-1) (x-μ))
其中:
直观理解不同维度下的表现形态
在AI领域的典型应用场景
通过组合多个多元正态分布来拟合复杂的数据分布结构,常用于聚类分析与概率密度估计任务。
假设潜在空间中的隐变量服从多元正态分布,从而实现对数据的有效生成与重构。
将网络权重参数建模为服从多元正态分布的随机变量,有助于量化预测过程中的不确定性。
import numpy as np
from scipy.stats import multivariate_normal
import matplotlib.pyplot as plt
# 设定分布参数
mu = np.array([0, 0]) # 均值向量
Sigma = np.array([[1, 0.5], # 协方差矩阵
[0.5, 1]])
# 创建分布对象并采样
mvn = multivariate_normal(mean=mu, cov=Sigma)
samples = mvn.rvs(size=1000)
# 可视化结果
plt.figure(figsize=(10, 5))
# 左图:样本点散点图
plt.subplot(1, 2, 1)
plt.scatter(samples[:, 0], samples[:, 1], alpha=0.5)
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('Multivariate normal distribution sample')
plt.grid(True)
# 右图:概率密度等高线图
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))
Z = mvn.pdf(pos)
plt.subplot(1, 2, 2)
plt.contour(X, Y, Z)
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('Probability density contour')
plt.grid(True)
plt.tight_layout()
plt.show()
协方差矩阵的基本概念
协方差矩阵用于度量一组随机变量之间两两的相关性,是多元统计分析的核心工具之一。
形式化定义
设n维随机向量 x = [x, x, …, x],则其协方差矩阵 Σ 的元素由下式给出:
Σ_ij = Cov(x_i, x_j) = E[(x_i - μ_i)(x_j - μ_j)]
主要性质
直观解释
在统计学和人工智能领域,协方差矩阵是衡量变量间关系的核心工具。它不仅反映各个特征的方差,还能揭示不同变量之间的协变趋势。
协方差解释:
为了更直观地比较不同量纲下的关联程度,引入了相关系数的概念:
ρ_ij = Σ_ij / (√Σ_ii × √Σ_jj),其取值范围为[-1, 1]。该指标消除了单位影响,更适合用于跨维度的数据分析。
主成分分析(PCA):
通过对数据的协方差矩阵进行特征值分解,提取出主要变化方向,实现降维处理,保留最重要的信息结构。
多元正态分布建模:
协方差矩阵决定了多维高斯分布的形状、伸展方向以及各维度间的依赖关系。
特征选择策略:
- 高协方差特征对可能意味着冗余信息,可用于剔除重复特征;
- 低协方差则表明特征相对独立,具有独特表达能力,适合保留用于模型训练。
import numpy as np
# 计算协方差矩阵
def compute_covariance_matrix(data):
"""
计算数据的协方差矩阵
参数:
- data: (n_samples, n_features) 形状的数据矩阵
返回:
- cov_matrix: (n_features, n_features) 协方差矩阵
"""
# 中心化数据
data_centered = data - data.mean(axis=0)
# 计算协方差矩阵
n = data.shape[0]
cov_matrix = (data_centered.T @ data_centered) / (n - 1)
return cov_matrix
KL(q(θ) || p(θ|D)) = ∫ q(θ) log(q(θ)/p(θ|D)) dθ
以下是一个生成正相关变量并计算其协方差矩阵的示例:
# 示例:计算两个相关变量的协方差矩阵
np.random.seed(42)
# 生成相关数据
x = np.random.randn(1000)
y = 2 * x + np.random.randn(1000) * 0.5 # y与x正相关
data = np.column_stack([x, y])
cov_matrix = compute_covariance_matrix(data)
print(f"协方差矩阵:\n{cov_matrix}")
print(f"\n解释:")
print(f" Var(x) = {cov_matrix[0, 0]:.3f}")
print(f" Var(y) = {cov_matrix[1, 1]:.3f}")
print(f" Cov(x,y) = {cov_matrix[0, 1]:.3f} (正相关)")
print(f" 相关系数 = {cov_matrix[0, 1] / np.sqrt(cov_matrix[0, 0] * cov_matrix[1, 1]):.3f}")
什么是变分推断?
变分推断(Variational Inference, VI)是一种用于近似复杂贝叶斯后验分布的技术,特别适用于无法直接计算真实后验的情形。
核心思想:
使用一个形式简单且易于处理的概率分布 q(θ),来逼近真实的后验分布 p(θ|D)。具体步骤包括:
数学原理:
关键在于最小化 q(θ) 与真实后验 p(θ|D) 之间的KL散度:
ELBO = E_q[log p(D|θ)] - KL(q(θ) || p(θ))
这一过程等价于最大化“证据下界”(Evidence Lower Bound, ELBO),从而避免直接计算难以处理的边缘概率。
变分自编码器(VAE):
利用变分推断学习潜在空间中隐变量的分布,广泛应用于图像生成、数据重建等任务。
贝叶斯神经网络:
将权重视为随机变量,采用变分方法估计其后验分布,有助于量化预测不确定性,提升模型鲁棒性。
主题模型(如LDA):
Latent Dirichlet Allocation 使用变分推断进行文档主题推断,在自然语言处理中有重要地位。
# 变分推断的简单示例
def variational_inference_example():
"""
用变分推断近似后验分布
假设:观测到数据D,想推断参数θ的后验分布
后验分布 p(θ|D) 难以计算,用正态分布 q(θ) 近似
"""
# 简化的例子:用正态分布近似后验
# 在实际应用中,需要优化变分参数
# 变分分布:q(θ) ~ N(μ_q, σ_q?)
mu_q = 2.0 # 变分均值
sigma_q = 0.5 # 变分标准差
# 生成近似样本
from scipy.stats import norm
q_samples = norm.rvs(loc=mu_q, scale=sigma_q, size=1000)
print(f"变分分布 q(θ) ~ N({mu_q}, {sigma_q}?)")
print(f"近似后验分布的均值: {q_samples.mean():.3f}")
print(f"近似后验分布的标准差: {q_samples.std():.3f}")
# 实际流程应包含:
# 1. 定义变分分布族
# 2. 最大化ELBO以优化参数(μ_q, σ_q)
# 3. 使用梯度下降或其他优化算法
variational_inference_example()
基于scikit-learn库构建一个基本的高斯朴素贝叶斯分类器,并结合人工数据集完成训练与评估流程。
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
# 生成模拟分类数据
X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0,
n_informative=2, n_clusters_per_class=1, random_state=42)
# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建并训练模型
model = GaussianNB()
model.fit(X_train, y_train)
# 输出准确率
accuracy = model.score(X_test, y_test)
print(f"朴素贝叶斯分类器准确率: {accuracy:.3f}")
from sklearn.metrics import accuracy_score
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
# 生成分类数据集用于示例
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 将数据划分为训练集和测试集,测试集占比20%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练高斯朴素贝叶斯模型
nb = GaussianNB()
nb.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = nb.predict(X_test)
# 计算预测准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"朴素贝叶斯分类器准确率: {accuracy:.2%}")
# 展示前5个样本的类别预测概率
probabilities = nb.predict_proba(X_test[:5])
print(f"\n前5个样本的预测概率:")
for i, prob in enumerate(probabilities):
print(f"样本 {i}: 类别0={prob[0]:.3f}, 类别1={prob[1]:.3f}")
扫码加好友,拉您进群



收藏
