用代码实现朴素贝叶斯算法
时间: 2023-10-12 16:15:47 浏览: 91
好的,以下是朴素贝叶斯算法的 Python 代码实现:
```python
import math
class NaiveBayes:
def __init__(self):
self.vocab_set = set() # 词汇表
self.word_count = {} # 每个类别下每个单词出现的次数
self.category_count = {} # 每个类别出现的次数
def fit(self, X_train, y_train):
# 统计训练集中每个单词在每个类别下的出现次数
for i in range(len(X_train)):
category = y_train[i]
if category not in self.category_count:
self.category_count[category] = 0
self.category_count[category] += 1
for word in X_train[i]:
self.vocab_set.add(word) # 添加到词汇表
if category not in self.word_count:
self.word_count[category] = {}
if word not in self.word_count[category]:
self.word_count[category][word] = 0
self.word_count[category][word] += 1
def predict(self, X_test):
# 计算每个类别的概率
categories = list(self.category_count.keys())
word_num_total = sum(map(len, self.word_count.values()))
p_category = {}
for category in categories:
p_category[category] = math.log(self.category_count[category] / len(X_train))
# 对每个文本进行分类
results = []
for text in X_test:
max_prob = float('-inf')
best_category = None
for category in categories:
# 计算 P(Category|Text) = P(Text|Category) * P(Category) / P(Text)
p_text_category = 0
for word in text:
if word in self.word_count[category]:
count = self.word_count[category][word]
else:
count = 0
p_text_category += math.log((count + 1) / (len(self.word_count[category]) + word_num_total))
p = p_category[category] + p_text_category
if p > max_prob:
max_prob = p
best_category = category
results.append(best_category)
return results
```
其中,朴素贝叶斯模型分为两个步骤:训练和预测。fit() 方法用于训练模型,输入的参数为训练集 X_train 和对应的标签 y_train,其中 X_train 是一个二维列表,每个元素是一个文本对应的词汇列表;y_train 是一个一维列表,每个元素是 X_train 中相应文本的类别。
predict() 方法用于预测文本的类别,输入的参数为待预测的文本 X_test,其中 X_test 也是一个二维列表,每个元素是一个待预测文本对应的词汇列表。其返回一个一维列表,每个元素是 X_test 中相应文本的预测结果。
阅读全文