Python_2019-09-03_机器学习——贝叶斯(一)——文本分类

 目录

 思路

bayes.py程序


思路

'''
字符串转单词表
词表转词向量0/1
词向量计算概率p(ci)和p(w|ci)
最后计算类别概率:
p(ci|w) = p(w|ci)*p(ci) = log(p(w|ci)) + log(p(ci))
得到最大概率的预测结果
'''
'''
p(ci)的计算
数据+标签:
    [0,1,0,1,0,0,1][1]
    [1,1,0,0,0,0,0][0]
    [0,1,1,1,1,1,1][1]
p(ci)的计算结果
    p(c0)=1/3
    p(c1)=2/3
'''
'''
p(w|ci)的计算
数据+标签:
    [0,1,0,1,0,0,1][1]
    [1,1,0,0,0,0,0][0]
    [0,1,1,1,1,1,1][1]
类别为[1]:
    p1Num1 = p1Num0 + [0,1,0,1,0,0,1] = [1,2,1,2,1,1,2]
    p1Denom1 = p1Denom0 + sum([0,1,0,1,0,0,1]) = 2 + 3
    p1Num2 = p1Num1 + [0,1,1,1,1,1,1] = [1,3,2,3,2,2,3]
    p1Denom2 = p1Denom1 + sum([0,1,1,1,1,1,1]) = 5 + 6 = 11
类别为[0]:
    p0Num1 = p0Num0 + [1,1,0,0,0,0,0] = [2,2,1,1,1,1,1]
    p0Denom1 = p0Denom0 + sum([1,1,0,0,0,0,0]) = 2 + 2 = 4
p(w|ci)的计算结果
    p(w|c0) = log(p0Num1/p0Denom1) = log([2,2,1,1,1,1,1]/04) = [pwc0]
    p(w|c1) = log(p1Num2/p1Denom2) = log([1,3,2,3,2,2,3]/11) = [pwc1]
''' 
'''
测试事件的概率计算p(ci|w) = p(w|ci)*p(ci) = log(p(w|ci)) + log(p(ci)):    
    p(c0|w) = sum([pwc0]*存在类别0的特征向量)+log(p(c0))
    p(c1|w) = sum([pwc1]*存在类别1的特征向量)+log(p(c1))
'''

bayes.py程序

'''
数据样本_第一步:句子+标签
'''
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 is abusive, 0 not
    return postingList,classVec
'''
数据样本_第二步:句子+标签转单词列表 —— 即【 单词表 】
'''
def createVocabList(dataSet):
    vocabSet = set([])  # create empty set
    for document in dataSet:
        print("dataSet的行document", document)
        print("每句话(每行)set不重复", set(document))
        vocabSet = vocabSet | set(document) # union of the two sets 并集OR 两个set函数定义的集合可以直接计算并、交集,
        print("并集后", vocabSet)
    return list(vocabSet)
'''
数据样本_第三步:单词列表转同等长度的词向量,如果A句子的单词出现则,对应词向量的位置为1,否则为0 —— 即【 单词状态表 】
'''
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

