python实现朴素贝叶斯分类
时间: 2023-07-07 16:15:27 浏览: 109
朴素贝叶斯分类是一种基于贝叶斯定理和特征条件独立假设的分类方法,它可以用于处理文本分类、垃圾邮件过滤等问题。下面是一个简单的 Python 实现朴素贝叶斯分类的示例代码:
```python
import numpy as np
class NaiveBayesClassifier:
def __init__(self, alpha=1.0):
self.alpha = alpha # 平滑参数,避免零概率问题
self.classes = None # 所有类别
self.class_prior = None # 类别的先验概率
self.feature_count = None # 每个特征在每个类别下出现的次数
self.feature_prob = None # 每个特征在每个类别下的条件概率
def fit(self, X, y):
self.classes = np.unique(y) # 获取所有类别
self.class_prior = np.zeros(len(self.classes))
self.feature_count = np.zeros((len(self.classes), X.shape[1]))
self.feature_prob = np.zeros((len(self.classes), X.shape[1]))
for i, c in enumerate(self.classes):
X_c = X[y == c]
self.class_prior[i] = (X_c.shape[0] + self.alpha) / (X.shape[0] + self.alpha * len(self.classes))
self.feature_count[i] = np.sum(X_c, axis=0)
self.feature_prob[i] = (self.feature_count[i] + self.alpha) / (np.sum(self.feature_count[i]) + self.alpha * X.shape[1])
def predict(self, X):
y_pred = []
for x in X:
posteriors = []
for i, c in enumerate(self.classes):
prior = np.log(self.class_prior[i])
likelihood = np.sum(np.log(self.feature_prob[i]) * x + np.log(1 - self.feature_prob[i]) * (1 - x))
posterior = prior + likelihood
posteriors.append(posterior)
y_pred.append(self.classes[np.argmax(posteriors)])
return y_pred
```
上述代码中,`NaiveBayesClassifier` 是一个朴素贝叶斯分类器的类,包括以下几个方法:
- `__init__(self, alpha=1.0)`:初始化分类器,`alpha` 是平滑参数。
- `fit(self, X, y)`:训练分类器,其中 `X` 是特征矩阵,`y` 是目标向量。
- `predict(self, X)`:预测分类结果,其中 `X` 是测试数据的特征矩阵。
在训练过程中,分类器首先获取所有类别,然后计算每个类别的先验概率和每个特征在每个类别下出现的次数。接着,分类器计算每个特征在每个类别下的条件概率,最后将其存储在 `feature_prob` 中。在预测过程中,分类器首先计算每个类别的先验概率和每个特征在每个类别下的条件概率的对数,然后将它们相加得到后验概率,最后将后验概率最大的类别作为预测结果。
需要注意的是,这里使用了平滑参数 `alpha`,避免出现零概率问题。`alpha` 的取值可以根据具体的数据集进行调整,一般取值为 1.0。
阅读全文