网站建设功能解说,信阳住房和城乡建设厅网站,微信小程序注册申请流程图,做经营网站怎么赚钱吗场景
朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器#xff0c;广泛应用于各种机器学习场景。朴素贝叶斯分类器利用贝叶斯定理来预测一个数据点的类别。贝叶斯定理提供了一种计算条件概率的方法#xff0c;即在已知某些信息的情况下#xff0c;事件发生的概率。“…场景
朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器广泛应用于各种机器学习场景。朴素贝叶斯分类器利用贝叶斯定理来预测一个数据点的类别。贝叶斯定理提供了一种计算条件概率的方法即在已知某些信息的情况下事件发生的概率。“朴素”一词源于该算法对特征之间相互独立的假设。在现实世界中这种假设可能并不总是成立但朴素贝叶斯在实践中仍然表现良好。对于给定的训练数据集算法首先基于类别计算特征的概率分布。然后使用这些概率来预测新数据点的类别。
适用场景和用途
·文本分类例如垃圾邮件识别、新闻文章分类。朴素贝叶斯特别适用于处理文本数据因为它能够处理大量的特征如单词。
·情感分析在社交媒体分析、产品评论等领域中识别正面或负面情感。
·推荐系统基于用户的兴趣和偏好预测用户可能喜欢的产品或服务。
·医疗诊断基于症状预测疾病。
·天气预测例如根据历史天气数据预测下雨概率。
案例
假设我们有两个类别0 和 1。类别 0 可以代表“负面评论”类别 1 可以代表“正面评论”。 准备数据集
# 示例数据集
data [This product is great,I am very happy with this purchase,Terrible, I hate it,Worst experience ever,I love this product,Not what I expected,Highly recommended,Very disappointed,Will buy it again,Do not recommend
]# 对应的类别标签
labels [1, 1, 0, 0, 1, 0, 1, 0, 1, 0]
这里我们通过两种方式第一种是python提供好的一个API第二个我们自己根据公式来写一个简单的分类器比对一下效果。
API def python_test(data,labels,vectorizer):# 将数据集转化为向量X vectorizer.fit_transform(data)# 划分数据集和训练集X_train, X_test, y_train, y_test train_test_split(X, labels, test_size0.2, random_state42)# 创建并训练朴素贝叶斯模型model MultinomialNB()model.fit(X_train, y_train)return modelif __name__ __main__:vectorizer CountVectorizer()data,labels loadData()model python_test(data,labels,vectorizer)test_data [Really happy with this product, It was a bad purchase]test_X vectorizer.transform(test_data)predictions model.predict(test_X)print(predictions)结果是[0,1] 在这里我们可以看到是把数据先转成向量然后划分数据集和训练集然后训练这些数据最后给出结果就其原理实际上是将词拆开之后对每一个词计算概率然后对给出的这个词看看它的概率是好评大还是差评大。我们可以写一下这个过程。
算法
加载数据集
# 加载数据集
def loadDataSet():postingList [[you, are, a, pig],[you, are, a, smart, boy]]classVec [1, 0] # 1代表侮辱性文档0代表非侮辱性文档return postingList, classVec这里我们有两个数据集1代表侮辱性文档0代表非侮辱性的文档。
创建词汇表
def createVocabList(dataSet):vocabSet set([]) for document in dataSet:vocabSet vocabSet | set(document) return list(vocabSet)这里我们创建了词汇表 将所有的单词都放入这个词汇表中去了
将文档转换为词向量
def setOfWords2Vec(vocabList, inputSet):returnVec [0] * len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] 1else: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 ones(numWords)p1Num ones(numWords)p0Denom 2.0p1Denom 2.0for i in range(numTrainDocs):if trainCategory[i] 1:p1Num trainMatrix[i]p1Denom sum(trainMatrix[i])else:p0Num trainMatrix[i]p0Denom sum(trainMatrix[i])p1Vect log(p1Num / p1Denom)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)return 1 if p1 p0 else 0其实就是比较概率谁大而已
测试
if __name__ __main__:# 加载数据 postingList是总文档classVec是类别表示是否是侮辱性文档postingList, classVec loadDataSet()# 简历独立的词汇表print(postingList)print(classVec)list createVocabList(postingList)print(list)trainMatrix []for posting in postingList:trainMatrix.append(setOfWords2Vec(list,posting))print(trainMatrix)p0Vect,p1Vect,pAbusive trainNB0(trainMatrix,classVec)print(p0Vect)testEntry [FUCK,LOVE]thisDoc array(setOfWords2Vec(list, testEntry))result classifyNB(thisDoc, p0Vect, p1Vect, pAbusive)print(result)结束
朴素贝叶斯分类器基本使用和原理结束