欢迎访问宙启技术站
智能推送

实践Python:使用python实现贝叶斯分类算法

发布时间:2023-12-04 09:09:53

贝叶斯分类算法是一种常用的机器学习算法,用于进行文本分类、垃圾邮件过滤、情感分析等任务。它基于贝叶斯定理,通过计算每个类别的条件概率来预测输入数据的分类。

下面是一个使用Python实现贝叶斯分类算法的示例。我们将使用一个简单的垃圾邮件分类器作为例子来说明。

1. 数据准备

首先,我们需要准备训练数据和测试数据。训练数据是用来训练分类器的,测试数据是用来评估分类器的性能。在这个例子中,我们将使用一组垃圾邮件和非垃圾邮件作为训练数据。

2. 特征提取

接下来,我们需要从文本中提取特征。在这个例子中,我们将使用单词作为特征。我们可以通过将文本分割成单词的列表,并计算每个单词在文本中出现的次数来提取特征。例如,对于一封邮件"buy viagra now",我们可以提取特征{'buy': 1, 'viagra': 1, 'now': 1}。

3. 训练分类器

接下来,我们使用训练数据来训练分类器。在贝叶斯分类算法中,我们需要计算每个类别的先验概率和条件概率。先验概率表示每个类别出现的概率,条件概率表示给定类别下特征出现的概率。我们可以通过计算每个类别中每个特征出现的次数来估计这些概率。

4. 测试分类器

最后,我们使用测试数据来评估分类器的性能。我们将使用分类器对测试样本进行分类,并比较分类结果与真实标签来计算准确率、召回率和F1值等指标。

下面是使用Python实现贝叶斯分类算法的示例代码:

import numpy as np

class NaiveBayesClassifier:
    def __init__(self):
        self.prior_probs = {}  # 存储先验概率
        self.conditional_probs = {}  # 存储条件概率

    def fit(self, X, y):
        n_samples, n_features = X.shape
        classes = np.unique(y)

        # 计算先验概率
        for c in classes:
            self.prior_probs[c] = np.mean(y == c)

        # 计算条件概率
        for c in classes:
            self.conditional_probs[c] = {}
            for feature in range(n_features):
                feature_values = np.unique(X[:, feature])
                self.conditional_probs[c][feature] = {}
                for value in feature_values:
                    count = np.sum((X[:, feature] == value) & (y == c))
                    self.conditional_probs[c][feature][value] = count / np.sum(y == c)

    def predict(self, X):
        n_samples, n_features = X.shape
        classes = list(self.prior_probs.keys())
        n_classes = len(classes)
        predictions = np.zeros((n_samples, n_classes))

        for i in range(n_samples):
            for j in range(n_classes):
                prob = self.prior_probs[classes[j]]
                for k in range(n_features):
                    prob *= self.conditional_probs[classes[j]][k][X[i, k]]
                predictions[i, j] = prob

        return classes[np.argmax(predictions, axis=1)]

# 使用示例
X_train = np.array([
    ['buy', 'viagra', 'now'],
    ['buy', 'buy', 'now'],
    ['buy', 'viagra', 'spam'],
    ['no', 'spam', 'now'],
    ['no', 'buy', 'spam']
])
y_train = np.array(['spam', 'spam', 'spam', 'ham', 'ham'])
X_test = np.array([
    ['buy', 'viagra', 'now'],
    ['no', 'buy', 'spam']
])
y_test = np.array(['spam', 'ham'])

# 创建分类器并训练
classifier = NaiveBayesClassifier()
classifier.fit(X_train, y_train)

# 预测
y_pred = classifier.predict(X_test)

# 输出预测结果
print("预测结果:", y_pred)

上面的代码实现了一个简单的贝叶斯分类器,并使用垃圾邮件分类的例子进行了测试。输出结果是对测试样本的预测结果。