实现一个简单的多值贝叶斯分类器
时间: 2024-05-13 13:19:58 浏览: 14
多值贝叶斯分类器是一个基于贝叶斯公式的分类器,用于将实例分配到多个类别中的一个或多个类别。这种分类器假设每个特征与每个类别之间相互独立,然后使用贝叶斯公式计算属于每个类别的概率,并将实例分配到最高概率的类别中。
以下是一个简单的多值贝叶斯分类器的实现:
```python
import math
class MultinomialNaiveBayes:
def __init__(self):
self.classes = None
self.class_word_counts = None
self.vocab = None
self.num_docs = None
def fit(self, X, y):
self.classes = list(set(y))
self.class_word_counts = {c: {} for c in self.classes}
self.vocab = set()
self.num_docs = len(X)
# Count words for each class
for i in range(len(X)):
for word in X[i]:
if word not in self.class_word_counts[y[i]]:
self.class_word_counts[y[i]][word] = 0
self.class_word_counts[y[i]][word] += 1
self.vocab.add(word)
def predict(self, X):
predictions = []
for i in range(len(X)):
max_prob = -math.inf
max_class = None
for c in self.classes:
# Calculate class probability
prob_c = math.log(len([y for y in y_train if y == c]) / self.num_docs)
# Calculate word probabilities
word_probs = []
for word in X[i]:
if word in self.class_word_counts[c]:
word_prob = math.log((self.class_word_counts[c][word] + 1) / (sum(self.class_word_counts[c].values()) + len(self.vocab)))
else:
word_prob = math.log(1 / (sum(self.class_word_counts[c].values()) + len(self.vocab)))
word_probs.append(word_prob)
# Calculate total probability
prob = prob_c + sum(word_probs)
# Update max probability and class
if prob > max_prob:
max_prob = prob
max_class = c
predictions.append(max_class)
return predictions
```
这个分类器使用 fit 函数来拟合训练数据,它接受 X 和 y 作为输入,其中 X 是训练样本的列表,y 是相应的类别标签。该函数计算每个类别中单词的计数,并将其存储在 class_word_counts 字典中。该函数还创建一个词汇表集合,其中包含训练数据中出现的所有单词。最后,该函数计算训练数据中的文档数。
该分类器使用 predict 函数来预测测试数据的类别。该函数接受 X 作为输入,其中 X 是测试样本的列表。该函数遍历每个测试样本,并计算属于每个类别的概率。对于每个类别,该函数计算类别概率和每个单词的条件概率,并将它们相加以计算总概率。最后,该函数选择具有最大总概率的类别作为预测结果,并将其添加到 predictions 列表中。
以上是一个简单的多值贝叶斯分类器,它可以用于文本分类等任务。