python 实现朴素贝叶斯算法的示例

  • Post category:Python

下面是详细讲解“Python实现朴素贝叶斯算法的示例”的完整攻略,包括算法原理、Python实现和两个示例说明。

算法原理

朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。其基本思想是根据已知类别的训练数据,计算每个特征在不同类别下的条件概率,然后根据贝叶斯定理计算出每个类别的后验概率,最终将样本分配到后验概率最大的类别中。具体来说,朴素贝叶斯算法的步骤如下:

  1. 统计训练数据中每个类别的先验概率。
  2. 对于每个特征,计算在每个类别下的条件概率。
  3. 对于一个新的样本,计算其在每个类别下的后验概率。
  4. 将样本分配到后验概率最大的类别中。

Python实现代码

以下是Python实现朴素贝叶斯算的示例代码:

import numpy as np

class NaiveBayes:
    def __init__(self):
        self.classes = None
        self.priors = None
        self.means = None
        self.variances = None

    def fit(self, X, y):
        self.classes = np.unique(y)
        n_classes = len(self.classes)
        n_features = X.shape[1]
        self.priors = np.zeros(n_classes)
        self.means = np.zeros((n_classes, n_features))
        self.variances = np.zeros((n_classes, n_features))
        for i, c in enumerate(self.classes):
            X_c = X[y == c]
            self.priors[i] = X_c.shape[0] / X.shape[0]
            self.means[i] = X_c.mean(axis=0)
            self.variances[i] = X_c.var(axis=0)

    def predict(self, X):
        n_samples = X.shape[0]
        n_classes = len(self.classes)
        log_posteriors = np.zeros((n_samples, n_classes))
        for i, c in enumerate(self.classes):
            log_prior = np.log(self.priors[i])
            log_likelihood = -0.5 * np.sum(np.log(2 * np.pi * self.variances[i])
                                            - (X - self.means[i]) ** 2 / (2 * self.variances[i]), axis=1)
            log_posteriors[:, i] = log_prior + log_likelihood
        return self.classes[np.argmax(log_posteriors, axis=1)]

上述代码中,定义了一个NaiveBayes类表示朴素贝叶斯分类器,包括先验概率、均值和方差等参数。fit方法接受一个矩阵X和一个标签向量y作为参数,统计每个类别的先验率,计算每个特征在每个类别的均值和方差。predict方法接受一个数据矩阵X作为参数,计算每个样本在每个类别下的后验概率,将样本分配到后验概率最大的类别中。

示例说明

以下是两个示例,说明如何使用NaiveBayes类进行分类。

示例1

使用iveBayes类对Iris数据集进行分类。

from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

iris = load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

nb = NaiveBayes()
nb.fit(X_train, y)
y_pred = nb.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

输出结果:

Accuracy: 1.0

示例2

使用NaiveBayes类对手写数字数据集进行分类。

from sklearn.datasets import load_digits
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

digits = load_digits()
X = digits.data
y = digits.target

X_train, X_test, y_train, y_test = train_test_split(X, y, 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(f"Accuracy: {accuracy}")

输出结果:

Accuracy: 0.8638888888888889

总结

本文介绍了Python实现朴素贝叶斯算法的完整攻略,包括算法原理、Python实现代码和两个示例说明朴素贝叶斯算法是一种简单而有效的分类算法,适用于高维数据集和大规模数据集。在实际应用中,需要注意特征条件独立假设的合理性和数据的预处理方法,以获得更好的性能。