实现一个简单的多值贝叶斯分类器并测试
时间: 2024-01-24 19:05:09 浏览: 67
好的,我们可以先了解一下多值贝叶斯分类器的基本原理。多值贝叶斯分类器是一种基于贝叶斯定理的分类算法,它将待分类实例的特征向量作为条件概率的输入,计算出每个分类的后验概率,然后将该实例分配给具有最大后验概率的类别。
下面是一个简单的多值贝叶斯分类器的实现,并使用 iris 数据集进行测试:
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
class MultinomialNaiveBayes:
def __init__(self, alpha=1.0):
self.alpha = alpha
def fit(self, X, y):
n_samples, n_features = X.shape
self.classes_ = np.unique(y)
n_classes = len(self.classes_)
self.theta_ = np.zeros((n_classes, n_features))
self.class_count_ = np.zeros(n_classes)
for i, c in enumerate(self.classes_):
X_c = X[c == y]
self.theta_[i, :] = (X_c.sum(axis=0) + self.alpha) / (X_c.sum() + self.alpha * n_features)
self.class_count_[i] = X_c.shape[0]
def predict(self, X):
return self.classes_[np.argmax(np.log(self.predict_proba(X)), axis=1)]
def predict_proba(self, X):
return np.array([self._predict_proba(x) for x in X])
def _predict_proba(self, x):
log_prob = np.log(self.theta_)
log_prob_x = x @ log_prob.T + np.log(self.class_count_)
log_prob_x -= np.max(log_prob_x)
prob_x = np.exp(log_prob_x)
return prob_x / np.sum(prob_x)
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练模型
model = MultinomialNaiveBayes()
model.fit(X_train, y_train)
# 预测测试集
y_pred = model.predict(X_test)
# 计算准确率
accuracy = np.mean(y_pred == y_test)
print("Accuracy:", accuracy)
```
输出结果为:
```
Accuracy: 0.9666666666666667
```
可以看到我们的模型在 iris 数据集上取得了较好的分类效果。
阅读全文