Spark MLlib NaiveBayes 贝叶斯分类器

1.1朴素贝叶斯公式

贝叶斯定理:

其中A为事件,B为类别,P(B|A)为事件A条件下属于B类别的概率。

朴素贝叶斯分类的正式定义如下:

1、设为一个待分类项,而每个a为x的一个特征属性。

2、有类别集合

3、计算

4、如果,则

那么现在的关键就是如何计算第3步中的各个条件概率:

1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

2、统计得到在各类别下各个特征属性的条件概率估计。即

3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

1.2 NaiveBayesModel
源码解析

1、NaiveBayesModel主要的三个变量:

1)labels:类别

scala> labels

res56: Array[Double] = Array(2.0, 0.0, 1.0)

2)pi:各个label的先验概率

scala> pi

res57: Array[Double] = Array(-1.1631508098056809, -0.9808292530117262, -1.1631508098056809)

3)theta:存储各个特征在各个类别中的条件概率。

scala> theta

res58: Array[Array[Double]] = Array(Array(-2.032921526044943, -1.8658674413817768, -0.33647223662121295), Array(-0.2451224580329847, -2.179982770901713, -2.26002547857525), Array(-1.9676501356917193, -0.28410425110389714,
-2.2300144001592104))

4)lambda:平滑因子

2、NaiveBayesModel代码

/**

* Run the algorithm with the configured parameters on an input RDD of LabeledPoint entries.

*

* @param data RDD of [[org.apache.spark.mllib.regression.LabeledPoint]].

*/

def run(data: RDD[LabeledPoint]) = {

// requireNonnegativeValues:取每一个样本数据的特征值,以向量形式存储,特征植必需为非负数。

val requireNonnegativeValues: Vector => Unit = (v: Vector) => {

val values = v
match {

case SparseVector(size, indices, values) =>

values

case DenseVector(values) =>

values

}

if (!values.forall(_ >=
0.0)) {

thrownew SparkException(s"Naive Bayes requires nonnegative feature values but found $v.")

}

}

// Aggregates term frequencies per label.

// TODO: Calling combineByKey and collect creates two stages, we can implement something

// TODO: similar to reduceByKeyLocally to save one stage.

// aggregated:对所有样本数据进行聚合,以label为key,聚合同一个label的features;

// createCombiner:完成样本从V到C的combine转换,(v:
Vector) –> (c: (Long, BDV[Double])

// mergeValue:将下一个样本中Value合并为操作后的C类型数据,(c:
(Long, BDV[Double]), v: Vector) –> (c: (Long, BDV[Double]);

// mergeCombiners:根据每个Key所对应的多个C,进行归并,(c1:
(Long, BDV[Double]), c2: (Long, BDV[Double])) –> (c: (Long, BDV[Double]);

val aggregated = data.map(p => (p.label, p.features)).combineByKey[(Long, BDV[Double])](

createCombiner = (v: Vector) => {

requireNonnegativeValues(v)

(1L, v.toBreeze.toDenseVector)

},

mergeValue = (c: (Long, BDV[Double]), v: Vector) => {

requireNonnegativeValues(v)

(c._1 + 1L, c._2 += v.toBreeze)

},

mergeCombiners = (c1: (Long, BDV[Double]), c2: (Long, BDV[Double])) =>

(c1._1 + c2._1, c1._2 += c2._2)

).collect()

val numLabels = aggregated.length

var numDocuments =
0L

aggregated.foreach { case (_, (n, _)) =>

numDocuments += n

}

val numFeatures = aggregated.head
match {
case (_, (_, v)) => v.size }

val labels =
new Array[Double](numLabels)

val pi =
new Array[Double](numLabels)

val theta = Array.fill(numLabels)(new Array[Double](numFeatures))

val piLogDenom = math.log(numDocuments + numLabels * lambda)

var i =
0

// labels:存储类别

// pi:计算每个类别的概率

// theta:计算在该类别下每个特征的概率

aggregated.foreach { case (label, (n, sumTermFreqs)) =>

labels(i) = label

val thetaLogDenom = math.log(brzSum(sumTermFreqs) + numFeatures * lambda)

pi(i) = math.log(n + lambda) - piLogDenom

var j =
0

while (j < numFeatures) {

theta(i)(j) = math.log(sumTermFreqs(j) + lambda) - thetaLogDenom

j += 1

}

i += 1

}

//
返回模型

new NaiveBayesModel(labels, pi, theta)

}

