机器学习算法之三——分类(二)

1 朴素贝叶斯介绍

    我们假设有一个二分类问题,现有一个新的样本点x,我们用贝叶斯决策理论来判断新的样本点应该属于二分类(A,B)的哪一类:如果x属于A类的概率大于属于B类的概率,那么x就属于A类;反之则属于B类。对于多分类ci,那么只需要计算x属于各个分类的概率p,然后找到max(p(c_1|x),p(c_2|x),...,p(c_n|x)),其对于的最大概率标签,就是x的分类。那么如何计算每个分类p(ci| x)。

没错,就是贝叶斯公式:

p(c_i|x) = \frac{p(x|c_i)p(c_i)}{p(x)}

这里就用到了朴素贝叶斯的假设:假设所有xj(各特征属性)相互条件独立,则进一步拆分上面的公式,并且分母对于所有类别都是常数,所有将分母最大化,那么就可以得到:

p(c_i|x) = p(x|c_i)p(ci) = p(c_i)\prod_{j=1}^{m}p(x_j|c_i)

    那么朴素贝叶斯分类的流程如下:

      1、设x=\{x_1,x_2,...,x_m\}为一个待分类项,而每个a为x的一个特征属性。

      2、有类别集合c=\{ c_1,c_2,...,c_n\}

      3、计算p(x_j|c_i)

      4、如果p(c_k|x) = max(p(c_1|x),p(c_2|x),...,p(c_n|x)),则 x\subseteq c_k

2 运行实例

    实际应用场景可以有:文本分类;垃圾邮件过滤;病人分类;拼写检查等。

    朴素贝叶斯常用的模型:高斯模型(特征是连续型变量);多项式模型(特征是离散的);伯努利模型(特征是离散的且为布尔类型(1/0))。

   本文使用他来过滤恶意评论(恶意的为1,非恶意的为0):

# coding=utf-8
from numpy import *

# 创建一个实验样本
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]
    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)        # 创建一个其中所含元素都为0的向量
    for word in inputSet:
        if word in vocabList:
            # returnVec[vocabList.index(word)] = 1     # index函数在字符串里找到字符第一次出现的位置  词集模型
            returnVec[vocabList.index(word)] += 1      # 文档的词袋模型    每个单词可以出现多次
        else: print "the word: %s is not in my Vocabulary!" % word
    return returnVec

# 朴素贝叶斯分类器训练函数   从词向量计算概率
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
    p0Num = ones(numWords);   # 避免一个概率值为0,最后的乘积也为0
    p1Num = ones(numWords);   # 用来统计两类数据中,各词的词频
    p0Denom = 2.0;  # 用于统计0类中的总数
    p1Denom = 2.0  # 用于统计1类中的总数
    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 / p0Denom
    p1Vect = log(p1Num / p1Denom)    # 在类1中,每个次的发生概率
    p0Vect = log(p0Num / p0Denom)      # 避免下溢出或者浮点数舍入导致的错误   下溢出是由太多很小的数相乘得到的
    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)

# 调用测试方法----------------------------------------------------------------------
testingNB()

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络(Convolutional Neural Network,CNN)是一种机器学习算法,其主要应用于图像识别、计算机视觉和模式识别等领域。CNN模型的设计灵感来源于科学家们对于生物视觉系统的研究。该算法的核心概念是通过卷积层、池化层和全连接层的组合,对输入的图像进行特征提取和分类。 在CNN,卷积层是该模型的主要组成部分之一。通过定义一组卷积核(或过滤器),卷积层可以对输入的图像进行滤波操作,将原始图像的特定特征(例如边缘和纹理)提取出来,并生成一系列特征图。这些特征图可以被认为是对原始图像进行不同尺度和方向的特征提取。 在经过卷积层之后,通常会接着使用池化层来进行下采样操作。池化层的主要目的是减小特征图的尺寸,同时保留重要的特征信息。最常见的池化操作是最大池化,它通过从特定区域选择最大值来减小特征图的尺寸。 最后,经过卷积层和池化层的多次迭代后,最后会以全连接层作为输出层,进行分类任务。全连接层的每个节点都与前一层的所有节点相连接,主要用于将最后一层的特征进行整合,并根据特征进行分类或回归。 相比于传统机器学习算法,CNN在处理图像任务方面具有更好的性能。这是因为卷积层可以通过共享权重和局部连接的方式进行参数的共享,大大减少了需要训练的参数数量,并且能够有效处理图像的平移不变性。此外,卷积神经网络还可以通过堆叠多个卷积层和全连接层来构建深层网络模型,从而进一步提高模型的性能。 总而言之,卷积神经网络是一种强大的机器学习算法,特别适用于图像识别和计算机视觉任务。通过卷积层、池化层和全连接层的组合,CNN可以有效地提取图像的特征,并进行分类或回归等任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值