机器学习十大算法之一:朴素贝叶斯算法(Naive Bayes)
作者头像
  • 李惠
  • 2020-06-28 11:50:02 6

开篇

朴素贝叶斯算法源自贝叶斯定理。为了更好地理解这一算法,我们首先从其创始人——托马斯·贝叶斯(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

```

总结

朴素贝叶斯算法是一种重要的分类算法,适用于多种场景,如自然语言处理、情感分析、邮件过滤和推荐系统等。该算法原理简单,易于理解和实现,具有较高的学习效率。

    本文来源:图灵汇
责任编辑: : 李惠
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
叶斯算法朴素机器之一十大学习BayesNaive
    下一篇