1.3 NaiveBayesModel
实例

1、数据

数据格式为:类别, 特征1 特征2 特征3

0,1 0 0

0,2 0 0

0,1 0 0.1

0,2 0 0.2

0,1 0.1 0

0,2 0.2 0

1,0 1 0.1

1,0 2 0.2

1,0.1 1 0

1,0.2 2 0

1,0 1 0

1,0 2 0

2,0.1 0 1

2,0.2 0 2

2,0 0.1 1

2,0 0.2 2

2,0 0 1

2,0 0 2

2、代码

//数据路径

valdata_path =
"user/tmp/sample_naive_bayes_data.txt"

//读取数据,转换成LabeledPoint类型

valexamples =
sc.textFile(data_path).map { line =>

valitems =
line.split(‘,‘)

vallabel =
items(0).toDouble

valvalue =
items(1).split(‘ ‘).toArray.map(f
=> f.toDouble)

LabeledPoint(label, Vectors.dense(value))

}

examples.cache()

//样本划分,80%训练,20%测试

valsplits =
examples.randomSplit(Array(0.8,
0.2))

valtraining =
splits(0)

valtest =
splits(1)

valnumTraining =
training.count()

valnumTest =
test.count()

println(s"numTraining = $numTraining, numTest = $numTest.")

//样本训练,生成分类模型

valmodel =
new NaiveBayes().setLambda(1.0).run(training)

//根据分类模型,对测试数据进行测试,计算测试数据的正常率

valprediction =
model.predict(test.map(_.features))

valpredictionAndLabel =
prediction.zip(test.map(_.label))

valaccuracy =
predictionAndLabel.filter(x => x._1 == x._2).count().toDouble
/ numTest

println(s"Test accuracy = $accuracy.")

时间: 2024-08-30 16:51:07

Spark MLlib NaiveBayes 贝叶斯分类器的相关文章

机器学习之贝叶斯分类器

贝叶斯分类器(Bayesian decision theory) 贝叶斯决策论是概率框架下实施决策的基本方法,通过相关概率预先已知的情况下对误判损失来选择最优的类别分类. 将标记为cj的样本误分类成ci产生的期望损失,即样本上的“条件风险”为 贝叶斯分类的最基本的思想是:为了最小化总体风险,只需在每个样本上选择能够使条件风险R(c|x)最小的类别标记. 要想用贝叶斯判定准则来最小化决策风险,首先要获得后验概率P(c|x),机器学习则是基于有限的训练样本集尽可能准确的估计出后验概率P(c|x).通

贝叶斯分类器

贝叶斯分类是统计学的一个分类方法,基于贝叶斯定理.首先贝叶斯分类的一个核心假设是一个属性值对给定类的影响独立于其他属性的值(类条件独立). 先来看下条件概率: 设A.B是两个事件,且P(B)>0,则称 为在事件B发生的条件下,事件A的条件概率. 再来看一下贝叶斯定理:. 其中: X 是类标识未知的数据样本(或数据元组) 如:35岁收入$4000的顾客 H 是数据样本X属于某特定类C的某种假定. 如:假设顾客将购买计算机 P(H/X):条件X下H的后验概率 如:知道顾客年龄与收入时,顾客将购买计算

神经网络与机器学习笔记——贝叶斯分类器

高斯环境下贝叶斯分类器退化为线性分类器,与感知器形式一样,但是感知器的线性特性并不是由于高斯假设而引起的. 贝叶斯分类器: 高斯分布下的贝叶斯分类器 更多关于神经网络笔记见我的专栏:神经网络与机器学习笔记

MATLAB实现贝叶斯分类器

贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类.也就是说,贝叶斯分类器是最小错误率意义上的优化,它遵循"多数占优"这一基本原则. 一.分类器的基本概念 经过了一个阶段的模式识别学习,对于模式和模式类的概念有一个基本的了解,并尝试使用MATLAB实现一些模式类的生成.而接下来如何对这些模式进行分类成为了学习的第二个重点.这就需要用到分类器. 表述模式分类器的方式有很多种,其中用的最多的是一

机器学习系列-朴素贝叶斯分类器

贝叶斯分类器 什么是贝叶斯分类器 贝叶斯分类器是一类分类器的总称,这些分类器均以贝叶斯定理为基础,故统称为贝叶斯分类器.这些分类器中最简单的是朴素贝叶斯分类器,它几乎完全按照贝叶斯定理进行分类,因此我们从朴素贝叶斯分类器说起. 贝叶斯定理: 贝叶斯定理是概率论中一个比较重要的定理,在讲解贝叶斯定理之前,首先回顾一下贝叶斯定理的基础:条件概率和全概率公式. 条件概率:设\(A,B\)是两个事件,且\(P(A)>0\),称 \[P(B|A)=\frac{P(AB)}{P(A)}\] 为在事件\(A\

数据挖掘-贝叶斯分类器

数据挖掘-贝叶斯分类 目录 数据挖掘-贝叶斯分类 1. 贝叶斯分类器概述 1.1 贝叶斯分类器简介 1.1.1 什么是贝叶斯分类器? 1.1.2 朴素贝叶斯分类器 2. 数学基础 2.1 概率论 2.1.1 概率 2.1.2 贝叶斯理论 3. 贝叶斯决策论 3.1 贝叶斯决策 3.1.1 贝叶斯决策介绍 3.2 基于最小错误率的贝叶斯决策 3.2.1 什么时候会分错类? 3.2.2 基于最小错误率的贝叶斯分类器 3.2.3 基于最小错误率的贝叶斯决策的证明 3.2.4 分类决策边界 3.2 基于

模式识别(七):MATLAB实现朴素贝叶斯分类器

本系列文章由云端暮雪编辑,转载请注明出处 http://blog.csdn.net/lyunduanmuxue/article/details/20068781 多谢合作! 今天介绍一种简单高效的分类器--朴素贝叶斯分类器(Naive Bayes Classifier). 相信学过概率论的同学对贝叶斯这个名字应该不会感到陌生,因为在概率论中有一条重要的公式,就是以贝叶斯命名的,这就是"贝叶斯公式": 贝叶斯分类器就是基于这条公式发展起来的,之所以这里还加上了朴素二字,是因为该分类器对各

机器学习第5周--炼数成金-----线性分类器,Knn算法,朴素贝叶斯分类器,文本挖掘

分类:分类的意义 传统意义下的分类:生物物种预测:天气预报决策:yes or no分类的传统模型分类(判别分析)与聚类有什么差别?有监督学习,无监督学习,半监督学习 常见分类模型与算法 线性判别法距离判别法贝叶斯分类器决策树支持向量机(SVM)神经网络 文本挖掘典型场景 网页自动分类垃圾邮件判断评论自动分析通过用户访问内容判别用户喜好 网页自动分类 自动化门户系统(百度新闻,谷歌新闻等)搜索引擎根据用户标签类型推送不同类别的搜索结果 距离判别法 原理:计算待测点与各类的距离,取最短者为其所属分类

机器学习算法面试—口述(3):贝叶斯分类器

这个系列是为了应对找工作面试时面试官问的算法问题,所以只是也谢算法的简要介绍,后期会陆续补充关于此算法的常见面试的问题! 贝叶斯分类器的原理其实很简单,知道了贝叶斯公式基本上就知道了贝叶斯分类器的工作原理.对于一个待分类项,求出此项出现的条件下哪个类别的概率大,就判定为哪类,仅次而已.其实贝叶斯分类器是建立在错误的理论上建立起来的分类器,没错就是错误的理论,它假定事物之间是没有联系的(马克思告诉我们,这是不可能的...),从而大大的简化了计算. 算法的过程如下: 首先核心的是贝叶斯公式:P(B