郑捷《机器学习算法原理与编程实践》学习笔记(第二章中文文本分类—朴素贝叶斯算法)

金秀 金秀     2022-08-19     335

关键词:

(上接第二章)

  2.3 分类算法:朴素贝叶斯

  2.3.1 贝叶斯公式推导(略)

  分类的流程:  

  第一阶段:训练数据生成训练样本集:TF-IDF

  第二阶段:对每个类别计算p(yi)。

  第三个阶段:对每个特征属性计算所有划分的条件概率

  第四个阶段:对每个类别计算P(x|yi)P(yi)。

  第五个阶段:以P(x|yi)P(yi)的最大项作为x的所属类别。

  2.3.2  朴素贝叶斯算法实现

  创建Nbayes_lib.py的文件,这个文件用来导入数据和朴素贝叶斯类的代码。

  使用简单的英文语料作为数据集:

  

def loadDataSet():
    postingList =[[my,dog,has,flea,problem,help,please],
                  [maybe,not,take,him,to,dog,park,stupid],
                  [my,dalmation,is,so,cute,I,love,him,my],
                  [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

  posstingList 是训练集文本,classVec是每个文本对应的分类:

  (1)编写一个贝叶斯算法类,并创建默认的构造方法:

class NBayes(object):
    def __init__(self):
        self.vocabulary = []        #词典
        self.idf        = 0         #词典的IDF权值向量
        self.tf         = 0         #训练值的权值矩阵
        self.tdm        = 0         #P(x|yi)
        self.Pcates     = {}        #P(yi)是一个类别字典
        self.labels     = []        #对应每个文本的分类,是一个外部导入的列表
        self.doclength  = 0         #训练集文本数
        self.vocablen   = 0         #词典词长
        self.testset    = 0         #测试集

  (2)导入和训练数据集,生成算法必需的参数和数据结构

def train_set(self,trainset,classVec):
    self.cate_prob(classVec)       #计算每个分类在数据集中的概率P(yi)
    self.doclength       = len(trainset)
    tempset              = set()
    [tempset.add(word) for doc in trainset for word in doc]  #生成词典
    self.vocabulary      = list(tempset)
    self.vocablen        = len(self.vocabulary)
   self.calc_wordfreq(trainset)
   self.build_tdm() #按分类累计向量空间的每维值P(x|yi)

  (3)cate_prob函数:计算在数据集中每个分类的概率P(yi

def cate_prob(self,classVec):
    self.labels          = classVec
    labeltemps           = set(self.labels)                   #获取全部分类
    for labeltemp in labeltemps:
        #统计列表中重复的分类:  self.labels.count(labeltemp)
        self.Pcates[labeltemp] = float(self.labels.count(labeltemp))/float(len(self.labels))

  (4)calc_wordfreq函数:生成普通的词频向量

  

def calc_wordfreq(self,trainset):
    self.idf             = np.zeros([1,self.vocablen])        #1*词典数
    self.tf              = np.zeros([self.doclength,self.vocablen]) #训练集文件数*词典数
    for indx in xrange(self.doclength):                      #遍历所有的文本
        for word in trainset[indx]:                          #遍历文本中的每个词
            #找到文本的词在字典中的位置+1
            self.tf[indx,self.vocabulary.index(word)] += 1
        for signleword in set(trainset[indx]):               #idf词数
            self.idf[0,self.vocabulary.index(signleword)] += 1

  (5)Build_tdm函数:按分类累计计算向量空间的每维值P(x|yi

    def build_tdm(self):
        self.tdm = np.zeros([len(self.Pcates),self.vocablen])     #类别行*词典列
        sumlist  = np.zeros([len(self.Pcates),1])                #统计每个分类的总值
        for indx in xrange(self.doclength):
            #将同一类别的词向量空间值加总
            self.tdm[self.labels[indx]] += self.tf[indx]
            #统计每个分类的总值--是一个标量
            sumlist[self.labels[indx]]    = np.sum(self.tdm[self.labels[indx]])
        self.tdm = self.tdm/sumlist                              #生成P(x|yi)

  (6)map2vocab函数:将测试集映射到当前词典

   # (6)map2vocab函数:将测试集映射到当前词典
    def map2vocab(self,testdata):
        self.testset = np.zeros([1,self.vocablen])
        for word in testdata:
            self.testset[0,self.vocabulary.index(word)] += 1

  (7)predict函数:预测分类结果,输出预测的分类类别

  

 def predict(self,testset):
        if np.shape(testset)[1] != self.vocablen: #如果测试集长度与词典不相等,则退出程序
            print "输入错误"
            exit(0)
        predvalue = 0                             #初始化类别概率
        predclass = ""                            #初始化类别名称
        for tdm_vect,keyclass in zip(self.tdm,self.Pcates):
            #P(x|yi)*P(yi)
            #变量tdm,计算最大分类值
            temp = np.sum(testset*tdm_vect*self.Pcates[keyclass])
            if temp > predvalue:
                predvalue = temp
                predclass = keyclass
        return predclass

  2.3.3 算法的改进

  此算法的改进是为普通的词频向量使用TF-IDF策略,使之有能力修正多种偏差

  calc_tfidf函数:以TF-IDF方式生成向量空间。

  

#生成tf-idf
def calc_tfidf(self,trainset):
    self.idf = no.zeros([1,self.vocablen])
    self.tf  = np.zeros([self.doclength,self.vocablen])
    for indx in xrange(self.doclength):
        for word in trainset[indx]:
            self.tf[indx,self.vocabulary.index(word)] += 1
        #消除不同句长导致的偏差
        self.tf[indx] = self.tf[indx]/float(len(trainset[indx]))
        for signleword in set(trainset[indx]):
            self.idf[0,self.vocabulary.index(signleword)] += 1
    self.idf = np.log(float(self.doclength)/self.idf)
    self.tf  = np.multiply(self.tf,self.idf)    #矩阵与向量的点乘 TF*IDF

  2.3.4 评估分类结果

  

#coding:utf-8
import sys
import os
from numpy import *
import numpy as np
from Nbayes_lib import *
#评估分类结果

dataSet,listClasses = loadDataSet() #导入外部数据集
#dataSet:句子的词向量
#listClass是句子所属的类别[0,1,0,1,0,1]
nb                  = NBayes()      #实例化
nb.train_set(dataSet,listClasses)   #训练数据集
nb.map2vocab(dataSet[0])            #随机选择一个测试语句
print nb.predict(nb.testset)

分类结果如下:
1

  

  

参考资料及版权所有:郑捷《机器学习算法原理与编程实践》

郑捷《机器学习算法原理与编程实践》学习笔记(第七章预测技术与哲学)7.3岭回归

7.3岭回归7.3.1验证多重共线性7.3.2岭回归理论7.3.3岭际分析7.3.4k值的判断7.3.5辅助函数 (1)导入多维数据集:加载数据集defloadDataSet(filename):numFeat=len(open(filename).readline().split(‘ ‘))-1#getnumberoffieldsdataMat=[]labelMat=[]fr=ope 查看详情

郑捷《机器学习算法原理与编程实践》学习笔记(第六章神经网络初步)6.5boltzmann机算法

6.5Boltzmann机算法6.5.1问题的提出6.5.2模拟退化原理6.5.3Boltzmann分布与退火过程6.5.4Boltzmann机类与退火过程   Boltzmann网络初始时,需要根据参数设置一系列的初始值,主要参数在_init_中  (1)构造方法如下classBoltzmannNet(object... 查看详情

郑捷《机器学习算法原理与编程实践》学习笔记(第七章预测技术与哲学)7.1线性系统的预测

 7.1.1回归与现代预测 7.1.2最小二乘法 7.1.3代码实现(1)导入数据defloadDataSet(self,filename):#加载数据集X=[];Y=[]fr=open(filename)forlineinfr.readlines():curLine=line.strip().split(‘ ‘)X.append(float(curLine[0]) 查看详情

郑捷《机器学习算法原理与编程实践》学习笔记(第三章决策树的发展)_scikit-learn与回归树

  (上接第三章)   3.4Scikit-Learn与回归树  3.4.1回归算法原理  在预测中,CART使用最小剩余方差(squaredResidualsMinimization)来判断回归时的最优划分,这个准则期望划分之后的子树与样本点的误差方差最小。这样决策... 查看详情

郑捷《机器学习算法原理与编程实践》学习笔记(第六章神经网络初步)6.3自组织特征映射神经网路(smo)

 具体原理网址:http://wenku.baidu.com/link?url=zSDn1fRKXlfafc_tbofxw1mTaY0LgtH4GWHqs5rl8w2l5I4GF35PmiO43Cnz3YeFrrkGsXgnFmqoKGGaCrylnBgx4cZC3vymiRYvC4d3DF3自组织特征映射神经网络(Self-OrganizingFeatureMap。也称Kohonen映 查看详情

机器学习之逐次下降法(机器学习算法原理与实践)郑捷

逐次下降法的定义:对于给定的方程组,使用公式:  其中k为迭代次数(k=0,1,2,…) 逐步代入求近似解的方法称为迭代法如果存在(记为),称此迭代法收敛,显然就是方程组的解,否则称此迭代法发散。研究的收敛... 查看详情

《机器学习算法原理与编程实践》学习笔记

(上接第一章)1.2对象、矩阵与矢量化编程1.2.1对象与维度(略)1.2.2初识矩阵(略)1.2.3矢量化编程与GPU运算(略)1.2.4理解数学公式与NumPy矩阵运算1.矩阵的初始化#coding:utf-8importnumpyasnp#导入NumPy包#创建3*5的全0矩阵和全1的矩阵my... 查看详情

《机器学习算法原理与编程实践》学习笔记

(上接第一章)1.2.5Linalg线性代数库  在矩阵的基本运算基础之上,NumPy的Linalg库可以满足大多数的线性代数运算。  .矩阵的行列式  .矩阵的逆  .矩阵的对称  .矩阵的秩  .可逆矩阵求解线性方程1.矩阵的行列式In[4... 查看详情

机器学习算法与编程实践之中文文本分类

这周学习了机器学习算法与编程实践第二章——中文文本分类的部分内容。该章以文本挖掘为大背景,以文本分类算法为中心,详细介绍了中文文本分类项目的相关知识点。一、文本挖掘与文本分类的概念被普遍认可的文本挖掘... 查看详情

机器学习算法原理与编程实践之朴素贝叶斯分类

在介绍朴素贝叶斯分类之前,首先介绍一下大家都比较了解的贝叶斯定理,即已知某条件概率,如何得到两个时间交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)?可以通过如下公式求得:而朴素贝叶斯分类是一种简单... 查看详情

常用机器学习算法knn原理与实践

推荐两篇讲解与实践KNN比较好博客,感谢原作者总结http://blog.csdn.net/u012162613/article/details/41768407http://www.cnblogs.com/ybjourney/p/4702562.html 查看详情

阅读书单2020

...程序深入浅出密码学——常用加密技术原理与应用机器学习深入理解Java虚拟机:JVM高级特性与最佳实践HotSpot实战深入浅出promethuseElasticSearch源码解析与优化实践Tensorflow:实战Google深度学习框架深度学习原理与实践深度学... 查看详情

《深度卷积神经网络原理与实践》笔记第一章机器学习基础

...记(Version:1.0.2)整理作者:sq_csl第一章机器学习基础1.1机器学习概述1.1.1概念概念ML(MachineLearning)是一门发展了比较长时间的学科,其在发展过程中定义也发生了一些变化早期概念源于TomMit 查看详情

机器学习笔记_prml_adaboost算法的原理与推导

转自:http://blog.csdn.net/v_july_v/article/details/40718799 Adaboost算法的原理与推导 1Adaboost的原理1.1Adaboost是什么     AdaBoost,是英文"AdaptiveBoosting"(自适应增强)的缩写,由YoavFreund和Robert 查看详情

特征值与特征向量

取至:机器学习算法原理与编程实践(郑捷) #-*-coding:utf-8-*-#Filename:matrix05.pyimportoperatorfromnumpyimport*eps=1.0e-6#误差量#矩阵的特征值和特征向量A=mat([[8,1,6],[3,5,7],[4,9,2]])evals,evecs=linalg.eig(A)print"特征值:",evals,"\n 查看详情

《ros理论与实践》学习笔记机器人语音交互(代码片段)

《ROS理论与实践》学习笔记(七)机器人语音交互课程内容1.讯飞开放平台使用2.ROS语音识别与语音输出3.语音交互本讲作业结语在学习《ROS理论与实践》课程时,记录了学习过程中的编程练习,课后作业以及发现... 查看详情

学习笔记|机器学习决策树

文章目录一、算法原理二、基础知识1.自信息、信息熵与条件熵2.信息增益和增益率3.Gini值和Gini指数三、过拟合与剪枝四、连续值和缺失值处理1.连续值处理2.缺失值处理五、总结通过这篇博客,您将收获如下知识:熟悉决策树相... 查看详情

学习笔记|机器学习决策树

文章目录一、算法原理二、基础知识1.自信息、信息熵与条件熵2.信息增益和增益率3.Gini值和Gini指数三、过拟合与剪枝四、连续值和缺失值处理1.连续值处理2.缺失值处理五、总结通过这篇博客,您将收获如下知识:熟悉决策树相... 查看详情