2026/7/27 15:13:34

计算机领域常用概率学公式的代码实现教程

计算机领域常用概率学公式的代码实现教程 计算机领域常用概率学公式的代码实现教程在计算机科学中概率论不仅是机器学习、数据科学和算法分析的基础也是理解随机事件、预测模型和优化系统的重要工具。从贝叶斯推理到期望值计算概率学公式无处不在。本教程将从基础概念开始逐步深入到高级应用并通过 Python 代码实现这些公式。无论你是编程新手还是有一定经验的开发者都能从中获得实用的知识。## 基础概念概率与随机变量概率学始于对随机事件的研究。概率Probability是一个介于 0 和 1 之间的数值表示事件发生的可能性。随机变量Random Variable则是将随机事件映射到数值的函数。### 离散概率与连续概率-离散概率适用于有限或可数无限的结果集如掷骰子的点数。-连续概率适用于无限不可数的结果集如人的身高。在计算机中我们通常用概率分布函数PDF或概率质量函数PMF来描述这些概率。## 基本公式实现条件概率与贝叶斯定理### 条件概率公式条件概率表示在事件 B 发生的条件下事件 A 发生的概率[ P(A|B) \frac{P(A \cap B)}{P(B)} ]### 贝叶斯定理贝叶斯定理是条件概率的扩展用于根据新证据更新假设的概率[ P(H|E) \frac{P(E|H) \cdot P(H)}{P(E)} ]其中( P(H) ) 是先验概率( P(E|H) ) 是似然( P(E) ) 是证据概率。### 代码示例 1条件概率与贝叶斯计算以下代码演示如何用 Python 计算条件概率和贝叶斯定理假设我们有一个简单的数据集。pythonimport numpy as np# 假设我们有一个疾病检测的场景# - 疾病患病率先验概率P(Disease) 0.01# - 检测敏感度真阳性率P(Positive|Disease) 0.99# - 误报率假阳性率P(Positive|No Disease) 0.05# 定义概率p_disease 0.01p_positive_given_disease 0.99p_positive_given_no_disease 0.05# 计算 P(No Disease)p_no_disease 1 - p_disease# 计算 P(Positive) 使用全概率公式p_positive p_positive_given_disease * p_disease p_positive_given_no_disease * p_no_disease# 使用贝叶斯定理计算 P(Disease|Positive)p_disease_given_positive (p_positive_given_disease * p_disease) / p_positiveprint(fP(Disease) {p_disease})print(fP(Positive) {p_positive:.4f})print(fP(Disease|Positive) {p_disease_given_positive:.4f})# 输出P(Disease) 0.01# P(Positive) 0.0594# P(Disease|Positive) 0.1667注释这段代码展示了贝叶斯定理在医疗诊断中的应用。尽管检测敏感度很高但由于疾病罕见阳性结果后患病的概率仍然只有约 16.67%。这体现了先验概率的重要性。## 进阶概念期望值与方差### 期望值Expected Value期望值是随机变量的加权平均值用于衡量中心趋势[ E[X] \sum x_i \cdot P(x_i) ]离散[ E[X] \int x \cdot f(x) dx ]连续### 方差Variance方差衡量随机变量的离散程度[ Var(X) E[(X - \mu)^2] E[X^2] - (E[X])^2 ]在计算机中这些公式常用于分析算法的时间复杂度或模拟随机过程。## 高级应用蒙特卡洛模拟与大数定律蒙特卡洛模拟是一种通过重复随机采样来近似概率分布或期望值的方法。大数定律指出随着样本数量增加样本均值会趋近于期望值。### 代码示例 2蒙特卡洛模拟计算 π 值以下代码使用蒙特卡洛方法估算圆周率 π展示了概率与几何的结合。pythonimport randomimport mathdef monte_carlo_pi(num_samples): 使用蒙特卡洛模拟估算 π 值。 原理在单位正方形内随机生成点统计落在内切圆内的比例。 圆的面积 π * r^2正方形面积 4 * r^2所以 π ≈ 4 * (圆内点数 / 总点数) inside_circle 0 for i in range(num_samples): # 在 [0, 1] 范围内随机生成点的 x 和 y 坐标 x random.random() # 0 到 1 之间的随机浮点数 y random.random() # 检查点是否在半径为 1 的圆内圆心在 (0,0) if x**2 y**2 1: inside_circle 1 # 根据面积比估算 π pi_estimate 4 * inside_circle / num_samples return pi_estimate# 测试不同样本数量samples_list [100, 1000, 10000, 100000]for samples in samples_list: estimate monte_carlo_pi(samples) error abs(estimate - math.pi) print(f样本数: {samples:6d}, 估算 π: {estimate:.6f}, 误差: {error:.6f})# 输出示例由于随机性每次运行结果不同# 样本数: 100, 估算 π: 3.120000, 误差: 0.021593# 样本数: 1000, 估算 π: 3.144000, 误差: 0.002407# 样本数: 10000, 估算 π: 3.141600, 误差: 0.000007# 样本数: 100000, 估算 π: 3.141560, 误差: 0.000033注释随着样本数量增加估算值越来越接近真实 π 值约 3.14159。这验证了大数定律样本均值收敛于期望值。蒙特卡洛模拟在机器学习中用于训练强化学习模型在金融中用于风险评估。## 高级推导最大似然估计与正态分布最大似然估计MLE是一种通过最大化观测数据的似然函数来估计参数的方法。假设数据服从正态分布其概率密度函数为[ f(x|\mu, \sigma^2) \frac{1}{\sqrt{2\pi\sigma^2}} e{-\frac{(x-\mu)2}{2\sigma^2}} ]MLE 估计参数为- 均值 (\mu \frac{1}{n}\sum x_i)- 方差 (\sigma^2 \frac{1}{n}\sum (x_i - \mu)^2)### 实际应用高斯朴素贝叶斯分类器在机器学习中朴素贝叶斯分类器假设特征之间独立并常用高斯分布建模连续特征。以下代码实现了一个简单版本。pythonimport numpy as npfrom scipy.stats import normclass GaussianNaiveBayes: 高斯朴素贝叶斯分类器 def fit(self, X, y): self.classes np.unique(y) self.means {} self.vars {} self.priors {} for c in self.classes: X_c X[y c] self.means[c] np.mean(X_c, axis0) self.vars[c] np.var(X_c, axis0) self.priors[c] len(X_c) / len(X) def predict(self, X): predictions [] for x in X: posteriors [] for c in self.classes: # 计算对数似然以避免数值下溢 log_likelihood np.sum(norm.logpdf(x, locself.means[c], scalenp.sqrt(self.vars[c]))) log_prior np.log(self.priors[c]) posteriors.append(log_likelihood log_prior) predictions.append(self.classes[np.argmax(posteriors)]) return np.array(predictions)# 模拟数据两个类别各有两个特征np.random.seed(42)X_class0 np.random.normal(loc[1, 2], scale0.5, size(50, 2))X_class1 np.random.normal(loc[4, 5], scale0.5, size(50, 2))X np.vstack([X_class0, X_class1])y np.array([0]*50 [1]*50)# 训练和预测model GaussianNaiveBayes()model.fit(X, y)test_point np.array([[2, 3]])prediction model.predict(test_point)print(f测试点 {test_point[0]} 的预测类别: {prediction[0]})# 输出测试点 [2 3] 的预测类别: 0注释该分类器使用最大似然估计计算每个类别的均值和方差然后通过贝叶斯定理计算后验概率。虽然朴素贝叶斯假设特征独立但在许多实际任务如文本分类中表现良好。## 总结通过本教程我们从基础的条件概率和贝叶斯定理出发实现了核心公式的代码然后扩展到期望值与方差的概念并通过蒙特卡洛模拟展示了概率在数值计算中的应用最后我们探讨了最大似然估计和高斯朴素贝叶斯分类器将概率公式与机器学习模型结合。这些技能在计算机领域至关重要无论是分析随机算法、构建预测模型还是优化系统性能概率学公式都能提供坚实的理论支持。建议读者动手运行代码调整参数如样本数量或先验概率观察结果的变化。实践是掌握概率学的最佳途径。如果你对某些主题感兴趣可以进一步研究概率图模型、随机过程或强化学习中的策略梯度方法。