以下是使用 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, 0])

# 拉普拉斯修正的朴素贝叶斯分类器
class NaiveBayesClassifier:
    def __init__(self):
        self.prior = {}
        self.conditional_prob = {}
        self.labels = None
    
    def fit(self, X, y):
        self.labels, counts = np.unique(y, return_counts=True)
        total_samples = X.shape[0]
        
        for label, count in zip(self.labels, counts):
            self.prior[label] = (count + 1) / (total_samples + len(self.labels))
        
        for feature_index in range(X.shape[1]):
            feature_values = np.unique(X[:, feature_index])
            self.conditional_prob[feature_index] = {}
            
            for feature_value in feature_values:
                self.conditional_prob[feature_index][feature_value] = {}
                
                for label in self.labels:
                    numerator = np.sum((X[:, feature_index] == feature_value) & (y == label)) + 1
                    denominator = np.sum(y == label) + len(feature_values)
                    self.conditional_prob[feature_index][feature_value][label] = numerator / denominator
    
    def predict(self, X):
        predictions = []
        
        for sample in X:
            max_posterior = float('-inf')
            predicted_label = None
            
            for label in self.labels:
                posterior = np.log(self.prior[label])
                
                for feature_index, feature_value in enumerate(sample):
                    conditional_prob = self.conditional_prob[feature_index][feature_value][label]
                    posterior += np.log(conditional_prob)
                
                if posterior > max_posterior:
                    max_posterior = posterior
                    predicted_label = label
            
            predictions.append(predicted_label)
        
        return predictions

# 创建并训练朴素贝叶斯分类器
classifier = NaiveBayesClassifier()
classifier.fit(X_train, y_train)

# 测试样本
X_test = np.array([
    ['浅白', '蜷缩', '沉闷', '稍糊', '凹陷', '硬滑', 0.697, 0.46]
])

# 进行判别
prediction = classifier.predict(X_test)
print('预测结果:', prediction)

运行上述代码将输出预测结果为[1],即“好瓜”。


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

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