朴素贝叶斯python代码实现
朴素贝叶斯分类器详解及中文文本舆情分析(附代码实践)
朴素贝叶斯分类器详解及中⽂⽂本舆情分析(附代码实践)本⽂主要讲述朴素贝叶斯分类算法并实现中⽂数据集的舆情分析案例,希望这篇⽂章对⼤家有所帮助,提供些思路。
内容包括:1.朴素贝叶斯数学原理知识2.naive_bayes⽤法及简单案例3.中⽂⽂本数据集预处理4.朴素贝叶斯中⽂⽂本舆情分析本篇⽂章为基础性⽂章,希望对你有所帮助,如果⽂章中存在错误或不⾜之处,还请海涵。
同时,推荐⼤家阅读我以前的⽂章了解基础知识。
▌⼀. 朴素贝叶斯数学原理知识朴素贝叶斯(Naive Bayesian)是基于贝叶斯定理和特征条件独⽴假设的分类⽅法,它通过特征计算分类的概率,选取概率⼤的情况,是基于概率论的⼀种机器学习分类(监督学习)⽅法,被⼴泛应⽤于情感分类领域的分类器。
下⾯简单回顾下概率论知识:1.什么是基于概率论的⽅法?通过概率来衡量事件发⽣的可能性。
概率论和统计学是两个相反的概念,统计学是抽取部分样本统计来估算总体情况,⽽概率论是通过总体情况来估计单个事件或部分事情的发⽣情况。
概率论需要已知数据去预测未知的事件。
例如,我们看到天⽓乌云密布,电闪雷鸣并阵阵狂风,在这样的天⽓特征(F)下,我们推断下⾬的概率⽐不下⾬的概率⼤,也就是p(下⾬)>p(不下⾬),所以认为待会⼉会下⾬,这个从经验上看对概率进⾏判断。
⽽⽓象局通过多年长期积累的数据,经过计算,今天下⾬的概率p(下⾬)=85%、p(不下⾬)=15%,同样的 p(下⾬)>p(不下⾬),因此今天的天⽓预报肯定预报下⾬。
这是通过⼀定的⽅法计算概率从⽽对下⾬事件进⾏判断。
2.条件概率若Ω是全集,A、B是其中的事件(⼦集),P表⽰事件发⽣的概率,则条件概率表⽰某个事件发⽣时另⼀个事件发⽣的概率。
假设事件B发⽣后事件A发⽣的概率为:设P(A)>0,则有 P(AB) = P(B|A)P(A) = P(A|B)P(B)。
设A、B、C为事件,且P(AB)>0,则有 P(ABC) = P(A)P(B|A)P(C|AB)。
朴素贝叶斯算法及其代码实现
朴素贝叶斯算法及其代码实现朴素贝叶斯朴素贝叶斯是经典的机器学习算法之⼀,也是为数不多的基于概率论的分类算法。
在机器学习分类算法中,朴素贝叶斯和其他绝多⼤的分类算法都不同,⽐如决策树,KNN,逻辑回归,⽀持向量机等,他们都是判别⽅法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数,要么是条件分布。
但是朴素贝叶斯却是⽣成⽅法,这种算法简单,也易于实现。
1.基本概念朴素贝叶斯:贝叶斯分类是⼀类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。
⽽朴素贝叶斯分类时贝叶斯分类中最简单,也是最常见的⼀种分类⽅法。
贝叶斯公式:先验概率P(X):先验概率是指根据以往经验和分析得到的概率。
后验概率P(Y|X):事情已经发⽣,要求这件事情发⽣的原因是由某个因素引起的可能性的⼤⼩,后验分布P(Y|X)表⽰事件X已经发⽣的前提下,事件Y发⽣的概率,叫做事件X发⽣下事件Y的条件概率。
后验概率P(X|Y):在已知Y发⽣后X的条件概率,也由于知道Y的取值⽽被称为X的后验概率。
朴素:朴素贝叶斯算法是假设各个特征之间相互独⽴,也是朴素这词的意思,那么贝叶斯公式中的P(X|Y)可写成:朴素贝叶斯公式:2,贝叶斯算法简介 贝叶斯⽅法源域它⽣前为解决⼀个“逆概”问题写的⼀篇⽂章。
其要解决的问题: 正向概率:假设袋⼦⾥⾯有N个⽩球,M个⿊球,你伸⼿进去摸⼀把,摸出⿊球的概率是多⼤ 逆向概率:如果我们事先不知道袋⼦⾥⾯⿊⽩球的⽐例,⽽是闭着眼睛摸出⼀个(或者好⼏个)球,观察这些取出来的球的颜⾊之后,那么我们可以就此对袋⼦⾥⾯的⿊⽩球的⽐例做出什么样的推测。
那么什么是贝叶斯呢?1,现实世界本⾝就是不确定的,⼈类的观察能⼒是有局限性的2,我们⽇常观察到的只是事物表明上的结果,因此我们需要提供⼀个猜测 NaiveBayes算法,⼜称朴素贝叶斯算法。
朴素:特征条件独⽴;贝叶斯:基于贝叶斯定理。
属于监督学习的⽣成模型,实现监督,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为⽀撑。
机器学习:贝叶斯分类器(二)——高斯朴素贝叶斯分类器代码实现
机器学习:贝叶斯分类器(⼆)——⾼斯朴素贝叶斯分类器代码实现⼀⾼斯朴素贝叶斯分类器代码实现⽹上搜索不调⽤sklearn实现的朴素贝叶斯分类器基本很少,即使有也是结合⽂本分类的多项式或伯努利类型,因此⾃⼰写了⼀遍能直接封装的⾼斯类型NB分类器,当然与真正的源码相⽐少了很多属性和⽅法,有兴趣的可以⾃⼰添加。
代码如下(有详细注释):class NaiveBayes():'''⾼斯朴素贝叶斯分类器'''def __init__(self):self._X_train = Noneself._y_train = Noneself._classes = Noneself._priorlist = Noneself._meanmat = Noneself._varmat = Nonedef fit(self, X_train, y_train):self._X_train = X_trainself._y_train = y_trainself._classes = np.unique(self._y_train) # 得到各个类别priorlist = []meanmat0 = np.array([[0, 0, 0, 0]])varmat0 = np.array([[0, 0, 0, 0]])for i, c in enumerate(self._classes):# 计算每个种类的平均值,⽅差,先验概率X_Index_c = self._X_train[np.where(self._y_train == c)] # 属于某个类别的样本组成的“矩阵”priorlist.append(X_Index_c.shape[0] / self._X_train.shape[0]) # 计算类别的先验概率X_index_c_mean = np.mean(X_Index_c, axis=0, keepdims=True) # 计算该类别下每个特征的均值,结果保持⼆维状态[[3 4 6 2 1]]X_index_c_var = np.var(X_Index_c, axis=0, keepdims=True) # ⽅差meanmat0 = np.append(meanmat0, X_index_c_mean, axis=0) # 各个类别下的特征均值矩阵罗成新的矩阵,每⾏代表⼀个类别。
朴素贝叶斯原理、实例与Python实现
朴素贝叶斯原理、实例与Python实现初步理解⼀下:对于⼀组输⼊,根据这个输⼊,输出有多种可能性,需要计算每⼀种输出的可能性,以可能性最⼤的那个输出作为这个输⼊对应的输出。
那么,如何来解决这个问题呢?贝叶斯给出了另⼀个思路。
根据历史记录来进⾏判断。
思路是这样的:1、根据贝叶斯公式:P(输出|输⼊)=P(输⼊|输出)*P(输出)/P(输⼊)2、P(输⼊)=历史数据中,某个输⼊占所有样本的⽐例;3、P(输出)=历史数据中,某个输出占所有样本的⽐例;4、P(输⼊|输出)=历史数据中,某个输⼊,在某个输出的数量占所有样本的⽐例,例如:30岁,男性,中午吃⾯条,其中【30岁,男性就是输⼊】,【中午吃⾯条】就是输出。
⼀、条件概率的定义与贝叶斯公式⼆、朴素贝叶斯分类算法朴素贝叶斯是⼀种有监督的分类算法,可以进⾏⼆分类,或者多分类。
⼀个数据集实例如下图所⽰:现在有⼀个新的样本, X = (年龄:<=30, 收⼊:中,是否学⽣:是,信誉:中),⽬标是利⽤朴素贝叶斯分类来进⾏分类。
假设类别为C(c1=是或 c2=否),那么我们的⽬标是求出P(c1|X)和P(c2|X),⽐较谁更⼤,那么就将X分为某个类。
下⾯,公式化朴素贝叶斯的分类过程。
三、实例下⾯,将下⾯这个数据集作为训练集,对新的样本X = (年龄:<=30, 收⼊:中,是否学⽣:是,信誉:中) 作为测试样本,进⾏分类。
我们可以将这个实例中的描述属性和类别属性,与公式对应起来,然后计算。
参考python实现代码#coding:utf-8# 极⼤似然估计朴素贝叶斯算法import pandas as pdimport numpy as npclass NaiveBayes(object):def getTrainSet(self):dataSet = pd.read_csv('F://aaa.csv')dataSetNP = np.array(dataSet) #将数据由dataframe类型转换为数组类型trainData = dataSetNP[:,0:dataSetNP.shape[1]-1] #训练数据x1,x2labels = dataSetNP[:,dataSetNP.shape[1]-1] #训练数据所对应的所属类型Yreturn trainData, labelsdef classify(self, trainData, labels, features):#求labels中每个label的先验概率labels = list(labels) #转换为list类型labelset = set(labels)P_y = {} #存⼊label的概率for label in labelset:P_y[label] = labels.count(label)/float(len(labels)) # p = count(y) / count(Y)print(label,P_y[label])#求label与feature同时发⽣的概率P_xy = {}for y in P_y.keys():y_index = [i for i, label in enumerate(labels) if label == y] # labels中出现y值的所有数值的下标索引for j in range(len(features)): # features[0] 在trainData[:,0]中出现的值的所有下标索引x_index = [i for i, feature in enumerate(trainData[:,j]) if feature == features[j]]xy_count = len(set(x_index) & set(y_index)) # set(x_index)&set(y_index)列出两个表相同的元素pkey = str(features[j]) + '*' + str(y)P_xy[pkey] = xy_count / float(len(labels))print(pkey,P_xy[pkey])#求条件概率P = {}for y in P_y.keys():for x in features:pkey = str(x) + '|' + str(y)P[pkey] = P_xy[str(x)+'*'+str(y)] / float(P_y[y]) #P[X1/Y] = P[X1Y]/P[Y]print(pkey,P[pkey])#求[2,'S']所属类别F = {} #[2,'S']属于各个类别的概率for y in P_y:F[y] = P_y[y]for x in features:F[y] = F[y]*P[str(x)+'|'+str(y)] #P[y/X] = P[X/y]*P[y]/P[X],分母相等,⽐较分⼦即可,所以有F=P[X/y]*P[y]=P[x1/Y]*P[x2/Y]*P[y] print(str(x),str(y),F[y])features_label = max(F, key=F.get) #概率最⼤值对应的类别return features_labelif__name__ == '__main__':nb = NaiveBayes()# 训练数据trainData, labels = nb.getTrainSet()# x1,x2features = [8]# 该特征应属于哪⼀类result = nb.classify(trainData, labels, features)print(features,'属于',result)#coding:utf-8#朴素贝叶斯算法贝叶斯估计,λ=1 K=2, S=3;λ=1 拉普拉斯平滑import pandas as pdimport numpy as npclass NavieBayesB(object):def__init__(self):self.A = 1 # 即λ=1self.K = 2self.S = 3def getTrainSet(self):trainSet = pd.read_csv('F://aaa.csv')trainSetNP = np.array(trainSet) #由dataframe类型转换为数组类型trainData = trainSetNP[:,0:trainSetNP.shape[1]-1] #训练数据x1,x2labels = trainSetNP[:,trainSetNP.shape[1]-1] #训练数据所对应的所属类型Yreturn trainData, labelsdef classify(self, trainData, labels, features):labels = list(labels) #转换为list类型#求先验概率P_y = {}for label in labels:P_y[label] = (labels.count(label) + self.A) / float(len(labels) + self.K*self.A)#求条件概率P = {}for y in P_y.keys():y_index = [i for i, label in enumerate(labels) if label == y] # y在labels中的所有下标y_count = labels.count(y) # y在labels中出现的次数for j in range(len(features)):pkey = str(features[j]) + '|' + str(y)x_index = [i for i, x in enumerate(trainData[:,j]) if x == features[j]] # x在trainData[:,j]中的所有下标 xy_count = len(set(x_index) & set(y_index)) #x y同时出现的次数P[pkey] = (xy_count + self.A) / float(y_count + self.S*self.A) #条件概率#features所属类F = {}for y in P_y.keys():F[y] = P_y[y]for x in features:F[y] = F[y] * P[str(x)+'|'+str(y)]features_y = max(F, key=F.get) #概率最⼤值对应的类别return features_yif__name__ == '__main__':nb = NavieBayesB()# 训练数据trainData, labels = nb.getTrainSet()# x1,x2features = [10]# 该特征应属于哪⼀类result = nb.classify(trainData, labels, features)print(features,'属于',result)参考链接:https:///ten_sory/article/details/81237169。
朴素贝叶斯文本分类代码(详解)
朴素贝叶斯⽂本分类代码(详解)1from numpy import zeros,array2from math import log34def loadDataSet():5#词条切分后的⽂档集合,列表每⼀⾏代表⼀个email6 postingList=[['your','mobile','number','is','award','bonus','prize'],7 ['new','car','and','house','for','my','parents'],8 ['my','dalmation','is','so','cute','I','love','him'],9 ['today','voda','number','prize', 'receive','award'],10 ['get','new','job','in','company','how','to','get','that'],11 ['free','prize','buy','winner','receive','cash']]12#由⼈⼯标注的每篇⽂档的类标签13 classVec=[1,0,0,1,0,1] #1-spam, 0-ham14return postingList,classVec15 postingList,classVec = loadDataSet()161718#统计所有⽂档中出现的词条列表19def createVocabList(dataSet):20 vocabSet=set([])21#遍历⽂档集合中的每⼀篇⽂档22for document in dataSet:23 vocabSet=vocabSet|set(document)24return list(vocabSet)25 vocabSet = createVocabList(postingList)262728#根据词条列表中的词条是否在⽂档中出现(出现1,未出现0),将⽂档转化为词条向量29def setOfWords2Vec(vocabSet,inputSet):30#新建⼀个长度为vocabSet的列表,并且各维度元素初始化为031 returnVec=[0]*len(vocabSet)32#遍历⽂档中的每⼀个词条33for word in inputSet:34#如果词条在词条列表中出现35if word in vocabSet:36#通过列表获取当前word的索引(下标)37#将词条向量中的对应下标的项由0改为138 returnVec[vocabSet.index(word)]=139else: print('the word: %s is not in my vocabulary! '%'word')40#返回inputet转化后的词条向量41return returnVec4243 trainMatrix = [setOfWords2Vec(vocabSet,inputSet) for inputSet in postingList]444546#训练算法,从词向量计算概率p(w0|ci)...及p(ci)47#@trainMatrix:由每篇⽂档的词条向量组成的⽂档矩阵48#@trainCategory:每篇⽂档的类标签组成的向量49def trainNB0(trainMatrix,trainCategory):50#获取⽂档矩阵中⽂档的数⽬51 numTrainDocs=len(trainMatrix)52#获取词条向量的长度53 numWords=len(trainMatrix[0])54#所有⽂档中属于类1所占的⽐例p(c=1)55 pAbusive=sum(trainCategory)/float(numTrainDocs)56#创建⼀个长度为词条向量等长的列表57 p0Num=zeros(numWords) #ham58 p1Num=zeros(numWords) #spam59 p0Denom=0.060 p1Denom=0.061#遍历每⼀篇⽂档的词条向量62for i in range(numTrainDocs):63#如果该词条向量对应的标签为164if trainCategory[i]==1:65#统计所有类别为1的词条向量中各个词条出现的次数66 p1Num+=trainMatrix[i]67#统计类别为1的词条向量中出现的所有词条的总数68#即统计类1所有⽂档中出现单词的数⽬69 p1Denom+=sum(trainMatrix[i])70else:71#统计所有类别为0的词条向量中各个词条出现的次数72 p0Num+=trainMatrix[i]73#统计类别为0的词条向量中出现的所有词条的总数74#即统计类0所有⽂档中出现单词的数⽬75 p0Denom+=sum(trainMatrix[i])76print(p1Num, p1Denom, p0Num,p0Denom )77#利⽤NumPy数组计算p(wi|c1)78 p1Vect=p1Num/p1Denom #为避免下溢出问题,需要改为log()79#利⽤NumPy数组计算p(wi|c0)80 p0Vect=p0Num/p0Denom #为避免下溢出问题,需要改为log()81return p0Vect,p1Vect,pAbusive8283 p0Vect,p1Vect,pAbusive= trainNB0(trainMatrix,classVec)848586#朴素贝叶斯分类函数87#@vec2Classify:待测试分类的词条向量88#@p0Vec:类别0所有⽂档中各个词条出现的频数p(wi|c0)89#@p0Vec:类别1所有⽂档中各个词条出现的频数p(wi|c1)90#@pClass1:类别为1的⽂档占⽂档总数⽐例91def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):92#根据朴素贝叶斯分类函数分别计算待分类⽂档属于类1和类0的概率93 p1=sum(vec2Classify*p1Vec)+log(pClass1)94 p0=sum(vec2Classify*p0Vec)+log(1.0-pClass1)95if p1>p0:96return'spam'97else:98return'not spam'99100101102 testEntry=['love','my','job']103 thisDoc=array(setOfWords2Vec(vocabSet,testEntry))104print(testEntry,'classified as:',classifyNB(thisDoc,p0Vect,p1Vect,pAbusive))。
朴素贝叶斯分类器基本代码n折交叉优化
朴素贝叶斯分类器基本代码n折交叉优化⾃⼰也是刚刚⼊门。
没脸把⾃⼰的代码放上去,先⽤别⼈的。
加上⾃⼰的解析,挺全⾯的,希望有⽤。
import reimport pandas as pdimport numpy as npfrom sklearn.metrics import roc_auc_scorefrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.naive_bayes import MultinomialNB as MNB #朴素贝叶斯公式from sklearn.model_selection import cross_val_scoredef proces(review):#把review转成词序列review_text=re.sub("[^a-zA-Z]","",review) #⾮⼤⼩写字母的字符替换成空格#re.sub是正则表达式的函数,实现⽐普通字符串更强⼤的替换功能#print(review_text)words=review_text.lower().split() #全转换为⼩写后,根据空格分割单词#print(words)return wordstrain=pd.read_csv('train.csv',lineterminator='\n') #使⽤pandas的read读取⽂件,以换⾏符号为⽌为⼀段数据'''官⽅⽂件:pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer',names=None, index_col=None, usecols=None, squeeze=False, prefix=None,mangle_dupe_cols=True, dtype=None, engine=None, converters=None,true_values=None, false_values=None, skipinitialspace=False,skiprows=None, nrows=None, na_values=None, keep_default_na=True,na_filter=True, verbose=False, skip_blank_lines=True,parse_dates=False, infer_datetime_format=False, keep_date_col=False,date_parser=None, dayfirst=False, iterator=False, chunksize=None,compression='infer', thousands=None, decimal=b'.', lineterminator=None,quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None,dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True,skipfooter=0, doublequote=True, delim_whitespace=False,low_memory=True, memory_map=False, float_precision=None)https:///sinat_35562946/article/details/81058221这个博客讲的还⾏'''print(train.head(5))x=train['review']#print(x)y=train['label']#print(y)'''x与y分离train中的记录和标签'''class_mapping = {'Negative': 0, 'Positive': 1}y=y.map(class_mapping)#把label中的Negative,Positive转换成0,1标签test=pd.read_csv('test.csv', lineterminator='\n')z=test['review']w=test['label']'''x与y分离test中的记录和标签'''w=w.map(class_mapping)train_data=[]for i in range(len(x)):train_data.append(''.join(proces(x[i]))) #⽤空格将train.data的list⾥的words串联在⼀起passtest_data=[]for i in range(len(z)):test_data.append(''.join(proces(z[i]))) #⽤空格将test_data的list⾥的words串联在⼀起passdata_all=train_data+test_data #所有词合并成⼤表data#print(data_all)#TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
python库中的5种贝叶斯算法
python库中的5种贝叶斯算法Python是一种广泛使用的编程语言,拥有丰富的库和工具包,其中包括了多种贝叶斯算法。
贝叶斯算法是一类基于贝叶斯定理的统计学方法,可以用于分类、聚类、概率估计等任务。
在Python中,我们可以使用以下5种常见的贝叶斯算法来解决不同的问题。
1. 朴素贝叶斯算法(Naive Bayes)朴素贝叶斯算法是一种简单而有效的分类算法,它假设所有特征之间相互独立。
在文本分类、垃圾邮件过滤等任务中得到了广泛应用。
在Python中,我们可以使用scikit-learn库中的`sklearn.naive_bayes`模块来实现朴素贝叶斯算法。
该模块提供了多种朴素贝叶斯分类器的实现,如高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯。
2. 高斯朴素贝叶斯算法(Gaussian Naive Bayes)高斯朴素贝叶斯算法假设特征的概率分布服从高斯分布。
它常用于处理连续型特征的分类问题。
在Python中,我们可以使用scikit-learn库中的`sklearn.naive_bayes.GaussianNB`类来实现高斯朴素贝叶斯算法。
该类提供了`fit`和`predict`等方法,可以用于拟合模型和进行预测。
3. 多项式朴素贝叶斯算法(Multinomial Naive Bayes)多项式朴素贝叶斯算法适用于处理离散型特征的分类问题,如文本分类中的词频统计。
在Python中,我们可以使用scikit-learn库中的`sklearn.naive_bayes.MultinomialNB`类来实现多项式朴素贝叶斯算法。
该类同样提供了`fit`和`predict`等方法,可以用于拟合模型和进行预测。
4. 伯努利朴素贝叶斯算法(Bernoulli Naive Bayes)伯努利朴素贝叶斯算法适用于处理二值型特征的分类问题,如文本分类中的二进制词袋模型。
在Python中,我们可以使用scikit-learn库中的`sklearn.naive_bayes.BernoulliNB`类来实现伯努利朴素贝叶斯算法。
基于朴素贝叶斯的新闻分类算法设计与实现
3. 模型训练
使用提取的特征和对 应的标签训练朴素贝 叶斯分类器。在训练 过程中,我们需要根 据训练数据计算每个 特征的条件概率和类 先验概率
算法设计
4. 模型评估与优化
算法设计
训练完成后,我们使 用测试数据集评估模 型的性能。常见的评 估指标有准确率、召 回率和F1得分。如果 模型的性能不理想, 我们可以调整模型参 数或使用其他优化方 法
Part 2
算法实现
算法实现
在Python中,我们可以使用scikit-learn库实现朴素贝叶斯新闻分类算法。以下是一个简 单的示例代码
-
THANKS !
20XX
基于朴素贝叶斯的新闻 分类算法设计与实现
演讲者:xxx
-
1 算法设计 2 算法实现
基于朴素贝叶斯的新闻分类算法设计与实现
在筛选新闻变得越来越重要
朴素贝叶斯分类器是一种基于贝叶斯定理的简 单概率分类器,具有高效、准确、易于理解等
优点,适用于文本分类任务
Part 1
算法设计
算法设计
1. 数据预处理
首先,我们需要对新闻数据进行预处理。 这包括分词、去除停用词、去除特殊符号 等步骤,以便提取出新闻的主题和内容
算法设计
2. 特征提取
在预处理之后,我们需要从新闻 文本中提取特征。常见的特征包 括词频、TF-IDF等。这些特征可 以反映新闻的主题和内容
Python贝叶斯文本分类模型从原理到实现
Python贝叶斯文本分类模型从原理到实现朴素贝叶斯分类器是一种有监督学习,常见有两种模型,多项式模型(multinomial model)即为词频型和伯努利模型(Bernoulli model)即文档型。
二者的计算粒度不一样,多项式模型以单词为粒度,伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。
计算后验概率时,对于一个文档d,多项式模型中,只有在d中出现过的单词,才会参与后验概率计算,伯努利模型中,没有在d中出现,但是在全局单词表中出现的单词,也会参与计算,不过是作为“反方”参与的(避免消除测试文档时类条件概率中有为0现象而做的取对数等问题)。
一、数据集数据集是有8个分类的文本数据集,使用了结巴分词对每个文本分词,每个单词当作特征,再利用二元词串构造更多特征,然后去掉停用词,去掉出现次数太多和太少的特征,得到了19630个特征。
取1998个样本用于训练,509个用于测试。
基于词袋模型的思路将每个文本转换为向量,训练集和测试集分别转换为矩阵,并用python numpy模块将其保存为npy格式。
数据集共使用了19630个单词作为特征,特征值是词在文本中出现的次数。
8个分类,分别是1、2、...、8。
训练集共1998个样本,测试集共509个样本。
二、朴素贝叶斯分类器划分邮件算法朴素贝叶斯分类器,基于贝叶斯定理,是一个表现良好的分类方法。
1、公式原理推导主要根据事件间的相互影响进行公式推断。
1.1、条件概率:P(A|B) = P(A,B)/P(B)A和B是随机事件,P(A|B)也就是在事件B发生的前提下事件A发生的概率。
P(A,B)表示A、B都发生的概率。
这样一来,我们可以通过统计结果计算条件概率。
例如假设有1000封邮件,垃圾邮件有300封,出现单词购买的邮件为50封,而即是垃圾邮件又同时出现了购买这个单词的邮件共有20封。
如果把垃圾邮件看成事件A,邮件里出现单词购买看成事件B,那么P(A)是指垃圾邮件出现的概率,因为没考虑其他的因素对A的影响,也可以将P(A)看做A的先验概率,这里:P(A) = 300/1000 = 0.3同理,P(B) = 50/1000 = 0.05P(A,B)是指A和B同时发生的概率,P(A,B) = 20/1000 = 0.02根据条件概率的公式,能够得到P(A|B) = 0.02 / 0.05 = 0.4因为有B的影响,P(A|B)也叫做A的后验概率。
机器学习Python实战-课件 06基于朴素贝叶斯算法的分类模型
• (4)score(X,y):返回给定测试数据和实际标签相匹配的平均准确率。
6.1.3 高斯朴素贝叶斯算法
• 高斯分布就是正态分布,高斯朴素贝叶斯就是先验为高斯分布的朴素贝叶
斯。
• 我们把一个随机变量X服从数学期望为μ、方差为σ2的数据分布称为正态分
布,当数学期望μ=0,方差σ=1时称为标准正态分布。如下图所示:
• 多项式朴素贝叶斯的特征矩阵经常是稀疏矩阵(不一定总是稀疏矩阵),
适合离散特征的分类问题。(例如:文本分类中的单词计数)。
6.1.4 多项式朴素贝叶斯算法
• 1. 多项式朴素贝叶斯原理 • 假设存在一人,名叫张三,张三于某日打开电脑邮箱查看邮件,收到了来自家人跟朋友的正常邮
件共8封,以及来自各种广告商发的垃圾邮件共4封,张三想要利用这些邮件来制作一个可以过滤 垃圾邮件的模型。
• class sklearn.naive_bayes. GaussianNB(priors=None, var_smoothing=1e-09)
• 参数说明如下:
• priors:表示类的先验概率,对应Y的各个类别的先验概率P(Y=Ck)。这个值默认不给定, 如果没有给定,模型则根据样本数据自己计算;如果给出的话就以priors 为准。
6.1.2 伯努利朴素贝叶斯
• 参数说明如下: • alpha:float类型,平滑因子,默认等于1。当等于1时表示拉普拉斯平滑(拉普拉斯平滑是用来
处理朴素贝叶斯方法中可能出现的零概率问题)。
• binarize:float类型或者None。如果该参数为None,那么假定原始数据已经二元化 了;如果该参
6.1.1朴素贝叶斯原理
• 3. 算法原理
• 朴素贝叶斯算法是以贝叶斯定理为基础并且假设特征条件之间相互独立的方法, 先通过已给定的训练集,以特征词之间独立作为前提假设,学习从输入到输出 的联合概率分布,再基于学习到的模型,输入X求出使得后验概率最大的输出Y。
第五篇:朴素贝叶斯分类算法原理分析与代码实现
第五篇:朴素贝叶斯分类算法原理分析与代码实现前⾔本⽂介绍机器学习分类算法中的朴素贝叶斯分类算法并给出伪代码,Python代码实现。
词向量朴素贝叶斯分类算法常常⽤于⽂档的分类,⽽且实践证明效果挺不错的。
在说明原理之前,先介绍⼀个叫词向量的概念。
--- 它⼀般是⼀个布尔类型的集合,该集合中每个元素都表⽰其对应的单词是否在⽂档中出现。
⽐如说,词汇表只有三个单词:'apple', 'orange', 'melo',某⽂档中,apple和melo出现过,那么其对应的词向量就是 {1, 0, 1}。
这种模型通常称为词集模型,如果词向量元素是整数类型,每个元素表⽰相应单词在⽂档中出现的次数(0表⽰不出现),那这种模型就叫做词袋模型。
如下部分代码可⽤于由⽂档构建词向量以及测试结果:1#====================================2# 输⼊:3# 空4# 输出:5# postingList: ⽂档列表6# classVec: 分类标签列表7#====================================8def loadDataSet():9'创建测试数据'1011# 这组数据是从斑点狗论坛获取的12 postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],13 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],14 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],15 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],16 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],17 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]1819# 1 表⽰带敏感词汇20 classVec = [0,1,0,1,0,1]2122return postingList,classVec2324#====================================25# 输⼊:26# dataSet: ⽂档列表27# 输出:28# list(vocabSet): 词汇表29#====================================30def createVocabList(dataSet):31'创建词汇表'3233 vocabSet = set([])34for document in dataSet: # 遍历⽂档列表35# ⾸先将当前⽂档的单词唯⼀化,然后以交集的⽅式加⼊到保存词汇的集合中。
因果关系分类代码实现
因果关系分类代码实现因果关系分类是一个复杂的任务,涉及到对事件之间的因果关系进行推断。
这通常需要大量的训练数据,并且需要复杂的模型来处理这种关系的不确定性。
下面是一个简单的Python代码示例,使用朴素贝叶斯分类器进行因果关系分类。
首先,我们需要一些训练数据。
假设我们有一些观察到的因果关系,例如:pythontraining_data = [("下雨", "地面湿"),("开灯", "照亮房间"),("按下按钮", "闹钟响起"),#]然后,我们可以使用朴素贝叶斯分类器来训练模型:pythonfrom sklearn.naive_bayes import GaussianNBdef train_causal_classifier(training_data):causal_classifier = GaussianNB()X, y = [], []for cause, effect in training_data:X.append(cause)y.append(effect)causal_classifier.fit(X, y)return causal_classifier现在,我们可以使用这个分类器来推断因果关系。
例如,如果我们看到"灯亮"这一事件,我们可以询问"这是什么原因造成的?":pythondef predict_cause(classifier, effect):cause = classifier.predict([effect])[0]return cause这个函数将返回最可能的因果关系。
请注意,这个例子是非常简化的,实际的因果关系分类可能会更复杂。
例如,因果关系可能涉及到多个事件,或者可能需要处理不确定性和概率。
你可能需要使用更复杂的模型,例如深度学习模型,或者使用概率图模型来处理这种不确定性。
Python语言中的机器学习算法介绍
Python语言中的机器学习算法介绍机器学习作为一种可以让机器自动学习并改善性能的算法,是计算机科学领域中的一个重要分支。
而Python语言中,也有许多强大的机器学习算法,比如分类算法、聚类算法、回归分析等等。
本文将对Python语言中的机器学习算法做一个介绍,包括算法的基本原理和应用场景。
一、分类算法分类算法是机器学习中最常见的一种算法。
其基本思想是将给定的数据分为若干个类别,这些类别是已知的,模型的任务就是学习将数据映射到正确的类别上。
在Python语言中,应用比较广泛的分类算法有朴素贝叶斯、决策树、支持向量机等。
(1)朴素贝叶斯朴素贝叶斯算法是最简单的分类算法之一,它的基本思想是利用贝叶斯定理计算在某些给定数据下某个类别的概率。
具体来说,朴素贝叶斯算法将数据转换为相应变量的条件概率,然后利用贝叶斯定理计算出某个类别的后验概率,最终确定数据所属的类别。
(2)决策树决策树是一种基于树形结构的分类算法,其基本思想是通过一系列决策,将数据逐步分为不同的类别。
决策树算法的核心在于构建决策树模型,该模型对数据进行判断和分类,从而得出数据的分类结果。
决策树算法在实现上比较简单,且易于解释,因此得到了广泛的应用。
(3)支持向量机支持向量机是一种通过将数据映射到一个高维空间中,并在此空间中寻找最佳分类面的分类算法。
支持向量机的主要思想是在数据集中找到最近的一些数据点,也就是“支持向量”,并将其投影到一个超平面上。
支持向量机算法参数的调节对算法的性能有很大的影响,因此在实际应用中需要仔细调参。
二、聚类算法聚类算法是机器学习中寻找相似性的一种算法,其主要任务是将数据集中的数据划分为若干个类别,每个类别中的数据具有相似性,而不同类别中的数据则具有明显的差异。
Python语言中应用比较广泛的聚类算法有K-means、谱聚类等。
(1)K-meansK-means算法是一种基于距离的聚类算法,其基本思想是将数据集中的数据划分为K个簇,使得每个簇内的数据具有最小的距离,并且不同簇之间的距离最大。
Python中的分类算法
Python中的分类算法分类算法是机器学习中一个重要的分支,其目的是通过对已知样本的学习,构建一个能够对未知样本进行正确分类的模型。
在Python 中,常用的分类算法包括决策树、支持向量机、朴素贝叶斯等。
本文将分别介绍这3种常用的分类算法,并且分析其优缺点以及应用场景,以帮助读者选择最适合自己需求的算法。
一、决策树决策树是一个树形结构,每个内部节点表示一个属性判断,每个分支代表一个属性的取值,每个叶节点表示一种分类结果。
具体的建树过程是从根节点开始,选择一个最优属性判断,根据属性的取值进行分支,直到叶节点为止。
决策树算法的优点是易于理解和解释,可以处理不完整的数据、缺失值和非数值属性,适用于多分类问题。
决策树模型的训练过程时间复杂度较低,在处理大规模数据时具有一定的优势。
然而,决策树算法的缺点也是非常明显的。
当决策树过于复杂时容易出现过拟合现象,这样就会导致模型在应用新数据时的性能下降。
在处理连续性数据和样本数据分布有偏时,决策树的表现也较为欠佳。
二、支持向量机支持向量机是一种二分类模型,其基本思想是在给定的数据集中,构建一个能够进行最大间隔分类的超平面。
在构建超平面时,SVM算法需要寻找使得分类间隔最大的支持向量。
在分类时,SVM算法将新样本点映射到特征空间中,通过超平面的位置和方向来进行判断。
支持向量机算法的优点是可以有效地处理高维数据和非线性问题,具有较好的泛化能力,在数据较少、样本不平衡的情况下也能取得较好的结果。
同时,由于SVM算法本身只需要用到支持向量,所以样本规模较大时也能保证运算速度较快。
然而,支持向量机算法也存在一些缺点。
为了确保最大间隔,SVM算法对局部异常点比较敏感,需要进行损失函数,而选择不同的损失函数可能会影响算法的性能。
此外,在多分类问题上,SVM算法需要进行多次二分类,效率较低。
三、朴素贝叶斯朴素贝叶斯算法是基于贝叶斯定理和特征独立假设的一种分类算法。
对于给定的样本,朴素贝叶斯算法将其对应的特征向量作为输入,根据贝叶斯定理计算其属于某一类的概率,并选取概率最大的那个类别作为其分类标签。
贝叶斯分类器代码
贝叶斯分类器代码贝叶斯分类器是一种基于贝叶斯定理的机器学习算法,它可以用于分类、预测等任务。
在实际应用中,我们通常需要编写代码来实现贝叶斯分类器。
以下是一个简单的贝叶斯分类器代码示例:```import numpy as npclass NaiveBayesClassifier:def __init__(self):self.classes = Noneself.class_priors = Noneself.mean = Noneself.variance = Nonedef fit(self, X, y):self.classes = np.unique(y)n_classes = len(self.classes)# 计算每个类别的先验概率class_counts = np.zeros(n_classes)for i in range(n_classes):class_counts[i] = np.sum(y == self.classes[i])self.class_priors = class_counts / len(y)# 计算每个类别下每个特征的均值和方差n_features = X.shape[1]self.mean = np.zeros((n_classes, n_features)) self.variance = np.zeros((n_classes, n_features))for i in range(n_classes):X_i = X[y == self.classes[i], :]self.mean[i, :] = np.mean(X_i, axis=0)self.variance[i, :] = np.var(X_i, axis=0)def predict(self, X):n_samples, n_features = X.shapey_pred = np.zeros(n_samples)for i in range(n_samples):posteriors = []# 计算每个类别的后验概率for j in range(len(self.classes)):prior = np.log(self.class_priors[j])likelihood = np.sum(np.log(self._gaussian_pdf(X[i, :], self.mean[j, :], self.variance[j, :])))posterior = prior + likelihoodposteriors.append(posterior)# 选择后验概率最大的类别作为预测结果y_pred[i] = self.classes[np.argmax(posteriors)]return y_preddef _gaussian_pdf(self, x, mean, variance):exponent = -0.5 * ((x - mean) ** 2 / variance)coeff = 1.0 / np.sqrt(2.0 * np.pi * variance)return coeff * np.exp(exponent)```该代码实现了一个简单的高斯朴素贝叶斯分类器。
贝叶斯分类代码
贝叶斯分类是一种基于贝叶斯定理与特征之间独立假设的分类方法。
下面是一个简单的朴素贝叶斯分类器的Python代码示例:```pythonimport numpy as npfrom sklearn.naive_bayes import GaussianNBfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score# 加载数据集iris = load_iris()X = iris.datay = iris.target# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建朴素贝叶斯分类器对象gnb = GaussianNB()# 训练模型gnb.fit(X_train, y_train)# 预测测试集结果y_pred = gnb.predict(X_test)# 计算准确率accuracy = accuracy_score(y_test, y_pred)print('Accuracy: %.2f%%' % (accuracy * 100))```以上代码使用的是高斯朴素贝叶斯分类器,适用于连续特征或至少可以离散化为连续特征的情况。
如果你的数据特征中存在类别特征,你可以考虑使用多项式朴素贝叶斯分类器,只需将`GaussianNB()` 替换为 `MultinomialNB()` 即可。
python 贝叶斯ai代码
一、概述随着人工智能技术的不断发展和应用,贝叶斯算法作为一种重要的概率统计推断方法,被广泛应用于机器学习、自然语言处理、数据挖掘等领域。
而在人工智能领域中,Python作为一种简单易学、功能强大的编程语言,被广泛应用于贝叶斯算法的实现与应用。
本文将介绍如何使用Python编写贝叶斯算法的人工智能代码。
二、Python语言简介Python是一种高级编程语言,由Guido van Rossum在1989年设计并开发。
Python的设计哲学强调代码的可读性与简洁性,使得其成为一种优秀的编程语言。
Python拥有丰富的标准库和第三方库,能够方便地实现各种机器学习算法。
三、贝叶斯算法概述贝叶斯算法基于贝叶斯定理,是一种利用先验概率和样本信息进行概率推断的方法。
在机器学习领域,贝叶斯算法被广泛应用于分类、回归、聚类等问题的求解。
其核心思想是通过已知的样本信息和先验概率,计算后验概率以进行决策。
四、贝叶斯算法的Python实现1. 导入必要的库在Python中实现贝叶斯算法需要导入一些必要的库,例如numpy、scipy等。
这些库提供了丰富的数学函数和数据处理功能,能够方便地实现概率计算和统计分析。
2. 构建贝叶斯模型在Python中,可以使用贝叶斯网络库如PyMC3、pymc等来构建贝叶斯模型。
这些库提供了方便的API,能够帮助开发者快速搭建概率图模型,定义概率分布等。
3. 参数估计与推断一旦贝叶斯模型构建完成,就可以利用Python中的数值计算库进行参数估计与推断。
例如使用MCMC算法进行后验分布的采样,得到后验概率分布,进而进行决策或预测。
4. 应用案例除了在理论研究中使用Python实现贝叶斯算法,贝叶斯算法还广泛应用于实际问题的解决。
例如在医疗诊断、风险评估、金融预测等领域,都可以借助Python实现贝叶斯算法来解决问题。
五、贝叶斯算法在本人中的应用1. 分类问题在机器学习中,分类问题是常见的任务之一。
贝叶斯融合用python实现
贝叶斯融合用python实现贝叶斯融合是一种常用的机器学习方法,通过结合不同来源的信息,可以得到更准确的预测结果。
在本文中,我们将使用Python来实现贝叶斯融合。
让我们来了解一下贝叶斯融合的原理。
贝叶斯融合是基于贝叶斯定理的一种方法,它可以用来计算在给定一些证据的情况下,某个假设的概率。
在贝叶斯融合中,我们将不同来源的信息视为不同的证据,然后根据这些证据来计算最终的预测结果。
在Python中,我们可以使用`numpy`库来进行贝叶斯融合的计算。
首先,我们需要定义不同来源的信息和它们的权重。
假设我们有两个来源的信息,分别为A和B,权重分别为wA和wB。
然后,我们需要定义每个来源的概率分布。
假设我们可以得到A的概率分布为pA和B的概率分布为pB。
接下来,我们将使用贝叶斯定理来计算在给定A和B的情况下,某个假设H的概率。
贝叶斯定理可以表示为:P(H|A,B) = (P(A|H) * P(B|H) * P(H)) / (P(A) * P(B))其中,P(H|A,B)表示在给定A和B的情况下,假设H成立的概率;P(A|H)和P(B|H)分别表示在假设H成立的情况下,得到A和B的概率;P(H)表示假设H成立的先验概率;P(A)和P(B)分别表示得到A和B的先验概率。
在贝叶斯融合中,我们可以计算不同假设的后验概率,并选择具有最高后验概率的假设作为最终的预测结果。
在Python中,我们可以使用以下代码来实现贝叶斯融合:```pythonimport numpy as np# 定义不同来源的信息和权重A = [1, 2, 3]B = [4, 5, 6]wA = 0.5wB = 0.5# 定义每个来源的概率分布pA = np.array([0.1, 0.3, 0.6])pB = np.array([0.2, 0.4, 0.4])# 计算后验概率posterior = (pA * pB) / (pA * pB).sum()# 计算加权后的后验概率weighted_posterior = wA * pA + wB * pB# 选择具有最高后验概率的假设作为最终预测结果prediction = np.argmax(weighted_posterior)print("预测结果为:", prediction)```在上述代码中,我们首先定义了不同来源的信息A和B以及它们的权重wA和wB。
朴素贝叶斯好瓜例题算法python
朴素贝叶斯算法是一种常用的分类算法,在机器学习领域有着广泛的应用。
其中,朴素贝叶斯好瓜例题算法是指通过朴素贝叶斯算法来判断一个西瓜是否是好瓜的例题。
在本文中,我们将以Python语言为例,介绍朴素贝叶斯算法在好瓜例题中的应用。
文章将从理论基础、数据准备、模型构建和结果分析等方面展开讲解,希望能够帮助读者更好地了解和应用朴素贝叶斯算法。
一、理论基础朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。
在应用朴素贝叶斯算法解决好瓜例题时,我们需要考虑如何利用西瓜的特征来判断它是好瓜还是坏瓜。
在这里,我们假设有两类好瓜和坏瓜,每个西瓜有颜色、根蒂、敲声和纹理等特征。
我们希望通过这些特征来预测一颗西瓜是好瓜的概率,从而实现分类。
二、数据准备在应用朴素贝叶斯算法之前,我们需要准备好用于训练和测试的数据集。
在好瓜例题中,我们可以收集一些西瓜的样本数据,包括颜色、根蒂、敲声和纹理等特征,并标注它们是好瓜还是坏瓜。
这样我们就可以构建一个西瓜数据集,用于训练和测试朴素贝叶斯模型。
三、模型构建在数据准备好之后,我们可以使用Python语言中的scikit-learn库来构建朴素贝叶斯分类模型。
我们需要将数据集分为训练集和测试集,然后使用训练集来训练朴素贝叶斯模型。
在scikit-learn库中,有多种朴素贝叶斯算法可供选择,包括高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯等。
我们可以根据数据集的特点来选择合适的朴素贝叶斯算法,并利用模型的预测能力来评估模型的准确性。
四、结果分析在模型构建完成之后,我们可以利用测试集来评估模型的预测能力。
通过比较模型预测的结果和实际的标注结果,我们可以计算模型的准确率、精准率、召回率和F1值等指标。
这些指标将帮助我们评估朴素贝叶斯算法在好瓜例题中的表现,并优化模型参数以提高分类性能。
通过以上介绍,我们可以看到朴素贝叶斯算法在好瓜例题中有着广泛的应用前景。
通过Python语言及相关库的支持,我们可以更加方便地实现朴素贝叶斯算法的应用,并为其他分类问题提供参考。
Python 机器学习练习题及答案
Python 机器学习练习题及答案Python 机器学习是近年来备受关注的领域,它结合了Python语言的灵活性和机器学习算法的强大功能,为实现各种智能应用提供了广阔的可能性。
为了帮助大家更好地掌握Python机器学习,下面将提供一些练习题及其答案,希望能对你的学习有所帮助。
1. 练习题:线性回归假设有一个数据集,其中包含了房屋的面积和价格的数据,如何通过线性回归模型预测给定面积的房屋的价格呢?请使用Python代码实现。
解答:```pythonimport numpy as npfrom sklearn.linear_model import LinearRegression# 定义训练数据集X_train = np.array([[100], [200], [300], [400], [500]]) # 房屋的面积y_train = np.array([[150], [250], [350], [450], [550]]) # 房屋的价格# 创建线性回归模型model = LinearRegression()# 训练模型model.fit(X_train, y_train)# 预测房屋价格X_test = np.array([[250]])predicted_price = model.predict(X_test)print(predicted_price)```2. 练习题:朴素贝叶斯分类器假设有一个数据集,其中包含了若干电子邮件和它们对应的标签(垃圾邮件或非垃圾邮件),如何通过朴素贝叶斯分类器对新的电子邮件进行分类呢?请使用Python代码实现。
解答:```pythonfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNB# 定义训练数据集X_train = ['This is a spam email','This is not a spam email','I am the prince of Nigeria','You have won a lottery prize','This is a test email']y_train = ['spam', 'not spam', 'spam', 'spam', 'not spam']# 创建词袋模型count_vectorizer = CountVectorizer()# 将文本数据转换为特征向量X_train_transformed = count_vectorizer.fit_transform(X_train) # 创建朴素贝叶斯分类器model = MultinomialNB()# 训练模型model.fit(X_train_transformed, y_train)# 对新的文本进行分类X_test = ['You have won a prize']X_test_transformed = count_vectorizer.transform(X_test) predicted_label = model.predict(X_test_transformed)print(predicted_label)```3. 练习题:支持向量机假设有一个数据集,其中包含了若干个样本和它们的标签,如何使用支持向量机模型对新的样本进行分类呢?请使用Python代码实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
朴素贝叶斯优点:在数据较少的情况下仍然有效,可以处理多类别问题缺点:对于输入数据的准备方式较为敏感适用数据类型:标称型数据贝叶斯准则:使用朴素贝叶斯进行文档分类朴素贝叶斯的一般过程(1)收集数据:可以使用任何方法。
本文使用RSS源(2)准备数据:需要数值型或者布尔型数据(3)分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好(4)训练算法:计算不同的独立特征的条件概率(5)测试算法:计算错误率(6)使用算法:一个常见的朴素贝叶斯应用是文档分类。
可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。
准备数据:从文本中构建词向量摘自机器学习实战。
[['my','dog','has','flea','problems','help','please'], 0['maybe','not','take','him','to','dog','park','stupid'], 1['my','dalmation','is','so','cute','I','love','him'], 0['stop','posting','stupid','worthless','garbage'], 1['mr','licks','ate','my','steak','how','to','stop','him'], 0['quit','buying','worthless','dog','food','stupid']] 1以上是六句话,标记是0句子的表示正常句,标记是1句子的表示为粗口。
我们通过分析每个句子中的每个词,在粗口句或是正常句出现的概率,可以找出那些词是粗口。
在bayes.py文件中添加如下代码:[python]view plaincopy1.# coding=utf-82.3.def loadDataSet():4. postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],5. ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],6. ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],7. ['stop', 'posting', 'stupid', 'worthless', 'garbage'],8. ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],9. ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]10. classVec = [0, 1, 0, 1, 0, 1] # 1代表侮辱性文字,0代表正常言论11.return postingList, classVec12.13.def createVocabList(dataSet):14. vocabSet = set([])15.for document in dataSet:16. vocabSet = vocabSet | set(document)17.return list(vocabSet)18.19.def setOfWords2Vec(vocabList, inputSet):20. returnVec = [0] * len(vocabList)21.for word in inputSet:22.if word in vocabList:23. returnVec[vocabList.index(word)] = 124.else:25.print"the word: %s is not in my Vocabulary!" % word26.return returnVec运行结果:训练算法:从词向量计算概率[python]view plaincopy1.# 朴素贝叶斯分类器训练函数2.# trainMatrix: 文档矩阵, trainCategory: 由每篇文档类别标签所构成的向量3.def trainNB0(trainMatrix, trainCategory):4. numTrainDocs = len(trainMatrix)5. numWords = len(trainMatrix[0])6. pAbusive = sum(trainCategory) / float(numTrainDocs)7. p0Num = zeros(numWords);8. p1Num = zeros(numWords);9. p0Denom = 0.0;10. p1Denom = 0.0;11.for i in range(numTrainDocs):12.if trainCategory[i] == 1:13. p1Num += trainMatrix[i]14. p1Denom += sum(trainMatrix[i])15.else:16. p0Num += trainMatrix[i]17. p0Denom += sum(trainMatrix[i])18. p1Vect = p1Num / p1Denom19. p0Vect = p0Num / p1Denom20.return p0Vect, p1Vect, pAbusive运行结果:测试算法:根据现实情况修改分类器上一节中的trainNB0函数中修改几处:p0Num = ones(numWords);p1Num = ones(numWords);p0Denom = 2.0;p1Denom = 2.0;p1Vect = log(p1Num / p1Denom)p0Vect = log(p0Num / p1Denom)[python]view plaincopy1.# 朴素贝叶斯分类器训练函数2.# trainMatrix: 文档矩阵, trainCategory: 由每篇文档类别标签所构成的向量3.def trainNB0(trainMatrix, trainCategory):4. numTrainDocs = len(trainMatrix)5. numWords = len(trainMatrix[0])6. pAbusive = sum(trainCategory) / float(numTrainDocs)7. p0Num = ones(numWords);8. p1Num = ones(numWords);9. p0Denom = 2.0;10. p1Denom = 2.0;11.for i in range(numTrainDocs):12.if trainCategory[i] == 1:13. p1Num += trainMatrix[i]14. p1Denom += sum(trainMatrix[i])15.else:16. p0Num += trainMatrix[i]17. p0Denom += sum(trainMatrix[i])18. p1Vect = log(p1Num / p1Denom)19. p0Vect = log(p0Num / p1Denom)20.return p0Vect, p1Vect, pAbusive21.22.# 朴素贝叶斯分类函数23.def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):24. p1 = sum(vec2Classify * p1Vec) + log(pClass1)25. p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)26.if p1 > p0:27.return 128.else:29.return 030.31.def testingNB():32. listOPosts, listClasses = loadDataSet()33. myVocabList = createVocabList(listOPosts)34. trainMat = []35.for postinDoc in listOPosts:36. trainMat.append(setOfWords2Vec(myVocabList, postinDoc))37.38. p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))39.40. testEntry = ['love', 'my', 'dalmation']41. thisDoc = array(setOfWords2Vec(myVocabList, testEntry))42.print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)43.44. testEntry = ['stupid', 'garbage']45. thisDoc = array(setOfWords2Vec(myVocabList, testEntry))46.print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb) 运行结果:准备数据:文档词袋模型词集模型(set-of-words model):每个词是否出现,每个词只能出现一次词袋模型(bag-of-words model):一个词可以出现不止一次[python]view plaincopy1.# 朴素贝叶斯词袋模型2.def bagOfWords2VecMN(vocabList, inputSet):3. returnVec = [0] * len(vocabList)4.for word in inputSet:5.if word in vocabList:6. returnVec[vocabList.index(word)] += 17.return returnVec示例:使用朴素贝叶斯过滤垃圾邮件(1)收集数据:提供文本文件(2)准备数据:将文本文件解析成词条向量(3)分析数据:检查词条确保解析的正确性(4)训练算法:使用我们之前建立的trainNB0()函数(5)测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率(6)使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上准备数据:切分文本使用正则表达式切分句子测试算法:使用朴素贝叶斯进行交叉验证[python]view plaincopy1.# 该函数接受一个大写字符的字串,将其解析为字符串列表2.# 该函数去掉少于两个字符的字符串,并将所有字符串转换为小写3.def textParse(bigString):4.import re5. listOfTokens = re.split(r'\W*', bigString)6.return [tok.lower() for tok in listOfTokens if len(tok) > 2]7.8.# 完整的垃圾邮件测试函数9.def spamTest():10. docList = []11. classList = []12. fullText = []13.# 导入并解析文本文件14.for i in range(1, 26):15. wordList = textParse(open('email/spam/%d.txt' % i).read())16. docList.append(wordList)17. fullText.extend(wordList)18. classList.append(1)19.20. wordList = textParse(open('email/ham/%d.txt' % i).read())21. docList.append(wordList)22. fullText.extend(wordList)23. classList.append(0)24.25. vocabList = createVocabList(docList)26. trainingSet = range(50)27. testSet = []28.# 随机构建训练集29.for i in range(10):30. randIndex = int(random.uniform(0, len(trainingSet)))31. testSet.append(trainingSet[randIndex])32.del(trainingSet[randIndex])33.34. trainMat = []35. trainClasses = []36.for docIndex in trainingSet:37. trainMat.append(setOfWords2Vec(vocabList, docList[docIndex]))38. trainClasses.append(classList[docIndex])39.40. p0V, p1V, pSpam = trainNB0(array(trainMat), array(trainClasses))41. errorCount = 042.# 对测试集分类43.for docIndex in testSet:44. wordVector = setOfWords2Vec(vocabList, docList[docIndex])45.if classifyNB(array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:46. errorCount += 147.print"classification error",docList[docIndex]48.print'the error rate is: ', float(errorCount) / len(testSet)运行结果:因为这些电子邮件是随机选择的,所以每次输出的结果可能会不一样。