机器学习实战 ---- 朴素贝叶斯

一、贝叶斯的数学知识:

如图所示,有三个罐子,1号罐子里装有2红1黑三个球,2号装有3红1黑4个球,3号装有2红2黑4个球。从中随机取一罐,再从中任意取出一球,如果已知取出的球为红球,求其属于i号罐的概率:(设Bi事件为取出的球来自i号罐,A事件为取得的为红球)

                                                          

以上的公式称为贝叶斯公式。此题简单,没有太好的体现此公式的作用,在某些复杂的场景,直接求 比较困难,而利用此公式算更简单。

 

       以下是贝叶斯在本章节的运用:

                                                     

 

朴素贝叶斯的朴素体现在文章的各个单词出现的几率彼此之间不影响。比如可乐二字在可口后面出现的概率肯定是比出现在娃哈哈之后的概率的大,而朴素则表示它在可口娃哈哈之后出现的概率相同。而我们再学习的时候并没有发现贝叶斯公式在代码中的体现,我们判断是因为是“朴素”,特征相互独立,不存在包含,所以自然就不会有这个公式了。可以理解为只有一个罐子里装有红球,其他两个罐子里没有红球。

 

二、函数代码

 
 
<strong><span style="color:#009900">#program4-1
def createVocabList(dataSet):
    vocabSet = set([ ])                      </span><span style="color:#ff0000">#创建一个空的不重复集合 ,并不是列表  </span><span style="color:#009900">   
     for document in dataSet:
        vocabSet = vocabSet | set(document) #取并集    </span><span style="color:#ff0000"> #set是一种数据类型,| 需是相同的数据类型    </span></strong>
<span style="color:#009900">return list(vocabSet)		</span>				

当测试这段代码时会发现,相同的程序,我们多点几次编译,每次返回的结果的都不同。如下,虽然每次都是这些单词,数量也不会改变,但是他们的顺序会随机改变。这是因为一般的list是链表实现,而set是hash表实现。hash表实现就意味着无序。这也符合数学上的集合中的元素无序的规则。

 

 

def setOfWords2Vec(vocabList, inputSet): 
      returnVec = [0] * len(vocabList)                                         #创建一个其中所含元素都为0的向量   [0]*5 = [0,0,0,0,0] 
      for word in inputSet:                                                    #遍历每个词条 
            if word in vocabList:                                              #如果词条存在于词汇表中,则置1 
               returnVec[vocabList.index(word)] = 1                            # vocabList.index(word)]:word在vocabList中的索引
               else: print("the word: %s is not in my Vocabulary!" % word) 
return returnVec 
[0]*5 = [0,0,0,0,0] 
      for word in inputSet:                                                    #遍历每个词条 
            if word in vocabList:                                              #如果词条存在于词汇表中,则置1 
               returnVec[vocabList.index(word)] = 1                            # vocabList.index(word)]:word在vocabList中的索引
               else: print("the word: %s is not in my Vocabulary!" % word) 
return returnVec 
#program4-2
for i in range(numTrainDocs): 
      if trainCategory[i] == 1:               #统计属于侮辱类的条件概率所需的数剧:P(w0|1),P(w1|1),P(w2|1)··· 
      p1Num += trainMatrix[i] 
      p1Denom += sum(trainMatrix[i]) 
else: 			                     #统计属于非侮辱类的条件概率所需的数据:P(w0|0),P(w1|0),P(w2|0)··· 
      p0Num += trainMatrix[i] 
      p0Denom += sum(trainMatrix[i]) 
p1Vect = log(p1Num/p1Denom)             
p0Vect = log(p0Num/p0Denom) 
#统计属于侮辱类的条件概率所需的数剧:P(w0|1),P(w1|1),P(w2|1)··· 
      p1Num += trainMatrix[i] 
      p1Denom += sum(trainMatrix[i]) 
else: 			                     #统计属于非侮辱类的条件概率所需的数据:P(w0|0),P(w1|0),P(w2|0)··· 
      p0Num += trainMatrix[i] 
      p0Denom += sum(trainMatrix[i]) 
p1Vect = log(p1Num/p1Denom)             
p0Vect = log(p0Num/p0Denom) 
 
#program4-3:
thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry))         #测试样本向量化 
if classifyNB(thisDoc,p0V,p1V,pAb): 
    print(testEntry,'属于侮辱类’)                                   #执行分类并打印分类结果 
else: 
    print(testEntry,'属于非侮辱类’) 
thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry))         #此处如果为矩阵则不能相乘,所以要转化为array。#此处如果为矩阵则不能相乘,所以要转化为array。

 

 

#新了解到的函数
#Zeros():输出的元素都为0;
#Ones():输出的元素都为1;
#Str.lower():将字符串里的字母全部转变为小写
#Str.upper():将字符串里的字母全部转变为大写
#trainingSet = list(range(50))        #构建一个0-50的列表
#Zeros():输出的元素都为0;
#Ones():输出的元素都为1;
#Str.lower():将字符串里的字母全部转变为小写
#Str.upper():将字符串里的字母全部转变为大写
#trainingSet = list(range(50))        #构建一个0-50的列表

 

 

<span style="color:#009900">#randIndex = int(random.uniform(0, len(trainingSet)))  #取一个0到len(trainingSet)的随机整形数字</span>
<span style="color:#009900">#uniform(x,y) 方法将随机生成下一个实数,它在[x,y]范围内。

</span>
 
<span style="color:#ff0000">#特殊使用格式</span>
<span style="color:#009900">Y = [2,3,1,4]
A = [x for x in y if x>2]
A = [3,4]</span>

 

三、正则表达式:

 

正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则失败。

<span style="color:#ff0000">Import re
regEx = re.compile(‘\\W*’)
listOfTokens = regEx.spilt(mySent)

等价于
listOfTokens = re.spilt(r’\W*’,mySent)

# re.compile(‘\\W*’):表示匹配任意个非单词字符,等价于“[^A-Z a-z 0-9_]”。</span>

 

关于正则表达式的详细介绍参考以下文章

四、零碎知识

1)RSS

     什么叫RSS呢,如果订阅了一个网站的RSS,那么这么这网站更新了内容之后,订阅的相关内容会自动更新,让我们不需要进入这个网站就可以知道网站更新了哪些文章,然后再直接选择性的阅读,这是我的拙见,可能不够精确。详细介绍参考此文章:

2)import xxfrom xx  import*的区别

举个列子说明:

<span style="color:#009900">def test():
a = 1
b = 2
#使用import xx输出a,b
import test
print(test.a)
print(test.b)
#使用from test import*输出a,b
from test import*
print(a)
print(b)</span>

3)三个小概念

· 词集模型:set of words,这是单词构成的集合,集合每个元素数量只有一个。

·词袋模型:bag of words ,此模型里的单词在文档中出现了不止一次,该模型会统计出其出现的次数(频率)

·留存交差验证:从某个集合中随机选择一部分作为训练集,而剩余的部分作为测试集的过程。

4)算法对比

 

 

 

 

 

 

             

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值