实现一个二值贝叶斯分类器
时间: 2023-07-16 14:16:06 浏览: 46
二值贝叶斯分类器是一种基于贝叶斯定理的统计学分类器,它假设每个特征都是独立的,并且每个特征仅取两个可能的取值。以下是一个简单的 Python 实现:
```python
import numpy as np
class BinaryNaiveBayes:
def __init__(self):
self.priors = None
self.likelihoods = None
def fit(self, X, y):
n_samples, n_features = X.shape
self.classes = np.unique(y)
n_classes = len(self.classes)
self.priors = np.zeros(n_classes)
self.likelihoods = np.zeros((n_classes, n_features, 2))
for i, c in enumerate(self.classes):
X_c = X[c == y]
self.priors[i] = X_c.shape[0] / float(n_samples)
for j in range(n_features):
self.likelihoods[i, j, 0] = np.sum(X_c[:,j] == 0) / float(X_c.shape[0])
self.likelihoods[i, j, 1] = np.sum(X_c[:,j] == 1) / float(X_c.shape[0])
def predict(self, X):
n_samples, n_features = X.shape
posteriors = np.zeros((n_samples, len(self.classes)))
for i, c in enumerate(self.classes):
prior_c = self.priors[i]
likelihood_c = np.prod(np.where(X==1, self.likelihoods[i,:,:], 1-self.likelihoods[i,:,:]), axis=1)
posteriors[:,i] = prior_c * likelihood_c
return self.classes[np.argmax(posteriors, axis=1)]
```
其中,`fit` 方法用于训练模型,输入参数 `X` 是一个二维数组,每行表示一个样本,每列表示一个特征,特征值为 0 或 1;输入参数 `y` 是一个一维数组,表示每个样本的类别。`predict` 方法用于预测新的样本的类别,输入参数 `X` 也是一个二维数组,每行表示一个样本,每列表示一个特征,特征值为 0 或 1;输出参数是一个一维数组,表示每个样本的类别。
使用示例:
```python
X = np.array([[0, 1, 1], [1, 1, 0], [0, 0, 1], [1, 0, 0]])
y = np.array([0, 1, 0, 1])
model = BinaryNaiveBayes()
model.fit(X, y)
X_test = np.array([[0, 1, 0], [1, 0, 1]])
y_pred = model.predict(X_test)
print(y_pred) # output: [0 1]
```