共计 2204 个字符,预计需要花费 6 分钟才能阅读完成。
在统计学习和机器学习领域,贝叶斯学派和频率学派是两种基础且对立的哲学思想。理解它们的差异不仅有助于我们选择合适的工具,更能深入把握模型背后的假设。

一、核心思想对比
-
频率学派 认为概率是长期事件发生的频率,基于大数定律和重复抽样。其核心是通过最大化似然函数 $L(\theta|X)=P(X|\theta)$ 来估计参数,典型方法如 MLE(最大似然估计)。
-
贝叶斯学派 将概率视为信念的度量,通过先验分布 $P(\theta)$ 和似然函数 $P(X|\theta)$ 计算后验分布 $P(\theta|X) \propto P(X|\theta)P(\theta)$。这种思想允许将领域知识融入模型。
二、方法论差异
- 参数估计
- 频率派:点估计(如样本均值)
-
贝叶斯:整个概率分布的估计
-
不确定性处理
- 频率派:置信区间(重复抽样下的覆盖概率)
-
贝叶斯:可信区间(参数的真实概率)
-
计算复杂度
- 频率派通常计算更高效
- 贝叶斯需要马尔可夫链蒙特卡洛 (MCMC) 等近似方法
三、朴素贝叶斯实现
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
# 带 Laplace 平滑的朴素贝叶斯实现
class NaiveBayes:
def __init__(self, alpha=1.0):
self.alpha = alpha # Laplace 平滑系数
def fit(self, X, y):
n_samples, n_features = X.shape
self.classes_ = np.unique(y)
n_classes = len(self.classes_)
# 计算类先验 P(y)
self.class_log_prior_ = np.log([np.sum(y == c) / n_samples for c in self.classes_])
# 计算条件概率 P(x_i|y) 带平滑
self.feature_log_prob_ = np.zeros((n_classes, n_features))
for idx, c in enumerate(self.classes_):
X_c = X[y == c]
self.feature_log_prob_[idx, :] = np.log((X_c.sum(axis=0) + self.alpha) /
(X_c.sum() + self.alpha * n_features))
def predict(self, X):
return self.classes_[np.argmax(
X @ self.feature_log_prob_.T + self.class_log_prior_,
axis=1)]
四、改进为半朴素贝叶斯
当特征间存在明显相关性时,可以放松独立性假设:
from sklearn.feature_selection import mutual_info_classif
# 特征相关性分析
def select_dependent_features(X, y, threshold=0.3):
mi = mutual_info_classif(X, y)
return [i for i, val in enumerate(mi) if val > threshold]
# 修改预测方法,对相关特征联合处理
def semi_naive_predict(model, X, dep_features):
joint_probs = []
for c in model.classes_:
# 对相关特征组计算联合概率
log_prob = model.class_log_prior_[c]
for feat_group in dep_features:
log_prob += np.log(np.prod(X[:, feat_group] *
model.feature_log_prob_[c, feat_group]))
joint_probs.append(log_prob)
return np.argmax(joint_probs)
五、实战建议
- 数据规模考虑
- 小数据:贝叶斯方法(利用先验弥补数据不足)
-
大数据:频率方法(依赖数据本身)
-
连续变量处理
- 高斯朴素贝叶斯:假设特征服从正态分布
-
分箱离散化:将连续值转换为区间类别
-
与逻辑回归对比
- 朴素贝叶斯:训练快、对缺失值鲁棒
- 逻辑回归:可处理特征相关性、需要更多数据
六、模型评估
from sklearn.metrics import confusion_matrix, roc_curve
import matplotlib.pyplot as plt
# 混淆矩阵示例
y_pred = model.predict(X_test)
print(confusion_matrix(y_test, y_pred))
# ROC 曲线
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:,1])
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
七、开放问题
当先验知识不足时,可以考虑:
– 使用无信息先验(如均匀分布)
– 采用经验贝叶斯方法从数据估计先验
– 集成频率派的交叉验证技术
统计方法的选择最终取决于具体问题和可用资源。理解这些基础理论差异,能帮助我们在实践中做出更明智的决策。
正文完
