李航统计学习方法 Chapter4 朴素贝叶斯法

简介: 李航统计学习方法 Chapter4 朴素贝叶斯法

如果想了解更多的知识,可以去我的机器学习之路 The Road To Machine Learning通道


第4章 朴素贝叶斯


1.朴素贝叶斯法是典型的生成学习方法。生成方法由训练数据学习联合概率分布


P(X,Y),然后求得后验概率分布P(Y|X)。具体来说,利用训练数据学习P ( X ∣ Y ) 和P ( Y )的估计,得到联合概率分布:


image.png


概率估计方法可以是极大似然估计或贝叶斯估计。

2.朴素贝叶斯法的基本假设是条件独立性,


image.png


这是一个较强的假设。由于这一假设,模型包含的条件概率的数量大为减少,朴素贝叶斯法的学习与预测大为简化。因而朴素贝叶斯法高效,且易于实现。其缺点是分类的性能不一定很高。


3.朴素贝叶斯法利用贝叶斯定理与学到的联合概率模型进行分类预测。


image.png


将输入x 分到后验概率最大的类y


image.png

后验概率最大等价于0-1损失函数时的期望风险最小化。

模型:

  • 高斯模型
  • 多项式模型
  • 伯努利模型

朴素贝叶斯法与贝叶斯估计(Bayesian estimation)是不同的概念。


后验概率最大化的含义


朴素贝叶斯将实例分到后验概率最大的类中,等价于期望风险最小化。假设我们选择了0 − 1损失函数


image.png



对于我们的期望风险函数,我们可以对齐取条件期望,可以得到


image.png

然后为了使期望风险最小化,我们可以对每一个X = x 逐个极小化,可以得到


image.png


这样我们就可以得到期望风险最小化等价于后验概率最大化准则


极大似然估计


为了估计状态变量的条件分布,利用贝叶斯法则,有


image.png


其中P(X|Y)为给定Y 下X 的后验概率(Posterior), P(Y|X)称为似然(Likelyhood),P ( X )称为先验(Prior)。


  • 后验概率最大化的含义
    朴素贝叶斯法将实例分到后验概率最大的类中, 这等价于期望风险最小化


贝叶斯估计


对于x的某个特征的取值没有在先验中出现的情况 ,如果用极大似然估计就会出现所要估计的概率值为0的情况。这样会影响后验概率的计算结果,使分类产生偏差

为了解决这一问题,我们就采用贝叶斯估计


image.png


其中我们的λ ≥ 0 ,等价于在随机变量的各个取值的频数上赋予一个整数λ > 0 ,其实就是为了覆盖样本全空间


当λ = 0时,就是极大似然估计


当λ = 1时,这被称为拉普拉斯平滑(Laplacian smoothing)


GaussianNB 高斯朴素贝叶斯


特征的可能性被假设为高斯

概率密度函数:

image.png

数学期望(mean):μ


方差:image.png

高斯模型


接着我们利用朴素贝叶斯的方法来解决iris分类问题

首先对我们的数据进行处理,取出前100个数据进行分类,并且分为训练集和测试集,测试集占30%

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
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)

接着可以用我们朴素贝叶斯的方法来解决这个分类问题

