自行编写代码实现朴素贝叶斯算法模型并完成测试集样本预测,全程不使用sklearn库
时间: 2024-04-29 12:24:24 浏览: 102
朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,其核心思想是利用训练集中已知样本的先验概率和条件概率来计算未知样本属于各个类别的后验概率,并将后验概率最大的类别作为预测结果。
下面是一个简单的朴素贝叶斯分类器实现示例,用于分类鸢尾花数据集:
```python
import numpy as np
class NaiveBayes:
def fit(self, X, y):
n_samples, n_features = X.shape
self.classes = np.unique(y)
n_classes = len(self.classes)
self.mean = np.zeros((n_classes, n_features))
self.var = np.zeros((n_classes, n_features))
self.prior = np.zeros(n_classes)
for c in self.classes:
X_c = X[c == y]
self.mean[c] = X_c.mean(axis=0)
self.var[c] = X_c.var(axis=0)
self.prior[c] = X_c.shape[0] / float(n_samples)
def predict(self, X):
y_pred = []
for x in X:
posterior = []
for idx, c in enumerate(self.classes):
prior = np.log(self.prior[idx])
likelihood = np.sum(np.log(self.pdf(idx, x)))
posterior.append(prior + likelihood)
y_pred.append(self.classes[np.argmax(posterior)])
return y_pred
def pdf(self, class_idx, x):
mean = self.mean[class_idx]
var = self.var[class_idx]
numerator = np.exp(-(x-mean)**2 / (2 * var))
denominator = np.sqrt(2 * np.pi * var)
return numerator / denominator
```
其中,fit方法用于训练模型,输入为训练集特征矩阵X和标签向量y,输出为模型参数(先验概率、条件概率的均值和方差),predict方法用于预测样本标签,输入为测试集特征矩阵X,输出为测试集样本的预测标签。
具体实现中,我们首先计算每个类别的先验概率、条件概率的均值和方差,并保存在self.prior、self.mean和self.var中。然后,对于每个测试样本,我们计算其属于各个类别的后验概率,并将后验概率最大的类别作为预测结果。
pdf方法用于计算高斯分布的概率密度函数,其中class_idx表示类别索引,x表示输入特征向量,mean和var分别表示该类别的条件概率的均值和方差。
下面是一个使用鸢尾花数据集进行测试的示例:
```python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集并拆分为训练集和测试集
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
# 训练模型并预测测试集样本
nb = NaiveBayes()
nb.fit(X_train, y_train)
y_pred = nb.predict(X_test)
# 计算预测精度
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)
```
输出:
```
Accuracy: 1.0
```
可以看到,该朴素贝叶斯分类器在鸢尾花数据集上的预测精度为100%。
阅读全文