目录
1.朴素贝叶斯.(以下算法参考《统计学习方法》)
朴素贝叶斯算法是一种基于概率和统计的分类算法,在某些情况下表现良好,但也有一些限制。以下是朴素贝叶斯算法的优缺点以及适用情况:
优点:
1. 简单且高效:朴素贝叶斯算法具有简单的数学基础,易于理解和实现。它的计算效率高,适用于大规模数据集。
2. 处理高维数据:朴素贝叶斯算法在处理高维数据时表现出色,因为它假设特征之间相互独立,这在高维空间中可能更为接近真实情况。
3. 处理缺失数据:朴素贝叶斯算法能够有效地处理缺失数据,因为它仅依赖于特征之间的条件概率,可以根据其他可用的特征进行推断。
4. 适用于多类问题:朴素贝叶斯算法天然支持多类别分类问题,不需要额外的复杂性调整。
5. 适用于文本分类:由于其在高维稀疏数据上的良好表现,朴素贝叶斯特别适用于文本分类问题,如垃圾邮件分类。
缺点:
1. 朴素的特征独立假设:朴素贝叶斯算法假设所有特征之间相互独立,这在现实数据中往往不成立,可能导致模型性能下降。
2. 对输入数据分布敏感:朴素贝叶斯算法对输入数据的分布做出了假设,如果这些假设与实际数据分布不匹配,可能会导致预测不准确。
3. 不适合处理连续特征:朴素贝叶斯算法通常假设特征是离散的,对于连续特征的处理可能需要额外的预处理步骤。
4. **类别间的先验概率估计:先验概率的估计可能会受到类别分布不均衡的影响,需要在实际应用中进行调整。
适用情况:
朴素贝叶斯算法在以下情况下表现良好:
1. **文本分类:由于处理高维稀疏数据的能力,朴素贝叶斯在文本分类(如垃圾邮件过滤)方面非常有效。
2. **多类问题:朴素贝叶斯天然支持多类别分类,因此适用于具有多个类别的问题。
3. **小规模数据集:当数据集较小且特征之间相对独立时,朴素贝叶斯可以提供合理的分类结果。
4. **快速原型开发:由于其简单性和高效性,朴素贝叶斯算法适用于快速构建原型和初步验证分类问题。
尽管朴素贝叶斯算法具有一些限制,但在适用的情况下,它仍然是一个有用且有效的分类算法。在实际应用中,通常需要根据数据的性质和问题的需求来评估是否选择朴素贝叶斯算法作为解决方案。
2.算法4.1 朴素贝叶斯算法复现(不调用库).
class NaiveBayesClassifier:
def __init__(self):
self.class_probabilities = {}
self.feature_probabilities = {}
def train(self, X, y):
# 计算类别的先验概率
total_samples = len(y)
unique_classes = set(y)
for cls in unique_classes:
self.class_probabilities[cls] = y.count(cls) / total_samples
print('class_probabilities:', self.class_probabilities)
print('unique_classes', unique_classes)
# 计算每个特征在每个类别下的条件概率
for cls in unique_classes:
# cls_indices: 相应类别的索引. 如'ham'在列表中的索引.
cls_indices = [i for i, label in enumerate(y) if label == cls]
# cls_features: 将类别cls(按照cls_indices中的索引)对应的特征向量提取出来放入其中.
cls_features = [X[i] for i in cls_indices]
# feature_probabilities: {类别1: {特征的第一个分量:{第一个分量的第一种情况: , 第一个分量的第二种情况: , ...},
#特征的第二个分量:{第一个分量的第一种情况: , 第一个分量的第二种情况: , ...}},
#类别2: {...}}
self.feature_probabilities[cls] = {}
for feature_idx in range(len(X[0])):
feature_values = [sample[feature_idx] for sample in cls_features]
self.feature_probabilities[cls][feature_idx] = {
value: feature_values.count(value) / len(cls_features)
for value in set(feature_values)
}
print('self.feature_probabilities:', self.feature_probabilities)
def predict(self, x):
best_class = None
max_prob_begin = -1
for cls in self.class_probabilities:
prob_begin = self.class_probabilities[cls]
# 第i个分量的第j种可能情况所占概率.
for i,j in enumerate(x):
if j in self.feature_probabilities[cls][i]:
prob_begin *= self.feature_probabilities[cls][i][j]
else:
# 处理未见过的特征值
prob_begin *= 1e-5
if prob_begin > max_prob_begin:
max_prob_begin = prob_begin
best_class = cls
return best_class
if __name__ == '__main__':
# 示例数据
X_train = [
[1, 0, 1, 0], # 特征向量1
[0, 1, 1, 1], # 特征向量2
[1, 1, 0, 0], # 特征向量3
[1, 1, 0, 1]
]
y_train = ['spam', 'ham', 'spam', 'ham']
X_test = [
[1, 0, 0, 1],
[1, 1, 0, 1]
]
# 创建和训练朴素贝叶斯分类器
classifier = NaiveBayesClassifier()
classifier.train(X_train, y_train)
# 进行分类预测
for i,x_test in enumerate(X_test):
predicted_class = classifier.predict(x_test)
print(f"Predicted class {i+1}:", predicted_class)
结果展示:
3.调库实现.
from sklearn.naive_bayes import MultinomialNB
X_train = [
[1, 0, 1, 0], # 特征向量1
[0, 1, 1, 1], # 特征向量2
[1, 1, 0, 0], # 特征向量3
[1, 1, 0, 1]
]
y_train = ['spam', 'ham', 'spam', 'ham']
X_test = [
[1, 0, 0, 1],
[1, 1, 0, 1]
]
# 创建和训练朴素贝叶斯分类器
classifier = MultinomialNB()
classifier.fit(X_train, y_train)
# 进行分类预测
y_pred = classifier.predict(X_test)
print(y_pred)