拉普拉斯修正的朴素贝叶斯分类器 Python 实现:西瓜数据集 3.0 实例
以下是使用 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 著作权归作者所有。请勿转载和采集!