NLP Task5

朴素贝叶斯

定义:
P(C|X)称为C的后验概率,与之相对的,P©称为C的先验概率。而基于贝叶斯公式(公式如下):
在这里插入图片描述
但在比较不同的A值的后验概率时,分母P(B)总是为常数,将其忽略掉后,后验概率为P(A|B)=P(B|A)P(A)而先验概率P(A)可以通过计算训练集的每一个类的训练样本所占比例获得,对类条件概率P(X|C)的估计,我们只谈论朴素贝叶斯方法,因为朴素贝叶斯假设事物属性之间相互条件独立。即P(X|A)=∏P(xi|ai)

高斯模型
from sklearn.naive_bayes import GaussianNB
#高斯贝叶斯
def train_model_GaussianNB():
    pass
    clf3 = GaussianNB()
    clf3.fit(X[499:], y[499:])#训练模型
    predict_labels = clf3.predict(X[0:499])
    # 预测对了几个?
    n = 0
    for i in range(len(predict_labels)):
        if (predict_labels[i] == y[i]):
            n = n + 1
    print("高斯贝叶斯:")
    # 正确率
    print n / 499.0
    # 混淆矩阵
    confusion_matrix(y[0:499], predict_labels)
    return

多项式模型

from sklearn.naive_bayes import MultinomialNB
#多项式贝叶斯
def train_model_MultinomialNB():
    pass
    clf = MultinomialNB()
    #训练模型
    clf.fit(X[499:],y[499:])
    #预测训练集
    predict_labels = clf.predict(X[0:499])
    #预测对了几个?
    n = 0
    for i in range(len(predict_labels)):
        if(predict_labels[i] == y[i]):
            n = n + 1
    print("多项式贝叶斯:")
    #正确率
    print n/499.0
    #混淆矩阵
    confusion_matrix(y[0:499], predict_labels)
    return

伯努利模型

from sklearn.naive_bayes import BernoulliNB
#伯努利贝叶斯
def train_model_BernoulliNB():
    pass
    clf2 = BernoulliNB()
    clf2.fit(X[499:], y[499:])
    predict_labels = clf2.predict(X[0:499])
    # 预测对了几个?
    n = 0
    for i in range(len(predict_labels)):
        if (predict_labels[i] == y[i]):
            n = n + 1
    print("伯努利贝叶斯:")
    # 正确率
    print n / 499.0
    # 混淆矩阵
    confusion_matrix(y[0:499], predict_labels)
    return

SVM

假设g(x)=wx+b,g(x)= 0为分类面,定义一个样本点到某个超平面的间隔为:
δi=yi(wxi+b)
我们将其做下变换用w/||w||和b/||w||分别代替原来的w和b,那么间隔就可以写成
在这里插入图片描述
其为解析几何中点到直线的距离,推广到超平面的形式。||w||叫做向量w的范数,范数是对向量长度的一种度量。我们常说的长度其实是指他的2-范式。例如:
向量w=(w1, w2, w3,…… wn)
他的p-范式为:
在这里插入图片描述
将p看成2,即为传统的向量长度。几何间隔δ=||w||δ几何。注意到几何间隔与||w||是成反比的,因此最大化几何间隔与最小化||w||完全是一回事。而我们常用的方法并不是固定||w||的大小而寻求最大几何间隔,而是固定间隔(例如固定为1),寻找最小的||w||。我们想寻找最小的||w||这件事,就可以用下面的式子表示:
min||w||
但实际上对于这个目标,我们常常使用另一个完全等价的目标函数来代替,那就是:
min

如果直接来解这个求最小值问题,很容易看出当||w||=0的时候就得到了目标函数的最小值。但是也会发现,无论给什么样的数据,都是这个解!反映在图中,就是H1与H2两条直线间的距离无限大,这个时候,所有的样本点(无论正样本还是负样本)都跑到了H1和H2中间,而我们原本的意图是,H1右侧的被分为正类,H2 左侧的被分为负类,位于两类中间的样本则拒绝分类(拒绝分类的另一种理解是分给哪一类都有道理,因而分给哪一类也都没有道理)。所有样本点都进入了无法分类的灰色地带。
在这里插入图片描述
造成这样的目标是没有加入约束条件

yi[(w·xi)+b]≥1 (i=1,2,…,l) (l是总的样本数)

但我们常常习惯让式子的值和0比较,因而经常用变换过的形式:

yi[(w·xi)+b]-1≥0 (i=1,2,…,l) (l是总的样本数)
即转换成了数学问题:
在这里插入图片描述
即我们想求得这样的一个线性函数:
g(x)=wx+b

使得所有属于正类的点+代入以后有g(x+)≥1,而所有属于负类的点x-代入后有g(x-)≤-1(之所以总跟1比较,无论正一还是负一,都是因为我们固定了间隔为1,注意间隔和几何间隔的区别)。代入g(x)后的值如果在1和-1之间,我们就拒绝判断。
样本确定了w,用数学的语言描述,就是w可以表示为样本的某种组合:

w=α1x1+α2x2+…+αnxn

式子中的αi是一个一个的数(在严格的证明过程中,这些α被称为拉格朗日乘子),而xi是样本点,因而是向量,n就是总样本点的个数。为了方便描述,以下开始严格区别数字与向量的乘积和向量间的乘积,我会用α1x1表示数字和向量的乘积,而用<x1,x2>表示向量x1,x2的内积(也叫点积,注意与向量叉积的区别)。因此g(x)的表达式严格的形式应该是:

g(x)=<w,x>+b
但是上面的式子还不够好,你回头看看图中正样本和负样本的位置,想像一下,我不动所有点的位置,而只是把其中一个正样本点定为负样本点(也就是把一个点的形状从圆形变为方形),结果怎么样?三条直线都必须移动(因为对这三条直线的要求是必须把方形和圆形的点正确分开)!这说明w不仅跟样本点的位置有关,还跟样本的类别有关(也就是和样本的“标签”有关)。因此用下面这个式子表示才算完整:

w=α1y1x1+α2y2x2+…+αnynxn
我们将w简写:
在这里插入图片描述
原来的g(x)可写为:
在这里插入图片描述
注意式子中x才是变量,也就是你要分类哪篇文档,就把该文档的向量表示代入到 x的位置,而所有的xi统统都是已知的样本。还注意到式子中只有xi和x是向量,因此一部分可以从内积符号中拿出来,得到g(x)的式子为:
在这里插入图片描述
为什么需要核函数,有的在低维空间不可分的文题,映射到高维空间,就可以线性可分。
想象一下,我们文本分类问题的原始空间是1000维的(即每个要被分类的文档被表示为一个1000维的向量),在这个维度上问题是线性不可分的。现在我们有一个2000维空间里的线性函数

f(x’)=<w’,x’>+b

注意向量的右上角有个 ’哦。它能够将原问题变得可分。式中的 w’和x’都是2000维的向量,只不过w’是定值,而x’是变量(好吧,严格说来这个函数是2001维的,哈哈),现在我们的输入呢,是一个1000维的向量x,分类的过程是先把x变换为2000维的向量x’,然后求这个变换后的向量x’与向量w’的内积,再把这个内积的值和b相加,就得到了结果,看结果大于阈值还是小于阈值就得到了分类结果。
如果有这样的函数,那么当给了一个低维空间的输入x以后,

g(x)=K(w,x)+b

f(x’)=<w’,x’>+b
这两个函数的计算结果就完全一样,就不需要再找映射关系。

参考博客:https://blog.csdn.net/DP323/article/details/80535863

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值