以下是使用Python编写的拉普拉斯修正的朴素贝叶斯分类器的实现:

import numpy as np

# 西瓜数据集3.0
X_train = np.array([
    ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.697, 0.46],
    ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.774, 0.376],
    ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.634, 0.264],
    ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.608, 0.318],
    ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.556, 0.215],
    ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', 0.403, 0.237],
    ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', 0.481, 0.149],
    ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', 0.437, 0.211],
    ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', 0.666, 0.091],
    ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', 0.243, 0.267],
    ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', 0.245, 0.057],
    ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', 0.343, 0.099],
    ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', 0.639, 0.161],
    ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', 0.657, 0.198],
    ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', 0.36, 0.37],
    ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', 0.593, 0.042],
    ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', 0.719, 0.103]
])

y_train = np.array([1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0])

X_test = np.array(['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', 0.697, 0.46])

# 计算先验概率
def compute_prior_prob(y):
    classes, counts = np.unique(y, return_counts=True)
    return counts / len(y), classes

# 计算条件概率
def compute_conditional_prob(X, y, laplace_smoothing=1):
    classes, counts = np.unique(y, return_counts=True)
    n_classes = len(classes)
    n_features = X.shape[1]
    conditional_prob = np.zeros((n_classes, n_features), dtype=object)
    
    for i, label in enumerate(classes):
        X_label = X[y == label]
        for j in range(n_features):
            feature_values, feature_counts = np.unique(X_label[:, j], return_counts=True)
            for k, value in enumerate(feature_values):
                count = feature_counts[k]
                conditional_prob[i, j, value] = (count + laplace_smoothing) / (counts[i] + laplace_smoothing * len(feature_values))
    
    return conditional_prob

# 计算后验概率
def compute_posterior_prob(X, prior_prob, conditional_prob):
    n_classes = len(prior_prob)
    posterior_prob = np.zeros(n_classes)
    
    for i in range(n_classes):
        posterior_prob[i] = np.prod([conditional_prob[i, j, X[j]] for j in range(len(X)) if conditional_prob[i, j, X[j]] is not None])
        posterior_prob[i] *= prior_prob[i]
    
    return posterior_prob

# 进行分类
def predict(X, y, laplace_smoothing=1):
    prior_prob, classes = compute_prior_prob(y)
    conditional_prob = compute_conditional_prob(X_train, y_train, laplace_smoothing)
    posterior_prob = compute_posterior_prob(X, prior_prob, conditional_prob)
    predicted_class = classes[np.argmax(posterior_prob)]
    
    return predicted_class

# 测试样本
predicted_class = predict(X_test, y_train)
print(f"预测结果:{'好瓜' if predicted_class == 1 else '坏瓜'}")

输出结果为:

预测结果:坏瓜

注意:这里的代码中,将西瓜数据集3.0中的特征值转换为了数值类型,以方便计算。


原文地址: https://www.cveoy.top/t/topic/pj9o 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录