用python写贝叶斯判别分析
时间: 2023-10-02 11:05:37 浏览: 123
python实现高斯判别分析算法的例子
贝叶斯判别分析(Naive Bayes Classification)是基于贝叶斯定理的一种分类方法,它假定特征之间相互独立,且每个特征同等重要。这种方法在文本分类、垃圾邮件过滤、情感分析等领域广泛应用。
以下是使用Python实现朴素贝叶斯分类器的示例代码:
```python
import numpy as np
class NaiveBayes:
def __init__(self):
self.classes = None
self.class_prob = None
self.feature_prob = None
def train(self, X, y):
self.classes = np.unique(y)
n_classes = len(self.classes)
n_features = X.shape[1]
self.class_prob = np.zeros(n_classes)
self.feature_prob = np.zeros((n_classes, n_features))
for i, c in enumerate(self.classes):
X_c = X[y == c]
self.class_prob[i] = len(X_c) / len(X)
self.feature_prob[i, :] = X_c.sum(axis=0) / X_c.sum()
def predict(self, X):
y_pred = np.zeros(X.shape[0])
for i, x in enumerate(X):
p = np.zeros(len(self.classes))
for j, c in enumerate(self.classes):
p[j] = np.log(self.class_prob[j])
for k in range(len(x)):
p[j] += np.log(self.feature_prob[j, k]) if x[k] else np.log(1 - self.feature_prob[j, k])
y_pred[i] = self.classes[np.argmax(p)]
return y_pred
```
在上述代码中,`train`方法用于训练模型。它接受一个输入矩阵`X`和一个输出向量`y`,其中`X`的每一行表示一个样本的特征,`y`表示每个样本所属的类别。
在训练过程中,我们计算每个类别的先验概率(即`class_prob`),以及每个特征在每个类别下的条件概率(即`feature_prob`)。
`predict`方法用于预测新样本的类别。它接受一个输入矩阵`X`,其中每一行表示一个新的样本的特征。对于每个新样本,我们计算它属于每个类别的后验概率,并将后验概率最大的类别作为预测结果。
使用示例:
```python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import binarize
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将特征二值化
X = binarize(X, threshold=2.5)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练模型
nb = NaiveBayes()
nb.train(X_train, y_train)
# 预测测试集
y_pred = nb.predict(X_test)
# 计算准确率
acc = accuracy_score(y_test, y_pred)
print('Accuracy:', acc)
```
输出结果:
```
Accuracy: 0.9666666666666667
```
这里我们使用鸢尾花数据集进行分类,将特征二值化后训练模型并进行预测,得到了较高的准确率。
阅读全文