深入理解Spark ML:多项式朴素贝叶斯原理与源码分析
来源:互联网 发布:中国天网监控 知乎 编辑:程序博客网 时间:2024/06/05 13:32
http://blog.csdn.net/u011239443/article/details/76176743
朴素贝叶斯的基本原理与简单的python与scala的实现可以参阅:http://blog.csdn.net/u011239443/article/details/68061124
贝叶斯估计
如果一个给定的类和特征值在训练集中没有一起出现过,那么基于频率的估计下该概率将为0。这将是一个问题。因为与其他概率相乘时将会把其他概率的信息统统去除。所以常常要求要对每个小类样本的概率估计进行修正,以保证不会出现有为0的概率出现。常用到的平滑就是加1平滑(也称拉普拉斯平滑):
lambda>=0,等价于在随机变量各个取值的频数上赋予一个正数lambda>0。
同样的:
N为数据条数,K为label类别数。
多项式朴素贝叶斯
多项式朴素贝叶斯和上述贝叶斯模型不同的是,上述贝叶斯模型对于某特征的不同取值代表着不同的类别,而多项式朴素贝叶斯对于某特征的不同取值代表着该特征决定该label类别的重要程度。
比如一个文本中,单词Chinese
出现的频数,1次还是10次,并不代表着Chinese
单词这个特征的类别,而代表着Chinese
单词这个特征的决定该文本label类别的重要程度。
n为特征维度数
我们来举个例子:
我们设lambda为1,共有6个不同的单词,则特征维度数为6。
所以,我们将d5 分类到 yes
API 使用
下面是Spark 朴素贝叶斯的使用例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
源码分析
接下来我们来分析下源码~
NaiveBayes
train
NaiveBayes().fit
调用NaiveBayes
的父类Predictor
中的fit
,将label
和weight
转为Double
,保存label
和weight
原信息,最后调用NaiveBayes
的train
:
- 1
- 2
- 3
trainWithLabelCheck:
ml假设输入labels范围在[0, numClasses). 但是这个实现也被mllib NaiveBayes调用,它允许其他类型的输入labels如{-1, +1}. positiveLabel
用于确定label是否需要被检查。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
NaiveBayesModel
transform
model.transform
调用NaiveBayesModel
的父类ProbabilisticClassificationModel
中的transform
,根据表列配置,有选择的预测并添加以下三列:
- predicted labels:
Double
类型,预测的label - raw predictions:
Vector
类型,数字可为负数,数值越大,表示该类别越可行 - probability of each class:
Vector
类型,各类别的概率
这边我们就只分析predicted labels
流程:transform
最终会调用predict
:
- 1
- 2
- 3
predictRaw
其实就是在计算raw predictions
,而raw2prediction
正是在从中选取最可信的:
- 1
- 2
- 3
predictRaw
下面我们来看看NaiveBayesModel
的predictRaw
实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
multinomialCalculation:
- 深入理解Spark ML:多项式朴素贝叶斯原理与源码分析
- 深入理解Spark ML:多项式朴素贝叶斯原理与源码分析
- 深入理解Spark 2.1 Core (一):RDD的原理与源码分析
- 深入理解Spark 2.1 Core (二):DAG调度器的原理与源码分析
- 深入理解Spark 2.1 Core (三):任务调度器的原理与源码分析
- 深入理解Spark 2.1 Core (五):Standalone模式运行的原理与源码分析
- 深入理解Spark 2.1 Core (六):资源调度的原理与源码分析
- 深入理解Spark 2.1 Core (七):任务执行的原理与源码分析
- 深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析
- 深入理解Spark 2.1 Core (十一):Shuffle Reduce 端的原理与源码分析
- 深入理解Spark 2.1 Core (十二):TimSort 的原理与源码分析
- 深入理解Spark 2.1 Core (一):RDD的原理与源码分析
- 深入理解Spark 2.1 Core (二):DAG调度器的原理与源码分析
- 深入理解Spark 2.1 Core (三):任务调度器的原理与源码分析
- 深入理解Spark 2.1 Core (五):Standalone模式运行的原理与源码分析
- 深入理解Spark 2.1 Core (六):Standalone模式运行的原理与源码分析
- 深入理解Spark 2.1 Core (七):Standalone模式任务执行的原理与源码分析
- 深入理解Spark 2.1 Core (十):Shuffle Map 端的原理与源码分析
- jQuery noConflict()
- JUnit测试时,Mybatis报错:Manual close is not allowed over a Spring managed SqlSessio
- java文件读写常用操作
- 秋招开始
- PTA 7-2 家谱处理
- 深入理解Spark ML:多项式朴素贝叶斯原理与源码分析
- 《DOS命令一日通》第五章 文件复制与磁盘复制
- 活锁、死锁和饥饿
- js数组循环的一种算法
- apktool
- CSS3 Box-sizing属性以及解决兼容性的一些做法
- ajax与servlet之间的交互方式
- tensorflow tf.reduce_mean
- 常见问题