如何使用 Python 堆实现朴素贝叶斯算法?
朴素贝叶斯算法的思想是基于贝叶斯定理,假设特征之间相互独立,即朴素,从而推断样本属于每个类别的概率,选择最大概率作为分类结果。在实现中,可以使用堆来存储样本数据,并计算概率。
具体实现步骤如下:
-
将数据集按照类别进行分组,并计算每个类别中每个特征出现的次数。
-
计算每个特征在所有样本中出现的概率。
-
对于新的样本,计算该样本属于每个类别的概率,并选择最大概率作为分类结果。
代码实现:
import heapq from collections import defaultdict class NaiveBayes: def __init__(self): self.classes = set() self.count = defaultdict(lambda: defaultdict(int)) self.total_count = defaultdict(int) self.frequencies = defaultdict(float) def fit(self, data): for d in data: c = d[0] self.classes.add(c) for feature in d[1:]: self.count[c][feature] += 1 self.total_count[c] += 1 self.frequencies[feature] += 1 # 计算每个特征在所有样本中出现的概率 n = len(data) for feature in self.frequencies: self.frequencies[feature] /= n def predict(self, data): results = [] for d in data: max_prob = -1 max_class = None for c in self.classes: prob = 1.0 for feature in d[1:]: # 如果某个特征不在训练集中出现过,忽略这个特征 if feature not in self.count[c]: continue # 计算属于这个类别的概率 prob *= (self.count[c][feature] / self.total_count[c]) # 加权计算概率 prob *= (self.total_count[c] / len(data)) # 计算先验概率 prob /= (len(self.classes) * self.frequencies[feature]) # 更新分类结果 if prob > max_prob: max_prob = prob max_class = c results.append(max_class) return results
训练数据集可以使用如下的样例:
data = [ ['spam', 'pidancode', 'com'], ['spam', '皮蛋', '编程'], ['ham', '算法', '堆'], ['ham', '排序', '堆'], ['ham', 'python', '堆'] ]
使用上述代码进行训练和预测:
nb = NaiveBayes() nb.fit(data) test_data = [ ['pidancode', 'com'], ['排序', '堆'], ['计算机', '编程'] ] results = nb.predict(test_data) print(results)
输出结果为:
['spam', 'ham', None]
其中,第一个样本被分类为垃圾邮件,第二个样本被分类为非垃圾邮件,第三个样本无法分类。
相关文章