目录
一、朴素贝叶斯
贝叶斯决策理论方法是统计模型决策中的一个基本方法,其基本思想是:
已知类条件概率密度参数表达式和先验概率
利用贝叶斯公式转换成后验概率
根据后验概率大小进行决策分类
先验概率:基于统计的概率,是基于以往历史经验和分析得到的结果,不需要依赖当前发生的条件。
后验概率:从条件概率而来,由因推果,是基于当下发生了事件之后计算的概率,依赖于当前发生的条件。
条件概率:设事件A发生的概率为P(A)、事件B发生的概率为P(B),则在B事件发生的前提下,A事件发生的概率即为条件概率,记为P(A|B)。
二、数学原理
朴素指假设各个特征值之间相互独立
全概率公式
将条件B分割为n个不同的部分,分别用Bi来表示。在条件Bj下事件A发生的概率P(A)= ∑P(Bj)*P(A| Bj)
把各式相加,就可以得到全概率公式:P(A) = Σ P( A | Bi)P(Bi)
条件概率
在条件B已经发生的情况下,事件A发生的概率
贝叶斯公式
在条件B已经发生的情况下,事件A发生的概率
条件独立性
贝叶斯条件独立性是指在朴素贝叶斯分类器中,假设每个特征与其他特征都是独立的,即每个特征都是独立的,不受其他特征的影响。
假设使得朴素贝叶斯分类器的计算变得简单,因为只需要计算每个特征的概率,而不需要考虑特征之间的关系。这个假设在实际应用中并不总是成立,但是在很多情况下,朴素贝叶斯分类器仍然能够取得很好的效果。
三、朴素贝叶斯分类器
朴素贝叶斯分类器是一种基于贝叶斯公式的概率分类器,它假设特征之间相互独立。该分类器通过计算待预测数据属于每个类别的概率,并选择具有最高概率的类别作为分类结果。
下面是朴素贝叶斯分类器的基本步骤:
收集训练数据集:首先,需要收集一组已知类别的训练样本数据,每个样本都包含一组特征和对应的类别标签。
计算先验概率:根据训练数据集,计算每个类别的先验概率,即在没有任何特征信息的情况下,一个样本属于某个类别的概率。
计算条件概率:对于每个特征,计算在给定类别下该特征的条件概率。这可以通过统计每个类别下每个特征值出现的频率来计算。
应用贝叶斯公式:对于待预测的数据,根据贝叶斯公式计算其属于每个类别的后验概率。贝叶斯公式可以将后验概率的计算转化为先验概率和条件概率的乘积。
选择最高概率类别:根据计算得到的后验概率,选择具有最高概率的类别作为预测结果
四、拉普拉斯平滑
拉普拉斯平滑是一种解决朴素贝叶斯算法中概率为0的问题的技巧。
在朴素贝叶斯算法中,如果某个特征在训练集中没有出现过,那么计算后验概率时会出现概率为0的情况,这会导致后验概率为0,从而影响分类结果。
为了避免这种情况,可以采用拉普拉斯平滑技巧,即在计算概率时,将每个特征的出现次数加上一个常数k,分母加上特征总数乘以k,这样可以保证每个特征的概率都不为0。
五、邮件分类案例
其中使用了nltk库进行文本处理和特征提取
import os
import random
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.probability import FreqDist
from nltk.classify import NaiveBayesClassifier
from nltk.classify.util import accuracy
# 定义停用词
stop_words = set(stopwords.words('english'))
# 定义特征提取函数
def extract_features(mail_dir):
files = [os.path.join(mail_dir, f) for f in os.listdir(mail_dir)]
features = []
for file in files:
with open(file, 'r', encoding='utf-8', errors='ignore') as f:
words = word_tokenize(f.read())
words = [word.lower() for word in words if word.isalpha() and word.lower() not in stop_words]
features.append((dict(FreqDist(words)), 'spam' if 'spam' in file else 'ham'))
return features
# 提取特征
spam_dir = r'E:\python\Naive Bayesian Textual Classification\tokens\spam'
ham_dir = r'E:\python\Naive Bayesian Textual Classification\tokens\ham'
spam_features = extract_features(spam_dir)
ham_features = extract_features(ham_dir)
all_features = spam_features + ham_features
# 随机打乱特征
random.shuffle(all_features)
# 划分训练集和测试集
train_set = all_features[:int(len(all_features)*0.8)]
test_set = all_features[int(len(all_features)*0.8):]
# 训练模型
classifier = NaiveBayesClassifier.train(train_set)
# 测试模型
print('Accuracy:', accuracy(classifier, test_set))
# 输出预测结果
mail = 'Free Viagra call today!'
words = word_tokenize(mail)
words = [word.lower() for word in words if word.isalpha() and word.lower() not in stop_words]
print('Prediction:', classifier.classify(dict(FreqDist(words))))