热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分类模型:概率生成、朴素贝叶斯和逻辑回归|李宏毅机器学习【5】

本文将主要介绍两种经典分类模型,一种是Generative的,例如朴素贝叶斯(NaiveBayes),这种算法通过训练集估计样本总体分布的参数,从而得到每个样本在分布中产生的概率。

本文将主要介绍两种经典分类模型,一种是Generative的,例如朴素贝叶斯(Naive Bayes),这种算法通过训练集估计样本总体分布的参数,从而得到每个样本在分布中产生的概率。另一种是Discriminative的,例如逻辑回归(Logistic Regression),和Generative的区别是,它不需要假设分布,也不需要估计分布的参数,而是对贝叶斯公式进行简化,直接对模型中相关的参数进行优化。

 可能你现在还是晕晕的,没关系,现在假设你还没有接触过分类算法,遇到分类问题时首先会想到什么呢?一个可能的答案是线性回归。用一条线把样本分开,一边大于0,一边小于0,这样好像是可以的。来看看宝可梦的例子,任务是根据宝可梦的属性对其进行分类。先考虑简单的二分类,class1标记为1,class2标记为-1,测试集结果中接近1的就分到class1,接近-1的就分到class2。

 分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

 来看看分类的结果,在左图中样本都聚集在分界线附近,分类的结果还不错。但在右图中出现了远离分界线的样本,分类的界线也受到了影响,分类结果出现了错误,这可以理解为是对那些“太正确”的例子的惩罚。好吧看来此路不通,再换一种思路看看。

 分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

 接下来考虑Probabilistic Generative Model,直译就算概率生成模型。

贝叶斯公式了解一下!现在从下图中的两个箱子class中随机拿出一个球。P(C1)和P(C2)是先验概率,也就是假设你不知道球的颜色,随便拿一个球出来,它来自Calss1的概率P(C1)=5/(5+5)=0.5,来自class2的概率P(C2)=5/(5+5)=0.5。但是当你知道球的颜色的时候,你还会这么算吗,肯定不会了,因为这时要考虑在某个class中拿到某个颜色球的条件概率,例如P(x|C1),具体公式参见下图。

 分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

用后验概率来表示分类结果,需要知道先验概率P(C1)和P(C2),同时也需要知道P(x|C1)和P(x|C2)。前一个好解决,后一个需要用极大似然法进行参数估计。

在宝可梦的问题中,我们假设样本服从正态分布,每个class对应一个具体的正态分布。通过训练集估计出正态分布的参数后,就可以对新样本出现的概率进行计算。(这里用概率密度近似表示概率)

 分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】 

 用极大似然法进行参数估计,找出能使训练集产生概率最大正态分布,即找出其最优参数期望μ和协方差矩阵Σ。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】 

 对两个类别分别运用极大似然法估计参数:

 分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

 结果,好像不咋滴,就算考虑所有7个feature,也只有54%的准确率。So sad!(李宏毅老师原话,说得很有韵味)

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

试着对模型简化一下,假设不同的class对应的协方差矩阵Σ是相同的,只有期望μ不同

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

期望还是和前面一样用均值表示,协方差需要和class的样本数量加权平均一下。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

结果出来了,准确率从54%提升到了73%,棒棒哒。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

 再用经典的三步来回顾一下Probabilistic Generative Model:

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

那么朴素贝叶斯(Naive Bayes)是什么东东呢?

如果假设所有的feature都是相互独立的,也就是说P(C|x) = P(C|x1)*P(C|x2)....P(C|xn),协方差除了对角线其余位置都是0,这种情况下的Generative model就是朴素贝叶斯了。只是简化了分布假设,其它都一毛一样。

接下来,我们对后验概率的公式做一点小小的变换。这个Sigmoid function看着蛮舒服,值域正好在在(0,1)之间,用来表示分类结果再合适不过了。可是,那个z是什么东东,属于Class1的概率除以属于Class2的概率再取对数(西瓜书里面成为对数几率),看着就很奇怪。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

推导的过程就不贴了,总之在李大大一番精妙的推导之后,我们恍然发现,原来z可以表示为一个简单的线性多项式。既然z的形式这么简单,那我们直接求w和b就可以了啊,什么先验概率条件概率看着实在是太多余了。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

