目录
一、算法实例KNN
二、算法实例NaiveBayes
1、算法简介
2、朴素贝叶斯的原理及理解
3、算法计算示例
1)、问题分析
2)、计算过程
4、算法实战:Bayes评论语义分类
1)、语义情感分析算法Bayes
2)、朴素Bayes算法工程实践
a)、语义情感分析算法Bayes
b)、朴素Bayes算法工程实践
三、算法实例LogisticRegression
1、算法模型
2、极大似然估计
多易教育,专注大数据培训; 课程引领市场,就业乘风破浪
多易教育官网地址
https://www.51doit.cn
多易教育在线学习平台
https://v.51doit.cn
一、算法实例KNN
《详见项目代码》
二、算法实例NaiveBayes
1、算法简介
朴素贝叶斯算法常用于分类与预测的问题,
比如给一个1000本书进行分类,可以分为文学类,管理类,技术类,教育类等等,
比如,预测一株很美的植物,在不同的地理环境,如吉林,北京,广州,深圳,大理,不同的地点,在不同的日照和阳光强度下,这株植物会生存下来吗?
比如,邮箱中每天收到大量的邮件,如何预测哪些邮件是垃圾邮件?
比如,一个电商网站,有大量的客户对店家或商品的评价,如何预测是好评还是中评、差评
类似这些问题,都是分类预测问题,而且是概率预测问题。
2、朴素贝叶斯的原理及理解
学习贝叶斯之前,我们了解下条件概率的概念
条件概率:
事件A发生的概率 P(A)
事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为P(A|B),读作“在B条件下A的概率”,看下下边的这张图(网上找来的^ - ^):
根据文氏图,可以很清楚地看到在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。
P(A|B)=P(A∩B)/P(B)
因此,P(A∩B)=P(A|B)P(B)
所以,P(A|B)P(B)=P(B|A)P(A)
即:P(A|B)=P(B|A)P(A)/P(B) — — — 公式(一)
没错,公式(一):P(A|B)=P(B|A)P(A)/P(B) 就是贝叶斯定理
贝叶斯定理的意义: 如果求 P( A | B) 不好直接计算,则可以通过贝叶斯定理转换成计算P( B | A)
求一个事物属于那种类别的概率不好求,转而通过求 类别样本中该事物各特征出现的概率
3、算法计算示例
1)、问题分析
下面有一组衣服的历史销售记录数据,我们来预测下,随机到来的一位顾客可能更喜欢哪个类型的衣服
预测的本质为,求 P(购买 | (连衣裙-1)) ==》P( 购买 | (ONLY,蓝色,纯棉,透气) )
此概率在此场景中可以称之为 “后验概率”,此概率极其不好计算或预测,除非你拥有专门针对这款裙子在上百人中买或不买的历史数据
也就是说,该概率的结果值,只有把这款裙子摆在大量顾客前,统计他们买的情况,才知道!
然后,仔细考察上面的数据,发现,这一堆数据是多款裙子针对多个“随机顾客”所留下的记录样本,如果在这个样本空间中,求某款裙子可能被购买的概率,则好算,因为这些事情已经是发生过了,那么求出来的概率叫做“先验概率”
问题就变成, “后验概率” 如何通过“先验概率”来提前预知!
这就能借助到贝叶斯条件概率公式了:
P( 购买 | (ONLY,蓝色,纯棉,透气) )
=> P(ONLY,蓝色,纯棉,透气 | 购买)P(购买) / P(ONLY,蓝色,纯棉,透气)
而这个转换后的算式,其中的每一个元素都能通过先验样本数据计算出来
2)、计算过程
A1代表事件:购买
A2代表事件:不购买
首先,先来计算下历史数据中顾客购买与不购买的概率:
购买的衣服总数为6,衣服的总数为10,那么顾客购买衣服的概率为:
P(A1) = 6/10.0
不购买衣服的总数为4,衣服的总数为10,那么顾客不购买衣服的概率为:
P(A2) = 4/10.0 或 P(A2) = 1 - P(A1) = 1 - (6/10.0)
下面分别来计算下,在顾客购买的情况下,各类情况下的概率:
顾客购买,品牌为ONLY的条件概率:
购买的衣服中,为ONLY的个数为2,购买衣服的总数为6,衣服的总数为10,则品牌为ONLY顾客购买的条件概率为:
P(B1|A1) = 2 / 6.0
在总样本中,衣服为ONLY概率为:
P(B1) = 5 / 10.0
同理可以计算出:
品牌为森马,顾客购买的条件概率为:
P(B2|A1) = 4 / 6.0
在总样本中,衣服为森马的概率为:
P(B2) = 5 / 10.0
颜色为蓝色,顾客购买的条件概率为:
P(C1|A1) = 5 / 6.0
在总样本中,衣服为蓝色的概率为:
P(C1) = 5 / 10.0
顾客购买时,衣服为粉色的条件概率:
P(C2|A1) = 1 / 6.0
在总样本中,衣服为粉色的概率:
P(C2) = 5 / 10.0
顾客购买时,衣服的材质为纯棉的条件概率:
P(D1|A1) = 4 / 6.0
在总样本中,衣服为纯棉材质的概率:
P(D1) = 5 / 10.0
顾客购买时,衣服的材质为竹纤维的条件概率:
P(D2|A1) = 1 / 6.0
在总样本中,衣服为竹纤维材质的概率:
P(D2) = 5 / 10.0
现在应用贝叶斯定理,来做一个小小的预测:
顾客更喜欢购买下面哪一个产品:品牌为:ONLY、颜色为:蓝色、材质为:纯棉 与 品牌为:森马、颜色为:蓝色、材质为:竹纤维,哪一个产品?
我们计算下
P(A1|ONLY、蓝色、纯棉)
= ((P(B1|A1) * P(C1|A1) * P(D1|A1) )* P(A1) ) /( P(B1) * P(C1) * P(D1) )
=[ ((2/6.0)* (5/6.0)* (4/6.0)) * (6/10.0)] / [(5 / 10.0) * (5 / 10.0) * (5 / 10.0)]
P(A1|森马、蓝色、竹纤维)
= ( P(B2|A1) * P(C1|A1) * P(D2|A1))* P(A1) ) /( P(B2) * P(C1) * P(D2) )
= [ ((4 / 6.0)* (5/6.0)* (1 / 6.0)) * (6/10.0)] / [(5 / 10.0) * (5 / 10.0) * (5 / 10.0)]
我们来比较下两种商品购买的概率:
[ ((2/6.0)* (5/6.0)* (4/6.0)) * (6/10.0)] / [(5 / 10.0) * (5 / 10.0) * (5 / 10.0)]
[ ((4 / 6.0)* (5/6.0)* (1/ 6.0)) * (6/10.0)] / [(5 / 10.0) * (5 / 10.0) * (5 / 10.0)]
分母相同,分子偏大的结果更大,那么后者更大,所以我们推断,在纯棉蓝色ONLY家的连衣裙比竹纤维蓝色森马家的连衣裙更受顾客青睐,顾客购买前者的概率更大
细心的同学可能会发现,顾客不太喜欢竹纤维材质的连衣裙,因为影响分母结果的是这一项。
感兴趣的同学,可以计算下,其它的几类情况,比如:竹纤维蓝色ONLY,竹纤维粉色森马,然后比较所有情况的概率,就可以预测出顾客最喜欢哪种产品
4、算法实战:Bayes评论语义分类
1)、语义情感分析算法Bayes
先验样本数据:
0,a c c d e e e b u r
0,a c c e e d f p
1,b b r r u u f d
1,b b p r u u e c
-- 训练贝叶斯模型
p(a|0) =
p(c|0)=
p(d|0)=
p(e|0)=
p(b|0)=
p(f|0)=
p(b|1)=
.....
朴素贝叶斯来计算下面这篇文档该分到哪一类
?,b p r r c u
朴素贝叶斯计算过程:
P(0|b p r r c u) = P(b p r r c u | 0)*P(0)/P(b p r r c u )
=P(b|0)*P(p|0)*P(r|0)*P(c|0)*P(u|0) P*(0) / P(b)*P(p)*P(r)*P(c)*P(u)
=1/18 * 1/18 * 1/18 * 4/18 * 1/18 * 1/2 / 分母
P(1|b p r r c u)
=P(b|1)*P(p|1)*P(r|1)*P(c|1)*P(u|1) P*(1) /P(b)*P(p)*P(r)*P(c)*P(u)
=4/16 * 1/16 *3/16 * 1/16 * 4/16 * 1/2 / 分母
朴素贝叶斯意义:
求满足某特征组合条件下的,是某类事物的概率,通过样本不好统计
转而求 :在某类事物中,满足这些特征的物品占比有多大
2)、朴素Bayes算法工程实践
a)、文本语义分析特征工程
现有样本数据:
docid,label,doc
doc0,1,苹果 官网 苹果 宣布 骁龙 安卓
doc1,0,苹果 梨 香蕉 桔子 肥料 甜度
doc2,0,苹果 梨 桔子 保鲜 甜度
doc3,1,苹果 科技 手机 官网 宣布 安卓 骁龙
要应用mllib中的bayes算法模型,需要将样本文档向量化,而一旦向量化,文档中的每一个词应该由一个“数字”来表示,我们所用的方案为:
①.第一点,我们的向量应该是统一长度的,而文章的词数有多有少,就产生了矛盾,解决办法是:
把向量长度定得比任何一篇文档中的词的个数大得多的多!(假设长度为40)
doc0,1,苹果 官网 苹果 宣布 骁龙 安卓
②.提取词的特征,并向量化
将这篇文档中的每一个词,求它的hashcode % 向量长度,那么这个结果值就约束了这个词在向量中位置!
假设 : 苹果.hashcode % 40 = 3
再求苹果这个词在doc0中的tf-idf值作为这个词的特征值
补充:TF-IDF:
TF词频 = 该篇文档中该词出现的频次;
IDF:逆文档频率 = Lg(文档总篇数/(1+出现这个词的文档篇数))
得到的结果一定是个稀疏向量:
2.5 | 6.5 | 6.7 | 6.1 | 7.2 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
苹 | 宣 | 官 | 骁 | 安 | |||||||||||||||
果 | 布 | 网 | 龙 | 安 |
b)、文本语义分类模型训练实现
/**
* @date: 2019/8/13
* @site: www.doitedu.cn
* @author: hunter.d 涛哥
* @qq: 657270652
* @description: 评论样本数据bayes分类模型训练
*/
object BayesModelTrainer {
def main(args: Array[String]): Unit = {
val spark = SparkUtil.getSparkSession(this.getClass.getSimpleName)
import spark.implicits._
val poor = spark.read.textFile("G:\\testdata\\comment\\poor")
.rdd
.map(line => {
import scala.collection.JavaConversions._
val words: Array[String] = HanLP.segment(line).map(term => term.word).toArray
(0d, words)
}).toDF("label","words")
val general = spark.read.textFile("G:\\testdata\\comment\\general")
.rdd
.map(line => {
import scala.collection.JavaConversions._
val words: Array[String] = HanLP.segment(line).map(term => term.word).toArray
(1d, words)
}).toDF("label","words")
val good = spark.read.textFile("G:\\testdata\\comment\\good")
.rdd
.map(line => {
import scala.collection.JavaConversions._
val words: Array[String] = HanLP.segment(line).map(term => term.word).toArray
(2d, words)
}).toDF("label","words")
val sample = poor.union(general).union(good)
// 提取特征,向量化
val hashingTF = new HashingTF().setNumFeatures(1000000).setInputCol("words").setOutputCol("tfvec")
val tf = hashingTF.transform(sample)
val idf = new IDF().setInputCol("tfvec").setOutputCol("tfidfvec")
val idfDF = idf.fit(tf).transform(tf).drop("words","tfvec")
// 训练模型
val naiveBayes = new NaiveBayes()
.setSmoothing(0.01)
.setLabelCol("label")
.setFeaturesCol("tfidfvec")
val model = naiveBayes.fit(idfDF)
// 保存模型
model.save("recommend_sys/data/bayes/model")
spark.close()
}
}
三、算法实例LogisticRegression
分类算法
分类预测的结果还拥有一定的概率含义!
生产中使用非常频繁!
1、算法模型
在介绍Logistic Regression之前我们先简单说一下线性回归,,线性回归的主要思想就是通过历史数据拟合出一条直线,用这条直线对新的数据进行预测。
我们知道,线性回归的公式如下:
z=θ0+θ1x1+θ2x2+θ3x3…+θnxn=θTx
z=θ0+θ1x1+θ2x2+θ3x3…+θnxn=θTx
而对于Logistic Regression来说,其思想也是基于线性回归(Logistic Regression属于广义线性回归模型)。其公式如下:
hθ(x)=11+e−z=11+e−θTx
hθ(x)=11+e−z=11+e−θTx
其中,
y=11+e−x
y=11+e−x
被称作sigmoid函数,我们可以看到,Logistic Regression算法是将线性函数的结果映射到了sigmoid函数中。
sigmoid的函数图形如下:
我们可以看到,sigmoid的函数输出是介于(0,1)之间的,中间值是0.5,于是之前的公式 hθ(x)hθ(x) 的含义就很好理解了,因为 hθ(x)hθ(x) 输出是介于(0,1)之间,也就表明了数据属于某一类别的概率,例如 :
hθ(x)hθ(x)<0.5 则说明当前数据属于A类;
hθ(x)hθ(x)>0.5 则说明当前数据属于B类。
所以我们可以将sigmoid函数看成样本数据的概率密度函数。
有了上面的公式,我们接下来需要做的就是怎样去估计参数 θθ 了。
首先我们来看, θ函数的值有特殊的含义,它表示 hθ(x)hθ(x) 结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
P(y=1|x;θ)=hθ(x)
P(y=1|x;θ)=hθ(x)
P(y=0|x;θ)=1−hθ(x)
P(y=0|x;θ)=1−hθ(x)
2、极大似然估计
根据上式,接下来我们可以使用概率论中极大似然估计的方法去求解损失函数,首先得到概率函数为:
P(y|x;θ)=(hθ(x))y∗(1−hθ(x))1−y
P(y|x;θ)=(hθ(x))y∗(1−hθ(x))1−y
因为样本数据(m个)独立,所以它们的联合分布可以表示为各边际分布的乘积,取似然函数为:
L(θ)=∏i=1mP(y(i)|x(i);θ)
L(θ)=∏i=1mP(y(i)|x(i);θ)
L(θ)=∏i=1m(hθ(x(i)))y(i)∗(1−hθ(x(i)))1−y(i)
L(θ)=∏i=1m(hθ(x(i)))y(i)∗(1−hθ(x(i)))1−y(i)
取对数似然函数:
l(θ)=log(L(θ))=∑i=1mlog((hθ(x(i)))y(i))+log((1−hθ(x(i)))1−y(i))
l(θ)=log(L(θ))=∑i=1mlog((hθ(x(i)))y(i))+log((1−hθ(x(i)))1−y(i))
l(θ)=log(L(θ))=∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
l(θ)=log(L(θ))=∑i=1my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))
最大似然估计就是要求得使 l(θ)取最大值时的θ ,这里可以使用梯度上升法求解。我们稍微变换一下:
J(θ)=−1ml(θ)
J(θ)=−1ml(θ)
因为乘了一个负的系数−1m−1m,然后就可以使用梯度下降算法进行参数求解了
多易教育,专注大数据培训; 课程引领市场,就业乘风破浪
多易教育官网地址
https://www.51doit.cn
多易教育在线学习平台
https://v.51doit.cn