《机器学习实战(Scala实现)》(四)——朴素贝叶斯

2024-06-02 04:48

本文主要是介绍《机器学习实战(Scala实现)》(四)——朴素贝叶斯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理

关于算法原理可以参阅:http://blog.csdn.net/u011239443/article/details/53735609#t35

构建词向量

python

def loadDataSet():postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],['stop', 'posting', 'stupid', 'worthless', 'garbage'],['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]# 1 代表侮辱性的词 0则不是classVec = [0,1,0,1,0,1]    return postingList,classVecdef createVocabList(dataSet):# 创建空集合vocabSet = set([])  for document in dataSet:# 合并两个集合vocabSet = vocabSet | set(document) return list(vocabSet)def setOfWords2Vec(vocabList, inputSet):returnVec = [0]*len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] = 1else: print "the word: %s is not in my Vocabulary!" % wordreturn returnVec

训练与测试算法

python

训练算法

def trainNB0(trainMatrix,trainCategory):numTrainDocs = len(trainMatrix)numWords = len(trainMatrix[0])pAbusive = sum(trainCategory)/float(numTrainDocs)p0Num = ones(numWords); p1Num = ones(numWords)      p0Denom = 2.0; p1Denom = 2.0                        for i in range(numTrainDocs):if trainCategory[i] == 1:p1Num += trainMatrix[i]p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])p1Vect = log(p1Num/p1Denom)          p0Vect = log(p0Num/p0Denom)          return p0Vect,p1Vect,pAbusive
  • 这里的pAbusive其实应该计算的是各个类别的概率。但是我们这里是类别只有 0 和 1 的二分类,所以只要返回一个类别为 1 的概率给后续程序就行了。
  • p0Num = ones(numWords); p1Num = ones(numWords)p0Denom = 2.0; p1Denom = 2.0是为了避免后续计算log中的指和分母值取到0
  • p1Num/p1Denom得到向量第i个特征即 p(wi/c1) ,而 log(p(w/c1))=log(p(w1/c1))+log(p(w2/c1))+...+log(p(wn/c1)) 。所以我们只需要将该向量中的每个特征取对数,再累加就能得到 log(p(w/c1))

测试算法

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):p1 = sum(vec2Classify * p1Vec) + log(pClass1)    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)if p1 > p0:return 1else: return 0def testingNB():listOPosts,listClasses = loadDataSet()myVocabList = createVocabList(listOPosts)trainMat=[]for postinDoc in listOPosts:trainMat.append(setOfWords2Vec(myVocabList, postinDoc))p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))testEntry = ['love', 'my', 'dalmation']thisDoc = array(setOfWords2Vec(myVocabList, testEntry))print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)testEntry = ['stupid', 'garbage']thisDoc = array(setOfWords2Vec(myVocabList, testEntry))print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)

由于 p(w) 是相同的,所以我们只需要比较 p(w/c0)p(c0) p(w/c1)p(c1) 的大小,即 log(p(w/c0)p(c0)) log(p(w/c1)p(c1)) 的大小。如: log(p(w/c0)p(c0))=log(p(w/c0))+log(p(c0))= sum(vec2Classify * p0Vec) + log(1.0 - pClass1)

scala

package NativeBayesimport scala.collection.mutable.ArrayBufferobject NativeBayes {def loadDataSet() = {val postingList = Array(Array("my", "dog", "has", "flea", "problems", "help", "please"),Array("maybe", "not", "take", "him", "to", "dog", "park", "stupid"),Array("my", "dalmation", "is", "so", "cute", "I", "love", "him"),Array("stop", "posting", "stupid", "worthless", "garbage"),Array("mr", "licks", "ate", "my", "steak", "how", "to", "stop", "him"),Array("quit", "buying", "worthless", "dog", "food", "stupid"))//1 代表不良信息, 反之为 0 val classVec = Array(0, 1, 0, 1, 0, 1)(postingList, classVec)}def setOfWords2Vec(vocabList: Array[String], inputSet: Array[String]) = {val returnVec = new Array[Int](vocabList.length)val vocabListWithIndex = vocabList.zipWithIndexfor (word <- inputSet) {if (vocabList.contains(word))returnVec(vocabListWithIndex.filter(_._1 == word)(0)._2) = 1else printf("the word: %s is not in my Vocabulary!\n", word)}returnVec}def trainNB0(trainMatrix: Array[Array[Int]], trainCategory: Array[Int]) = {val numTrainDocs = trainMatrix.lengthval numWords = trainMatrix(0).lengthval pAbusive = trainCategory.sum / numTrainDocs.toDoublevar p0Num = Array.fill(numWords)(1)var p1Num = Array.fill(numWords)(1)var p0Denom = 2.0var p1Denom = 2.0for (i <- 0 to numTrainDocs - 1) {if (trainCategory(i) == 1) {var cnt = 0p1Num = p1Num.map { x =>val v = x + trainMatrix(i)(cnt)cnt += 1v}p1Denom += trainMatrix(i).sum} else {var cnt = 0p0Num = p0Num.map { x =>val v = x + trainMatrix(i)(cnt)cnt += 1v}p0Denom += trainMatrix(i).sum}}(p1Num.map(x => math.log(x / p1Denom)), p0Num.map(x => Math.log(x / p0Denom)), pAbusive)}def classifyNB(vec2Classify: Array[Int], p0Vec: Array[Double], p1Vec: Array[Double], pClass1: Double) = {var cnt = 0val p1 = vec2Classify.map { x =>val v = x * p1Vec(cnt)cnt += 1v}.sum + math.log(pClass1)cnt = 0val p0 = vec2Classify.map { x =>val v = x * p0Vec(cnt)cnt += 1v}.sum + math.log(1.0 - pClass1)if (p1 > p0) 1 else 0}def main(args: Array[String]): Unit = {val DataSet = loadDataSet()val listOPosts = DataSet._1val listClasses = DataSet._2val myVocabList = listOPosts.reduce((a1, a2) => a1.++:(a2)).distinctvar trainMat = new ArrayBuffer[Array[Int]](listOPosts.length)listOPosts.foreach(postinDoc => trainMat.append(setOfWords2Vec(myVocabList, postinDoc)))val p = trainNB0(trainMat.toArray, listClasses)val p0V = p._2val p1V = p._1val pAb = p._3val testEntry = Array("love", "my", "dalmation")val thisDoc = setOfWords2Vec(myVocabList, testEntry)println(testEntry.mkString(",") + " classified as: " + classifyNB(thisDoc, p0V, p1V, pAb))val testEntry2 = Array("stupid", "garbage")val thisDoc2 = setOfWords2Vec(myVocabList, testEntry2)println(testEntry2.mkString(",") + " classified as: " + classifyNB(thisDoc2, p0V, p1V, pAb))}
}

这里写图片描述

这篇关于《机器学习实战(Scala实现)》(四)——朴素贝叶斯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023069

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为