class NaiveBayes:
    def __init__(self):
        self.model = None
    # 数学期望
    @staticmethod
    def mean(x):
        return sum(x)/float(len(x))
    # 标准差
    def std(self,x):
        avg = self.mean(x)
        return math.sqrt(sum(math.pow(x_i-avg,2) for x_i in x)/float(len(x)))
    # 概率密度函数
    def gaussian_prob(self,x,mean,std):
        exp = math.pow(math.e, -1*(math.pow(x - mean,2))/(2*std))
        return (1/(math.sqrt(2*math.pi*std)))*exp
    # 计算训练的均值和方差
    def mean_and_std(self,x):
        mean_and_std=[(self.mean(i),self.std(i)) for i in zip(*x)]
        return mean_and_std
    # 分类别求出数学期望和标准差
    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.mean_and_std(value) for label,value in data.items()}
        print("GaussianNB train Done!")
    # 计算概率
    def prob(self,data):
        probabillity = {}
        for label,value in self.model.items():
            probabillity[label] = 1
            for i in range(len(value)):
                mean,std = value[i]
                probabillity[label] *= self.gaussian_prob(data[i],mean,std)
        return probabillity
    # 类别
    def predict(self,x_test):
        #print(self.prob(x_test))
        label = sorted(self.prob(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.model)
print(model.predict([4.4,3.2,1.3,0.2]))
print("在测试集中的准确率:")
print(str(100*(model.score(X_test, y_test)))+"%")
GaussianNB train Done!
0.0
在测试集中的准确率:
100.0%


在编写程序的时候,我们有一些小技巧,第一个技巧是使用 zip ()函数,它将从每个提供的参数中聚合元素。我们使用 * 操作符将数据集传递给 zip ()函数,该操作符将数据集(即列表列表)分离到每一行的单独列表中。函数的作用是: 遍历每一行的每一个元素,并从数据集中返回一列数字,一个聪明的小把戏


scikit-learn实


除此之外,我们可以利用scikit-learn实现我们的模型,除了高斯模型,还有伯努利模型,多项式模型等等

# scikit-learn 实现
from sklearn.naive_bayes import  GaussianNB  # 高斯模型
from sklearn.naive_bayes import BernoulliNB # 伯努利模型
from sklearn.naive_bayes import MultinomialNB # 多项式模型
clf = GaussianNB()
# clf = BernoulliNB()
# clf = MultinomialNB()
clf.fit(X_train,y_train)
print(clf.predict([[4.4,3.2,1.3,0.2]]))

例4.1


我们同样可以用高斯模型来解决我们的例题4.1


import numpy as np
# SML分别对应为123
X = np.array([[1, 1], [1, 2], [1, 2], [1, 1], [1, 1], [2, 1], [2, 2], [2, 2], [2, 3], [2, 3], [3, 3], [3,2], [3,2], [3, 3], [3, 3]])
Y = np.array([-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1])
from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
#拟合数据
clf.fit(X, Y)
print(clf.predict([[2, 1]]))
print(clf.predict_proba([[2,1]]))
[-1]
[[0.74566865 0.25433135]]


我们可以看到我们的结果是-1,并且这里给出了{ − 1 , 1 }的概率,大约是0.75和0.25。


第4章朴素贝叶斯法-习题


习题4.1


  用极大似然估计法推出朴素贝叶斯法中的概率估计公式(4.8)及公式 (4.9)。


解答:


 **第1步:**证明公式(4.8)image.png


由于朴素贝叶斯法假设Y YY是定义在输出空间Y上的随机变量,因此可以定义P ( Y = c k )概率为p 。令m = ∑ i = 1 N I ( y i = c k ) ,得出似然函数:


image.png

使用微分求极值,两边同时对p 求微分:


image.png


可求解得到p = 0 , p = 1 , p = m /N


显然image.png公式(4.8)得证。

**第2步:**证明公式(4.9)image.png


image.png得出似然函数:

image.png

使用微分求极值,两边同时对p 求微分:


image.png


可求解得到p = 0 , p = 1 , p = q /m


显然image.png公式(4.9)得证。


习题4.2


  用贝叶斯估计法推出朴素贝叶斯法中的慨率估计公式(4.10)及公式(4.11)


贝叶斯估计和传统的极大似然估计的区别就是,参数值是固定的还是也当做随机变量。传统的极大似然估计,把参数θ 当做固定的一个值,不变的,只是目前还不知道,通过最大化L 求出θ;贝叶斯估计认为参数θ 也是随机变量,它也服从一个分布(β分布)


解答:


   **第1步:**证明公式(4.11)    image.png

加入先验概率,在没有任何信息的情况下,可以假设先验概率为均匀概率(即每个事件的概率是相同的)。


可得image.png

根据习题4.1得出先验概率的极大似然估计是image.png


存在参数λ \lambdaλ使得( 1 ) ⋅ λ + ( 2 ) = 0


所以有image.png

可得image.png公式(4.11)得证。


**第2步:**证明公式(4.10)image.png


根据第1步,可同理得到


image.png


image.png

image.png


公式(4.11)得证。

相关文章
|
机器学习/深度学习 编解码
ICCV 2023 超分辨率(Super-Resolution)论文汇总
ICCV 2023 超分辨率(Super-Resolution)论文汇总
908 0
|
算法 数据挖掘 Python
Scipy 高级教程——稀疏矩阵
Scipy 高级教程——稀疏矩阵【1月更文挑战第10篇】
483 0
|
机器学习/深度学习 存储 算法
竞争学习原理与策略| 学习笔记
快速学习竞争学习原理与策略。
竞争学习原理与策略| 学习笔记
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
这篇文章提供了Visual Studio 2022社区版C#环境的搭建和安装使用指南,包括下载、安装步骤和创建C#窗体应用程序的详细图文解析。
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
|
12月前
|
机器学习/深度学习 自然语言处理 数据安全/隐私保护
探索Qwen2.5大模型在车险理赔领域的应用
本文探讨了Qwen2.5大模型在车险理赔领域的应用,特别是通过微调模型来优化理赔流程、提高反欺诈能力。文章介绍了车险理赔的数据特点和业务流程,展示了如何准备数据、微调模型,并进行了模型评估和部署的示例。通过这些方法,Qwen2.5能够显著提升理赔效率和准确性,减少人工干预。
1068 1
|
监控 数据可视化 搜索推荐
6 款办公软件对比评测:谁在团队项目可视化管理中脱颖而出?
本文深入评测了6款办公软件,包括板栗看板、Trello、Asana、Monday.com、ClickUp和Wrike,重点分析了它们在团队项目可视化精细管理中的功能特性与优势。板栗看板以其直观的界面、便捷的任务操控、高效的团队协作和精准的数据洞察,成为中小团队快速实现项目管理可视化的理想选择。其他软件也各有千秋,适合不同规模和需求的团队使用。
355 1
|
JavaScript Java 关系型数据库
Springboot+vue的网上鲜花商城管理系统。Javaee项目,springboot vue前后端分离项目。
Springboot+vue的网上鲜花商城管理系统。Javaee项目,springboot vue前后端分离项目。
|
知识图谱 C++
大学物理-实验篇——用拉伸法测定金属丝的杨氏(弹性)模量(胡克定律、杨氏模量、平面反射镜、三角函数、螺旋测微器)
大学物理-实验篇——用拉伸法测定金属丝的杨氏(弹性)模量(胡克定律、杨氏模量、平面反射镜、三角函数、螺旋测微器)
2221 0
|
机器学习/深度学习 算法 BI
机器学习:李航-统计学习方法笔记(一)监督学习概论
机器学习:李航-统计学习方法笔记(一)监督学习概论
429 0
机器学习:李航-统计学习方法笔记(一)监督学习概论
|
SQL 存储 关系型数据库
Hive 和 HDFS、MySQL 之间的关系
Hive是Hadoop上的数据仓库工具,用HiveQL进行大数据查询;HDFS是分布式文件系统,用于存储大规模数据,常与Hive结合,提供数据存储和高可靠性。MySQL是RDBMS,适用于结构化数据管理,在大数据环境里可存储Hive的元数据,提升查询效率和元数据管理。三者协同处理数据管理和分析任务。
882 0