找回密码
 立即注册
搜索

机器学习十大算法之一:朴素贝叶斯算法(Naive Bayes)

开篇

朴素贝叶斯算法是脱胎于贝叶斯定理。那么,我们就从提出贝叶斯定理的人 - 托马斯·贝叶斯(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

总结

朴素贝叶斯算法是十大发掘算法之一。次要处理分类成绩。朴素贝叶斯分类算法被广泛运用在自然言语分析,情感分析,邮件分类,引荐算法等等。朴素贝叶斯算法原理易懂、学习效率高。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评3

我爱天思 2020-6-28 17:30:46 来自手机 显示全部楼层
纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下
回复

使用道具 举报

小莎莉 2020-6-29 13:02:02 显示全部楼层
秀起来~
回复

使用道具 举报

曾勇明 2020-6-30 15:30:24 显示全部楼层
顶起顶起顶起
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies