开篇
朴素贝叶斯算法是脱胎于贝叶斯定理。那么,我们就从提出贝叶斯定理的人 - 托马斯·贝叶斯(Thomas Bayes, 1702~1761)聊起。托马斯·贝叶斯是18世纪英国著名的学者。作为18世纪英国神学家、数学家、数理统计学家和哲学家,托马斯·贝叶斯可谓是集万千荣誉于一身。
贝叶斯一身最突出的贡献是在1763年提出了贝叶斯公式,以及在1785年发表的著作《机会的学说概论》。这些贡献直接奠定了古代概率论和数理统计的基石。贝叶斯统计的创立者,练就一门“洞悉万物”的神技,可以“从特殊推论普通、从样本推论全体“。
托马斯·贝叶斯
贝叶斯定理
假设有事情A和事情B,发生的概率分别为P(A) 和 P(B)。那么,A和B同时发生的概率为 P(AB)。假如说A和B的发生和彼此没有任何关系,则称A与B是互相独立的事情,那么P(AB) = P(A) x P(B)。
假如,P(A)和P(B)非独立,则引入了P(B|A)的概念。P(B|A)表示A事情发生,B事情也发生的概率,这叫做条件概率。P(AB) = P(B|A) x 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为特征变量。当然特征变量可以用很多个维度。
特征变量X
对于n个维度的特征变量,“朴素”的条件独立假设 - 假设每个特征都是互相独立的。这样,朴素贝叶斯原理可以如下表达。
朴素贝叶斯原理
上式中,左边各项均可以从训练数据集(Training Dataset)得到。并且,公式左边的分母是不变的。也就是说 P(y|X)之和右式的分子有关。
朴素贝叶斯原理
经过朴素贝叶斯分类,我们只需计算每个类别(y)的出现的概率,并且从中选出出现概率最大的类别。比如我们需求预测明天的天气(晴天、阴天、多云、下雨),根据给定的特征集,可以计算每种天气出现的概率。概率值最大的类别即为输入值。
朴素贝叶斯原理
高斯分布-朴素贝叶斯
朴素贝叶斯分类有很多种,其中高斯分布-朴素贝叶斯是运用比较多的。高斯分布-朴素贝叶斯假设特征的条件概率 P(x|y) 遵照正态分布(高斯分布)。
高斯分布
高斯分布-朴素贝叶斯
朴素贝叶斯分类实战
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]
{!-- PGC_COLUMN --}
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
总结
朴素贝叶斯算法是十大发掘算法之一。次要处理分类成绩。朴素贝叶斯分类算法被广泛运用在自然言语分析,情感分析,邮件分类,引荐算法等等。朴素贝叶斯算法原理易懂、学习效率高。 |