<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.swarma.org/index.php?action=history&amp;feed=atom&amp;title=%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86%E4%B8%8E%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90</id>
	<title>贝叶斯定理与情感分析 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.swarma.org/index.php?action=history&amp;feed=atom&amp;title=%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86%E4%B8%8E%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90"/>
	<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86%E4%B8%8E%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90&amp;action=history"/>
	<updated>2026-11-03T02:57:41Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86%E4%B8%8E%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90&amp;diff=15304&amp;oldid=prev</id>
		<title>薄荷：创建页面，内容为“==概率模型==  ===从条件概率公式推导出贝叶斯===   从条件概率公式  &lt;math&gt;P(A|B) P(B) =P(A \cap B) =P(B|A) P(A)&lt;/math&gt;  可以得到贝叶斯公…”</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%AE%9A%E7%90%86%E4%B8%8E%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90&amp;diff=15304&amp;oldid=prev"/>
		<updated>2020-10-15T15:59:33Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“==概率模型==  ===从条件概率公式推导出贝叶斯===   从条件概率公式  &amp;lt;math&amp;gt;P(A|B) P(B) =P(A \cap B) =P(B|A) P(A)&amp;lt;/math&amp;gt;  可以得到贝叶斯公…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==概率模型==&lt;br /&gt;
&lt;br /&gt;
===从条件概率公式推导出贝叶斯===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
从条件概率公式&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(A|B) P(B) =P(A \cap B) =P(B|A) P(A)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可以得到贝叶斯公式&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(B|A) = \frac{P(B)P(A|B)}{P(A)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===语义模型贝叶斯===&lt;br /&gt;
&lt;br /&gt;
在情感分析中的语义模型，就是为了把文本根据特征（例如切成token的一个个词）进行分类。由特征的属性（正面还是负面）决定文本的属性。&lt;br /&gt;
&lt;br /&gt;
假设我们有&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Variable !! Values !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| C || &amp;quot;pos&amp;quot;,&amp;quot;neg&amp;quot; || 单条Tweet 分类&lt;br /&gt;
|-&lt;br /&gt;
| F1 || &amp;quot;non-neg&amp;quot; || 单条Tweet中&amp;quot;awesome&amp;quot;个数&lt;br /&gt;
|-&lt;br /&gt;
| F2 || &amp;quot;non-neg&amp;quot; || 单条Tweet中&amp;quot;crasy&amp;quot;个数&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
现在，我们的问题是，如果看到了F1和F2这两个特征，单条tweet属于类别C的概率是多少？贝叶斯模型对这个问题的回答如下：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(C|F_1,F_2) = \frac{P(C)P(F_1,F_2|C)}{P(F_1,F_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
公式左边的三个变量都是可以从采集的数据集（训练集）中获得的。P(c)就是数据集中某一类（例如pos）tweets的出现概率，我们用它代替真实的&lt;br /&gt;
总体概率；P(F_1,F_2)就是数据集中包含F1个&amp;quot;awesome&amp;quot;和F2个&amp;quot;crazy&amp;quot;的tweet的个数；至于P(F_1,F_2|C)，我们可以直接数某一类tweets中同时包含F1个&amp;quot;awesome&amp;quot;和F2个&amp;quot;crazy&amp;quot;的tweet的个数—这种做法在数据集比较小的时候并不明智，也可以通过假设F1和F2相互独立，从而得到&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(F_1,F_2|C) = P(F_1|C)P(F_2|F_1,C)= P(F_1|C)P(F_2|C)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为引入了特征相互独立的假设，所以叫“朴素”贝叶斯（Naive Bayesian），看起来这个假设很简单粗暴，但这个模型却在真实世界中非常好用，&lt;br /&gt;
一点也不“朴素”。&lt;br /&gt;
&lt;br /&gt;
综合以上分析，我们的“朴素”贝叶斯模型就是&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;P(C|F_1,F_2) = \frac{P(C)P(F_1|C)P(F_2|C)}{P(F_1,F_2)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
总结一下，贝叶斯模型使得我们可以使用已知的信息来猜测未知的信息，其逻辑是&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;posterior = \frac{prior * likelihood}{evidence}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===对语义模型贝叶斯经行调整===&lt;br /&gt;
&lt;br /&gt;
现在，我们已经有了一个可以工作的模型，但要应用的真实数据集上还存在两个问题&lt;br /&gt;
&lt;br /&gt;
1.P(F_1,F_2)可能等于0;&lt;br /&gt;
&lt;br /&gt;
2.P(F_1|C)P(F_2|C)的概率可能会很小，超出像python numpy这种包的定义范围，以至需要特殊的包。&lt;br /&gt;
&lt;br /&gt;
解决第一个问题的方案是对概率进行修正，具体办法是对于每一个概率，分子加1分母加d(d是特征数，这里就是2)；解决第二个问题的办法是使用对数概率代替概率。使用对数概率后，原有的朴素贝叶斯公式变为&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;log P(C|F_1,F_2) = log P(C) + log P(F_1|C) + log P(F_2|C)- log P(F_1,F_2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
因为在对单条tweet进行判别时，仅仅最后一项是常数，所以我们只关心前面一项。当然，两条特征是远不足以判别的，所以真实公式是&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;log P(C|F_1,F_2) = log P(C) + \sum_{i=1}^{k} log P(F_k|C) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Python 代码及示例：使用朴素贝叶斯模型判别论坛帖子是否辱骂性==&lt;br /&gt;
&lt;br /&gt;
调用模块&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    from numpy import *&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
代码示例&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    #------revised from http://blog.csdn.net/marvin521/article/details/9262445&lt;br /&gt;
    &lt;br /&gt;
    from numpy import *&lt;br /&gt;
    #----------1. prepare trainning set------------&lt;br /&gt;
    def loadDataSet():&lt;br /&gt;
        postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],&lt;br /&gt;
                     ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],&lt;br /&gt;
                     ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],&lt;br /&gt;
                     ['stop', 'posting', 'stupid', 'worthless', 'garbage'],&lt;br /&gt;
                     ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],&lt;br /&gt;
                     ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]&lt;br /&gt;
        classVec = [0,1,0,1,0,1]   #1 is abusive, 0 not &lt;br /&gt;
        return postingList,classVec&lt;br /&gt;
    &lt;br /&gt;
    #---------2. define feature space/tokenize function----------&lt;br /&gt;
    def createVocabList(dataSet):&lt;br /&gt;
        vocabSet = set([])  &lt;br /&gt;
        for document in dataSet:&lt;br /&gt;
            vocabSet = vocabSet | set(document) &lt;br /&gt;
        return list(vocabSet)&lt;br /&gt;
    &lt;br /&gt;
    #---------3. function to project test data in the feature space-------&lt;br /&gt;
    def setOfWords2Vec(vocabList, inputSet):&lt;br /&gt;
        returnVec = [0]*len(vocabList)&lt;br /&gt;
        for word in inputSet:&lt;br /&gt;
            if word in vocabList:&lt;br /&gt;
                returnVec[vocabList.index(word)] = 1&lt;br /&gt;
            else: print &amp;quot;the word: %s is not in my Vocabulary!&amp;quot; % word&lt;br /&gt;
        return returnVec&lt;br /&gt;
    &lt;br /&gt;
    #----------4. function to train a naive Bayesian model from the training data set---- &lt;br /&gt;
    def trainNB0(trainMatrix,trainCategory):&lt;br /&gt;
        NdataPoints = len(trainCategory)&lt;br /&gt;
        featureSpaceDimensions = len(trainMatrix[0])&lt;br /&gt;
        pAbusive = sum(trainCategory)*1.0/len(trainCategory)&lt;br /&gt;
        p0Num = ones(featureSpaceDimensions); p1Num = ones(featureSpaceDimensions)   # zeros change to ones() &lt;br /&gt;
        p0Denom = 2.0; p1Denom = 2.0                        #1.0 change to 2.0&lt;br /&gt;
        for i in range(NdataPoints):&lt;br /&gt;
            if trainCategory[i] == 1:&lt;br /&gt;
                p1Num += trainMatrix[i]&lt;br /&gt;
                p1Denom += sum(trainMatrix[i])&lt;br /&gt;
            else:&lt;br /&gt;
                p0Num += trainMatrix[i]&lt;br /&gt;
                p0Denom += sum(trainMatrix[i])&lt;br /&gt;
        p1Vect = log(p1Num/p1Denom)          #change to log()&lt;br /&gt;
        p0Vect = log(p0Num/p0Denom)          #change to log()&lt;br /&gt;
        return p0Vect,p1Vect,pAbusive&lt;br /&gt;
    &lt;br /&gt;
    #------------5. Applied the trained model to classify posts (projected in the feature space)--------&lt;br /&gt;
    def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):&lt;br /&gt;
        p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult&lt;br /&gt;
        p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)&lt;br /&gt;
        if p1 &amp;gt; p0:&lt;br /&gt;
            return 1&lt;br /&gt;
        else: &lt;br /&gt;
            return 0&lt;br /&gt;
    &lt;br /&gt;
    #----------------------      test----------------  &lt;br /&gt;
    d1=loadDataSet()&lt;br /&gt;
    featureSpace=createVocabList(d1[0])&lt;br /&gt;
    examplePost=re.split(&amp;quot; &amp;quot;, &amp;quot;I love my dog and my family&amp;quot;)&lt;br /&gt;
    exampleVector=setOfWords2Vec(featureSpace,examplePost)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    trainMatrix=map(lambda x:setOfWords2Vec(featureSpace,x),d1[0])&lt;br /&gt;
    trainCategory=d1[1]&lt;br /&gt;
    p0Vect,p1Vect,pAbusive = trainNB0(trainMatrix,trainCategory)&lt;br /&gt;
    classifyNB(exampleVector, p0Vect, p1Vect, pAbusive)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[分类:旧词条迁移]]&lt;/div&gt;</summary>
		<author><name>薄荷</name></author>
	</entry>
</feed>