朴素贝叶斯算法源自贝叶斯定理。为了更好地理解这一算法,我们首先从其创始人——托马斯·贝叶斯(Thomas Bayes,1702-1761)谈起。托马斯·贝叶斯是18世纪英国著名的学者,集神学家、数学家、数理统计学家和哲学家于一身。
贝叶斯的主要贡献在于1763年提出的贝叶斯公式,以及1785年出版的《机会的学说概论》。这些成果奠定了概率论和数理统计的基础。贝叶斯统计能够“从特殊推论普通、从样本推论全体”,成为了一门强大的工具。
假设事件A和事件B发生的概率分别为P(A)和P(B)。那么,A和B同时发生的概率为P(AB)。如果A和B的发生相互独立,那么P(AB) = P(A) × P(B)。
若A和B不是独立事件,则需要引入条件概率的概念。条件概率P(B|A)表示在A发生的情况下,B发生的概率。P(AB) = P(B|A) × P(A)。
通过条件概率的定义,我们可以得出P(B|A) × P(A) = P(AB) = P(A|B) × P(B)。贝叶斯定理(严格来说是“贝叶斯-拉普拉斯公式”)如下所示:
P(A|B) = P(A) × P(B|A) / P(B)
其中,P(A)称为先验概率,P(A|B)称为后验概率。
贝叶斯定理可以应用于分类问题。例如,假设我们要分类的目标是y,而特征变量为X。特征变量可以包含多个维度。
对于n个维度的特征变量,我们采用朴素贝叶斯的假设,即每个特征之间是独立的。这样,朴素贝叶斯原理可以表示为:
P(y|X) ∝ P(X|y) × P(y)
公式左边的分母是常数,因此只需要关注分子部分。在实际应用中,我们只需计算每个类别的出现概率,并选择出现概率最大的类别。
例如,我们可以通过给定的特征集预测明天的天气(晴天、阴天、多云、下雨)。计算每种天气出现的概率,概率最高的类别即为最终的预测结果。
朴素贝叶斯分类算法有很多变体,其中高斯分布-朴素贝叶斯较为常用。这种算法假设特征的条件概率P(x|y)符合正态分布(高斯分布)。
```python import numpy as np
class NaiveBayes:
def fit(self, X, y):
n_samples, n_features = X.shape
self._classes = np.unique(y)
n_classes = len(self._classes)
self._mean = np.zeros((n_classes, n_features), dtype=np.float64)
self._var = np.zeros((n_classes, n_features), dtype=np.float64)
self._priors = np.zeros(n_classes, dtype=np.float64)
for idx, c in enumerate(self._classes):
X_c = X[y == c]
self._mean[idx, :] = X_c.mean(axis=0)
self._var[idx, :] = X_c.var(axis=0)
self._priors[idx] = X_c.shape[0] / float(n_samples)
def predict(self, X):
y_pred = [self._predict(x) for x in X]
return np.array(y_pred)
def _predict(self, x):
posteriors = []
for idx, c in enumerate(self._classes):
prior = np.log(self._priors[idx])
posterior = np.sum(np.log(self._pdf(idx, x)))
posterior = prior + posterior
posteriors.append(posterior)
return self._classes[np.argmax(posteriors)]
def _pdf(self, class_idx, x):
mean = self._mean[class_idx]
var = self._var[class_idx]
numerator = np.exp(- (x - mean) ** 2 / (2 * var))
denominator = np.sqrt(2 * np.pi * var)
return numerator / denominator
```
朴素贝叶斯算法是一种重要的分类算法,适用于多种场景,如自然语言处理、情感分析、邮件过滤和推荐系统等。该算法原理简单,易于理解和实现,具有较高的学习效率。