机器学习笔记
前言
章节目录
朴素贝叶斯法的学习与分类
基本方法
后验概率最大化的含义
朴素贝叶斯法的参数估计
极大似然估计
学习与分类算法
贝叶斯估计
朴素贝叶斯法
参数数量
条件概率分布P(X=x|Y=ck)有指数级数量的参数,其实际估计是不可行的。
算法推导
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。
贝叶斯定理
特征条件独立假设
条件独立假设
求条件概率 \( P(Y|X) \),其中 \( X \) 是一个集合 \( \{X_1, X_2, \dots, X_n\} \),并且在给定 \( Y \) 的情况下,各个 \( X_i \) 之间满足条件独立假设:
每一个\( X_i \)和其他的每个\( X_k \)是条件独立的
每一个\( X_i \)和其他的每个\( X_k \)的子集是条件独立的
条件独立性假设是:
$$
\begin{align}
P(X=x|Y=c_k)&=P(X^{(1)},\dots,X^{(n)}|Y=c_k)\\
&=\prod^n_{j=1}P(X^{(j)}=x^{(j)}|Y=c_k)
\end{align}
$$
辅助理解公式:
\begin{aligned}
P(X|Y)&=P(X_1,X_2|Y)\\
&=\color{red}P(X_1|X_2,Y)\color{black}P(X_2|Y)\\
&=\color{red}P(X_1|Y)\color{black}P(X_2|Y)
\end{aligned}
参数估计
极大似然估计
为了估计状态变量的条件分布,利用贝叶斯法则,有
$$
\underbrace{P(X|Y)}_{posterior}=\frac{\overbrace{P(Y|X)}^{likelihood}\overbrace{P(X)}^{prior}}{\underbrace{P(Y)}_{evidence}}=\frac{\overbrace{P(Y|X)}^{likelihood}\overbrace{P(X)}^{prior}}{\underbrace{\sum\limits_x P(Y|X)P(X)}_{evidence}}
$$其中P(X|Y)为给定Y下X的后验概率(Posterior),P(Y|X)称为似然(Likelyhood),P(X)称为先验;
后验概率最大化的含义:朴素贝叶斯法将实例分到后验概率最大的类中, 这等价于期望风险最小化。
后验,观察到Y之后,对X的信念
贝叶斯估计
对于x的某个特征的取值没有在先验中出现的情况 ,如果用极大似然估计,这种情况的可能性就是0。但是出现这种情况的原因通常是因为数据集不能全覆盖样本空间,出现未知的情况处理的策略就是做平滑。
$$
P_{\lambda}(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum\limits_{i=1}^NI(x_i^{j}=a_{jl},y_j=c_k)+\lambda}{\sum\limits_{i=1}^NI(y_j=c_k)+S_j\lambda}
$$
其中 \( \lambda \geqslant 0 \):
当 \( \lambda = 0 \) 的时候,就是极大似然估计
当 \( \lambda = 1 \) 的时候,这个平滑方案叫做拉普拉斯平滑(Laplace Smoothing)。拉普拉斯平滑相当于给未知变量给定了先验概率。
总结
朴素贝叶斯法是典型的生成学习方法。生成方法由训练数据学习联合概率分布$P(X,Y)$,然后求得后验概率分布$P(Y|X)$。具体来说,利用训练数据学习$P(X|Y)$和$P(Y)$的估计,得到联合概率分布$$P(X,Y)=P(Y)P(X|Y)$$
概率估计方法可以是极大似然估计或贝叶斯估计。
朴素贝叶斯法的基本假设是条件独立性,$$\begin{aligned} P(X&=x | Y=c_{k} )=P\left(X^{(1)}=x^{(1)}, \cdots, X^{(n)}=x^{(n)} | Y=c_{k}\right) \\ &=\prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right) \end{aligned}$$
这是一个较强的假设。由于这一假设,模型包含的条件概率的数量大为减少,朴素贝叶斯法的学习与预测大为简化。因而朴素贝叶斯法高效,且易于实现。其缺点是分类的性能不一定很高。
朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测。
$$P(Y | X)=\frac{P(X, Y)}{P(X)}=\frac{P(Y) P(X | Y)}{\sum_{Y} P(Y) P(X | Y)}$$
将输入$x$分到后验概率最大的类$y$。
$$y=\arg \max _{c_{k}} P\left(Y=c_{k}\right) \prod_{j=1}^{n} P\left(X_{j}=x^{(j)} | Y=c_{k}\right)$$
后验概率最大等价于0-1损失函数时的期望风险最小化。
模型:高斯模型、多项式模型、伯努利模型
Python代码实现
使用鸢尾花数据,检测数据是否加载成功并且打印第一条数据进行确认:
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from collections import Counter import math def create_data(): iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df['label'] = iris.target df.columns = [ 'sepal length', 'sepal width', 'petal length', 'petal width', 'label' ] data = np.array(df.iloc[:100, :]) # print(data) return data[:, :-1], data[:, -1] X, y = create_data() X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) X_test[0], y_test[0] # (array([5.7, 2.6, 3.5, 1. ]), 1.0)
GaussianNB 高斯朴素贝叶斯
由于直接的朴素贝叶斯效果不是很好,这里增加这个高斯朴素概念:特征的可能性被假设为高斯
概率密度函数:
$$P(x_i | y_k)=\frac{1}{\sqrt{2\pi\sigma^2_{yk}}}exp(-\frac{(x_i-\mu_{yk})^2}{2\sigma^2_{yk}})$$
数学期望(mean):$\mu$
方差:$\sigma^2=\frac{\sum(X-\mu)^2}{N}$
class NaiveBayes: def __init__(self): self.model = None # 数学期望 @staticmethod def mean(X): return sum(X) / float(len(X)) # 标准差(方差) def stdev(self, X): avg = self.mean(X) return math.sqrt(sum([pow(x - avg, 2) for x in X]) / float(len(X))) # 概率密度函数 def gaussian_probability(self, x, mean, stdev): exponent = math.exp(-(math.pow(x - mean, 2) / (2 * math.pow(stdev, 2)))) return (1 / (math.sqrt(2 * math.pi) * stdev)) * exponent # 处理X_train def summarize(self, train_data): summaries = [(self.mean(i), self.stdev(i)) for i in zip(*train_data)] return summaries # 分类别求出数学期望和标准差 def fit(self, X, y): labels = list(set(y)) data = {label: [] for label in labels} for f, label in zip(X, y): data[label].append(f) self.model = { label: self.summarize(value) for label, value in data.items() } return 'gaussianNB train done!' # 计算概率 def calculate_probabilities(self, input_data): # summaries:{0.0: [(5.0, 0.37),(3.42, 0.40)], 1.0: [(5.8, 0.449),(2.7, 0.27)]} # input_data:[1.1, 2.2] probabilities = {} for label, value in self.model.items(): probabilities[label] = 1 for i in range(len(value)): mean, stdev = value[i] probabilities[label] *= self.gaussian_probability( input_data[i], mean, stdev) return probabilities # 类别 def predict(self, X_test): # {0.0: 2.9680340789325763e-27, 1.0: 3.5749783019849535e-26} label = sorted( self.calculate_probabilities(X_test).items(), key=lambda x: x[-1])[-1][0] return label def score(self, X_test, y_test): right = 0 for X, y in zip(X_test, y_test): label = self.predict(X) if label == y: right += 1 return right / float(len(X_test)) model = NaiveBayes() model.fit(X_train, y_train) print(model.predict([4.4, 3.2, 1.3, 0.2])) # 0.0 model.score(X_test, y_test) # 1.0
实际上可以直接调用scikit-learn实现
from sklearn.naive_bayes import GaussianNB # from sklearn.naive_bayes import BernoulliNB, MultinomialNB # 伯努利模型和多项式模型 clf = GaussianNB() clf.fit(X_train, y_train) clf.score(X_test, y_test) clf.predict([[4.4, 3.2, 1.3, 0.2]])
2024-08-23
mmgjegmnaf
哈哈哈,写的太好了https://www.lawjida.com/
jkpbmrdpkj
《侠客行》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/31724.html
bsmlkpufyi
《暴力云与送子鹳》动画片高清在线免费观看:https://www.jgz518.com/xingkong/11461.html
jjfopezlzh
《侠客行》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/31724.html
ypjcotykwv
《奔向月球》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/79815.html
whcwdrtfrs
想想你的文章写的特别好https://www.ea55.com/
dussqvguao
不错不错,我喜欢看 https://www.237fa.com/