朴素贝叶斯python代码实现_第1页
朴素贝叶斯python代码实现_第2页
朴素贝叶斯python代码实现_第3页
朴素贝叶斯python代码实现_第4页
朴素贝叶斯python代码实现_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

朴素贝叶斯优点:在数据较少的状况下仍然有效,能够解决多类别问题缺点:对于输入数据的准备方式较为敏感合用数据类型:标称型数据贝叶斯准则:使用朴素贝叶斯进行文档分类朴素贝叶斯的普通过程(1)收集数据:能够使用任何办法。本文使用RSS源(2)准备数据:需要数值型或者布尔型数据(3)分析数据:有大量特性时,绘制特性作用不大,此时使用直方图效果更加好(4)训练算法:计算不同的独立特性的条件概率(5)测试算法:计算错误率(6)使用算法:一种常见的朴素贝叶斯应用是文档分类。能够在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。准备数据:从文本中构建词向量摘自机器学习实战。[['my','dog','has','flea','problems','help','please'],0['maybe','not','take','him','to','dog','park','stupid'],1['my','dalmation','is','so','cute','I','love','him'],0['stop','posting','stupid','worthless','garbage'],1['mr','licks','ate','my','steak','how','to','stop','him'],0['quit','buying','worthless','dog','food','stupid']]1以上是六句话,标记是0句子的表达正常句,标记是1句子的表达为粗口。我们通过分析每个句子中的每个词,在粗口句或是正常句出现的概率,能够找出那些词是粗口。在bayes.py文献中添加以下代码:[python]

\o"viewplain"viewplain\o"copy"copy#

coding=utf-8

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']]

classVec

=

[0,

1,

0,

1,

0,

1]

#

1代表侮辱性文字,0代表正常言论

return

postingList,

classVec

def

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)]

=

1

else:

print

"the

word:

%s

is

not

in

my

Vocabulary!"

%

word

return

returnVec

运行成果:训练算法:从词向量计算概率[python]

\o"viewplain"viewplain\o"copy"copy#

朴素贝叶斯分类器训练函数

#

trainMatrix:

文档矩阵,

trainCategory:

由每篇文档类别标签所构成的向量

def

trainNB0(trainMatrix,

trainCategory):

numTrainDocs

=

len(trainMatrix)

numWords

=

len(trainMatrix[0])

pAbusive

=

sum(trainCategory)

/

float(numTrainDocs)

p0Num

=

zeros(numWords);

p1Num

=

zeros(numWords);

p0Denom

=

0.0;

p1Denom

=

0.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

=

p1Num

/

p1Denom

p0Vect

=

p0Num

/

p1Denom

return

p0Vect,

p1Vect,

pAbusive

运行成果:测试算法:根据现状修改分类器上一节中的trainNB0函数中修改几处:p0Num

=

ones(numWords);p1Num

=

ones(numWords);p0Denom

=

2.0;p1Denom

=

2.0;p1Vect

=

log(p1Num

/

p1Denom)p0Vect

=

log(p0Num

/

p1Denom)[python]

\o"viewplain"viewplain\o"copy"copy#

朴素贝叶斯分类器训练函数

#

trainMatrix:

文档矩阵,

trainCategory:

由每篇文档类别标签所构成的向量

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

/

p1Denom)

return

p0Vect,

p1Vect,

pAbusive

#

朴素贝叶斯分类函数

def

classifyNB(vec2Classify,

p0Vec,

p1Vec,

pClass1):

p1

=

sum(vec2Classify

*

p1Vec)

+

log(pClass1)

p0

=

sum(vec2Classify

*

p0Vec)

+

log(1.0

-

pClass1)

if

p1

>

p0:

return

1

else:

return

0

def

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)

运行成果:准备数据:文档词袋模型词集模型(set-of-words

model):每个词与否出现,每个词只能出现一次词袋模型(bag-of-words

model):一种词能够出现不止一次[python]

\o"viewplain"viewplain\o"copy"copy#

朴素贝叶斯词袋模型

def

bagOfWords2VecMN(vocabList,

inputSet):

returnVec

=

[0]

*

len(vocabList)

for

word

in

inputSet:

if

word

in

vocabList:

returnVec[vocabList.index(word)]

+=

1

return

returnVec

示例:使用朴素贝叶斯过滤垃圾邮件(1)收集数据:提供文本文献(2)准备数据:将文本文献解析成词条向量(3)分析数据:检查词条确保解析的对的性(4)训练算法:使用我们之前建立的trainNB0()函数(5)测试算法:使用classifyNB(),并且构建一种新的测试函数来计算文档集的错误率(6)使用算法:构建一种完整的程序对一组文档进行分类,将错分的文档输出到屏幕上准备数据:切分文本使用正则体现式切分句子测试算法:使用朴素贝叶斯进行交叉验证[python]

\o"viewplain"viewplain\o"copy"copy#

该函数接受一种大写字符的字串,将其解析为字符串列表

#

该函数去掉少于两个字符的字符串,并将全部字符串转换为小写

def

textParse(bigString):

import

re

listOfTokens

=

re.split(r'\W*',

bigString)

return

[tok.lower()

for

tok

in

listOfTokens

if

len(tok)

>

2]

#

完整的垃圾邮件测试函数

def

spamTest():

docList

=

[]

classList

=

[]

fullText

=

[]

#

导入并解析文本文献

for

i

in

range(1,

26):

wordList

=

textParse(open('email/spam/%d.txt'

%

i).read())

docList.append(wordList)

fullText.extend(wordList)

classList.append(1)

wordList

=

textParse(open('email/ham/%d.txt'

%

i).read())

docList.append(wordList)

fullText.extend(wordList)

classList.append(0)

vocabList

=

createVocabList(docList)

trainingSet

=

range(50)

testSet

=

[]

#

随机构建训练集

for

i

in

range(10):

randIndex

=

int(random.uniform(0,

len(trainingSet)))

testSet.append(trainingSet[randIndex])

del(trainingSet[randIndex

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论