逻辑回归(Logistic Regression)闪亮登场~

这简洁的表达式和优美的函数曲线,啧啧,不愧是最优秀的分类算法(SVM表示不服)。从函数的表达式来看,Logistic大概可以分为两个过程,第一步是把Features通过线性变换得到z,第二步是把z放入Sigmoid(本意是长得像s)函数中将值域压缩到(0,1)之间。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

模型有了,接下来还是利用极大似然估计构造需要Maximize的优化函数,加个负号就是熟悉的Loss Function了。这个例子中,属于class1的概率直接用P(C1|x),属于class2概率的用1减掉P(C1|x)就是了。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

取对数,加负号,正常操作。为了把P(C1|x)和1-P(C1|x)形式统一,进一步的转换需要一点小技巧,用到了交叉熵(cross Entropy)。不管标记y是0还是1,带入交叉熵,就会发现它恰好是我们要的东西。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

把逻辑回归和线性回归对比一下,Model里面差了个sigmoid function,所以输出一个在(0,1)之间,一个是任意值。构造Loss Funtion时,逻辑回归用到了极大似然估计和交叉熵;线性回归用的是最小二乘法。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

求解过程和线性回归一样,还是用梯度下降(Gradient Descent),结果非常的amazing!

尽管参数表示的意思完全不同,但是参数更新的公式在形式上竟然一毛一样。

 分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

李老师还开了下脑洞,如果用Square Error来作为逻辑回归的Loss Function会怎么样呢?答案是无法收敛,Square Error在不同参数下的变化非常小,请看下图:

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

再来对比一下Discriminative和Generative两种方法。Discriminative是直接的找出w和b,而Generative是先找到分布的参数,再计算概率。同样的Function Set,在同一个训练集中得到了不同的模型。在宝可梦的例子,Logistic Regression的效果比Generative的效果好一些。 

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

通常认为Discriminative的模型要好一点,但是Generative的模型也是有一些好处的,比如需要更少的训练集,以及更加的robust等等:

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

二分类问题先讨论到这,来看看多分类问题。在多分类问题中,有个经典算法叫Softmax。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

求解的时候还是用交叉熵:

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

最后的最后,来看一下逻辑回归的不足之处。作为一个广义线性模型,对于异或(XOR)这种非线性问题,它是无能为力的。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

解决方法也不是没有,通过对特征进行变换,将非线性问题转化为线性问题就可以通过LogisticRegression求解了。比如此例中,用样本点到[0, 0]和[1, 1]的距离作为变换后的新特征,就可以将原来线性不可分的样本点转化为线性可分的了。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

但是这种巧妙的转换不是很容易想出来啊,有没有什么自动化的方法可以完成这种转换呢?

答案是把几个逻辑回归“串”起来,前面一层的逻辑回归单元做特征转换,后一层的进行分类。

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】

 看着是不是有点眼熟呢,如果把这里的逻辑回归单元叫做神经元(Neuron),连起来就叫做神经网络(Neuron Network)!

欢迎来到深度学习(Deep Learning)

分类模型:概率生成、朴素贝叶斯和逻辑回归 |李宏毅机器学习【5】


推荐阅读
  • 从2019年AI顶级会议最佳论文,探索深度学习的理论根基与前沿进展 ... [详细]
  • Java中高级工程师面试必备:JVM核心知识点全面解析
    对于软件开发人员而言,随着技术框架的不断演进和成熟,许多高级功能已经被高度封装,使得初级开发者只需掌握基本用法即可迅速完成项目。然而,对于中高级工程师而言,深入了解Java虚拟机(JVM)的核心知识点是必不可少的。这不仅有助于优化性能和解决复杂问题,还能在面试中脱颖而出。本文将全面解析JVM的关键概念和技术细节,帮助读者全面提升技术水平。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  •     目标检测是计算机视觉一个非常重要的子任务。目标检测需要发现并准确定位自然图片中的物体。在2012年之前,目标检测主要基于手工设计的特征以及传统分类器。2012年以后,出现了 ... [详细]
  • 快速掌握Tomcat 8.5.40的配置与应用技巧 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
author-avatar
rain
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有