python实现朴素贝叶斯算法例题
时间: 2023-09-30 10:04:24 浏览: 108
好的,下面给出一个简单的朴素贝叶斯分类算法的实现。
首先,我们需要准备一些训练数据。这里以一个简单的鸢尾花数据集为例,其中包含150个样本,每个样本有4个特征和1个类别标签。我们将其分为70%的训练集和30%的测试集:
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据集
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.3, random_state=42)
```
接下来,我们需要定义朴素贝叶斯分类器的类:
```python
class NaiveBayesClassifier:
def __init__(self):
self.classes = None
self.means = None
self.stds = None
def fit(self, X, y):
self.classes = np.unique(y)
self.means = np.zeros((len(self.classes), X.shape[1]))
self.stds = np.zeros((len(self.classes), X.shape[1]))
for i, c in enumerate(self.classes):
X_c = X[y == c]
self.means[i, :] = X_c.mean(axis=0)
self.stds[i, :] = X_c.std(axis=0)
def predict(self, X):
posteriors = np.zeros((X.shape[0], len(self.classes)))
for i, c in enumerate(self.classes):
prior = np.log(np.sum(y_train == c) / X.shape[0])
likelihood = np.sum(-0.5 * np.log(2 * np.pi * self.stds[i, :]**2)
- 0.5 * ((X - self.means[i, :])**2 / (self.stds[i, :]**2)), axis=1)
posterior = prior + likelihood
posteriors[:, i] = posterior
return self.classes[np.argmax(posteriors, axis=1)]
```
其中,`fit()`方法用于训练模型,`predict()`方法用于对新的样本进行预测。
在训练过程中,我们需要计算每个类别的均值和标准差。然后,对于一个新的样本,我们可以计算它属于每个类别的概率,选择概率最大的类别作为预测结果。
最后,我们可以使用训练集来训练模型并进行预测:
```python
# 初始化模型
nb = NaiveBayesClassifier()
# 训练模型
nb.fit(X_train, y_train)
# 预测测试集
y_pred = nb.predict(X_test)
# 计算准确率
accuracy = np.mean(y_pred == y_test)
print('Accuracy:', accuracy)
```
输出结果如下:
```
Accuracy: 0.9777777777777777
```
可以看到,我们的朴素贝叶斯分类器在测试集上的准确率达到了97.8%。
阅读全文