from numpy import *
def trainNB0(trainMatrix, trainCategory):
    numTrainDocs = len(trainMatrix) # 6个数据集
    numWords = len(trainMatrix[0]) # 32个特征词
    '''
    p(ci)的计算
    数据+标签:
        [0,1,0,1,0,0,1][1]
        [1,1,0,0,0,0,0][0]
        [0,1,1,1,1,1,1][1]
    p(ci)的计算结果
        p(c0)=1/3
        p(c1)=2/3
    '''
    pAbusive = sum(trainCategory)/float(numTrainDocs) # 类别为 1 的概率 = sum(类别为1)/总数据集个数
    p0Num = ones(numWords); p1Num = ones(numWords)      #change to ones() 
    p0Denom = 2.0; p1Denom = 2.0                        #change to 2.0
    '''
    p(w|ci)的计算
    数据+标签:
        [0,1,0,1,0,0,1][1]
        [1,1,0,0,0,0,0][0]
        [0,1,1,1,1,1,1][1]
    类别为[1]:
        p1Num1 = p1Num0 + [0,1,0,1,0,0,1] = [1,2,1,2,1,1,2]
        p1Denom1 = p1Denom0 + sum([0,1,0,1,0,0,1]) = 2 + 3
        p1Num2 = p1Num1 + [0,1,1,1,1,1,1] = [1,3,2,3,2,2,3]
        p1Denom2 = p1Denom1 + sum([0,1,1,1,1,1,1]) = 5 + 6 = 11
    类别为[0]:
        p0Num1 = p0Num0 + [1,1,0,0,0,0,0] = [2,2,1,1,1,1,1]
        p0Denom1 = p0Denom0 + sum([1,1,0,0,0,0,0]) = 2 + 2 = 4
    p(w|ci)的计算结果
        p(w|c0) = log(p0Num1/p0Denom1) = log([2,2,1,1,1,1,1]/04) = [pwc0]
        p(w|c1) = log(p1Num2/p1Denom2) = log([1,3,2,3,2,2,3]/11) = [pwc1]
    ''' 
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:   # 类别为 1 的 每个词条进行计算
            p1Num += trainMatrix[i] # 对应位置如果出现,即1,该位置自加。
            p1Denom += sum(trainMatrix[i])  # 对应的总词数也进行统计。
            print(trainMatrix[i])
            print(sum(trainMatrix[i]))
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vec = log(p1Num/p1Denom)          #change to log()
    p0Vec = log(p0Num/p0Denom)          #change to log()
    return p0Vec, p1Vec, pAbusive

    '''
    测试事件的概率计算p(ci|w) = p(w|ci)*p(ci) = log(p(w|ci)) + log(p(ci)):    
        p(c0|w) = sum([pwc0]*存在类别0的特征向量)+log(p(c0))
        p(c1|w) = sum([pwc1]*存在类别1的特征向量)+log(p(c1))
    '''
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    # p(w|ci)p(ci)在自然对数里+即表示乘法,因为p(w)一样所以就不必计算,只需计算分子
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    print(p1)
    print(p0)
    if p1 > p0:
        return 1
    else: 
        return 0

if __name__ == "__main__":
    listOPosts, listClasses = loadDataSet()
    print("————————————————————————————————————————————————————", "输入数据", "输入标签")
    print(listOPosts, listClasses)
    
    myVocabList = createVocabList(listOPosts)
    print("————————————————————————————————————————————————————", "转换称词表")
    print(myVocabList)
    
    trainMat = []
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
        pass
    print("————————————————————————————————————————————————————", "训练数据和标签")
    for trainMat_rows in trainMat:
        print(trainMat_rows)
        pass
    for class_rows in listClasses:
        print(class_rows)
        pass
    
    p0V, p1V, pAb = trainNB0(array(trainMat),array(listClasses))
    print("————————————————————————————————————————————————————", "每个句子对应的特征向量标号")
    print(p0V)
    print(p1V)
    print(pAb)

    testEntry = ['stupid', 'my']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print("————————————————————————————————————————————————————", "测试——每个句子对应的特征向量标号")
    print(thisDoc)    
    print (testEntry,'classified as: ',classifyNB(thisDoc, p0V, p1V, pAb))

    pass

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您介绍一下朴素贝叶斯算法在新闻分类中的应用及其Sklearn实现。 首先,朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法,其主要思想是利用先验概率和条件概率来计算后验概率,从而实现分类。在新闻分类中,我们可以将每篇新闻看作一个样本,将其所属的类别作为标签进行分类。 Sklearn是Python中一个强大的机器学习库,其中包含了朴素贝叶斯分类器的实现。下面是一个使用Sklearn实现新闻分类的示例代码: ```python # 导入所需的库和数据集 from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report # 加载数据集 newsgroups_train = fetch_20newsgroups(subset='train') newsgroups_test = fetch_20newsgroups(subset='test') # 特征提取(使用TF-IDF方法) vectorizer = TfidfVectorizer() X_train = vectorizer.fit_transform(newsgroups_train.data) X_test = vectorizer.transform(newsgroups_test.data) y_train = newsgroups_train.target y_test = newsgroups_test.target # 训练模型 clf = MultinomialNB() clf.fit(X_train, y_train) # 预测并评估模型 y_pred = clf.predict(X_test) print(classification_report(y_test, y_pred, target_names=newsgroups_test.target_names)) ``` 以上代码中,我们首先使用Sklearn提供的`fetch_20newsgroups`函数加载新闻数据集。然后,我们使用`TfidfVectorizer`方法对文本进行特征提取,将其转换为TF-IDF特征向量。接着,我们使用`MultinomialNB`方法训练模型,并使用测试集进行预测和评估。 最后,我们使用`classification_report`方法输出分类结果的准确率、召回率和F1值等指标。在这个示例中,我们使用的是多项式朴素贝叶斯分类器(Multinomial Naive Bayes),它适用于文本分类等离散型数据的分类应用。 希望这个示例代码可以对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值