机器学习——朴素贝叶斯

目录

一、朴素贝叶斯简介

1.1、工作原理

1.2、先验概率

1.3、条件概率

1.4、后验概率

二、实例

2.1、数据

2.2、计算先验概率

2.3、计算条件概率

2.4、计算后验概率并显示测试集结果

三、实验小结


一、朴素贝叶斯简介

朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的简单而强大的机器学习分类算法。它是基于概率和统计的方法,通常用于处理分类问题,特别是在文本分类和垃圾邮件过滤等领域表现良好。

1.1、工作原理

  1. 建立模型: 通过使用训练数据集,计算每个特征值对于每个类别的条件概率。
  2. 预测: 对于给定的新数据,使用贝叶斯定理计算每个类别的后验概率,并选择具有最高后验概率的类别作为预测结果。

1.2、先验概率

先验概率指的是在没有任何观测数据的情况下,我们对每个类别发生的概率的初始估计。在分类问题中,先验概率通常表示为 ( P(Y) ),其中 ( Y ) 表示类别标签。

1.3、条件概率

条件概率是指在已知某一事件发生的条件下,另一事件发生的概率。

条件概率公式:P(A|B)=\frac{P(AB)}{P(B)} 这表示在B事件发生的条件下事件发生的概率

1.4、后验概率

后验概率是在考虑了某些先验信息或证据后,通过贝叶斯定理计算得到的更新后的概率。它表示在已知某些信息后,对某一事件的概率估计。在贝叶斯统计学中,后验概率通常表示为 ( P(A|B) )

公式:P(A|B) = \frac{​{P(B|A) \cdot P(A)}}{​{P(B)}}

二、实例

2.1、数据

# 数据
T = ['天气', '温度', '湿度', '风']

X = [
    ['晴', '炎热', '高', '弱'],
    ['晴', '炎热', '高', '强'],
    ['阴', '炎热', '高', '弱'],
    ['雨', '温和', '高', '弱'],
    ['雨', '凉爽', '正常', '弱'],
    ['雨', '凉爽', '正常', '强'],
    ['阴', '凉爽', '正常', '强'],
    ['晴', '温和', '高', '弱'],
    ['晴', '凉爽', '正常', '弱'],
    ['雨', '温和', '正常', '弱'],
    ['雨', '温和', '正常', '强'],
    ['阴', '温和', '高', '强'],
    ['阴', '炎热', '正常', '弱'],
    ['雨', '温和', '高', '强']
]

y = ['否', '否', '是', '是', '是', '否', '是', '否', '是', '是', '是', '是', '是', '否']

2.2、计算先验概率

先验概率在代码中是通过创建一个字典然后遍历给出的数据集,记录每个特征出现的频率,然后将样本总个数作为分母来计算先验概率。


# 创建 DataFrame
df = pd.DataFrame(X, columns=T)
df['label'] = y
# 计算每个特征的先验概率
prior_probabilities = {}
total_samples = len(df)

for feature in T:
    feature_counts = df[feature].value_counts()
    feature_probabilities = feature_counts / total_samples
    prior_probabilities[feature] = feature_probabilities

# 显示每个特征的先验概率
for feature, probabilities in prior_probabilities.items():
    print("特征:", feature)
    print(probabilities)
    print()

2.3、计算条件概率

首先,创建一个空字典,用于存储条件概率。然后,遍历特征集合T中的每个特征。对于每个特征,获取该特征在数据集中的唯一值列表。接下来,遍历每个唯一值和目标值['是', '否']的组合。计算满足特定特征值和目标值的样本数量,通过使用布尔索引筛选出符合条件的行并计算长度。计算目标值为特定值的样本总数,同样使用布尔索引筛选出符合条件的行并计算长度。计算条件概率,将计数除以总数得到概率值,并将结果存储在字典中,键为特征值、特征名称和目标值的元组。最后,遍历字典中的每个键值对,打印特征名称、特征值、目标值和对应的条件概率

# 计算条件概率
conditional_probabilities = {}
for feature in T:
    unique_values = df[feature].unique()
    for value in unique_values:
        for target_value in ['是', '否']:
            count = len(df[(df[feature] == value) & (df['label'] == target_value)])
            total_count = len(df[df['label'] == target_value])
            conditional_probabilities[(value, feature, target_value)] = count / total_count

# 显示条件概率
for key, probability in conditional_probabilities.items():
    value, feature, target_value = key
    print("特征:", feature, ", 值:", value, ", 目标变量为", target_value, ", 条件概率:", probability)

2.4、计算后验概率并显示测试集结果

首先,创建一个空列表,用于存储预测的标签。然后,遍历测试数据集中的每个样本。对于每个样本,初始化最大后验概率为-1,预测标签为None。接下来,遍历目标值['是', '否'],计算每个目标值对应的后验概率。初始化后验概率为1。使用zip函数将特征和样本值组合在一起,遍历每个特征和值的组合。根据条件概率计算后验概率,通过查找字典获取对应的概率值,如果不存在则返回0。将后验概率乘以先验概率,这里假设先验概率存储在字典中。遍历剩余的特征和值的组合,重复步骤7和8。如果计算出的后验概率大于当前的最大后验概率,更新最大后验概率和预测标签。将预测标签添加到列表中。最后,返回预测的标签列表。

# 输入测试集样本数量
num_samples = int(input("请输入测试集样本数量: "))

# 输入测试集
print('请依次输入测试集中每个样本的特征值:')
test_data = []
features = df.columns[:-1]  # 特征名称列表
for _ in range(num_samples):
    sample = []
    for feature in features:
        test = input(f"请输入 {feature} 的值: ")
        sample.append(test)
    test_data.append(sample)

predictions = []
for sample in test_data:
    max_posterior_prob = -1
    predicted_label = None
    for target_value in ['是', '否']:
        posterior_prob = 1  # 初始化后验概率为1
        for feature, value in zip(features, sample):
            # 根据条件概率计算后验概率
            posterior_prob *= conditional_probabilities.get((value, feature, target_value), 0)
        # 乘以先验概率
        posterior_prob *= prior_probabilities[features[0]][sample[0]]
        for i in range(1, len(features)):
            posterior_prob *= prior_probabilities[features[i]][sample[i]]
        # 更新最大后验概率和预测标签
        if posterior_prob > max_posterior_prob:
            max_posterior_prob = posterior_prob
            predicted_label = target_value
    predictions.append(predicted_label)
# 输出预测结果
for i, pred in enumerate(predictions):
    print(f"样本{i+1}:{test_data[i]} 结果:{pred}")

 

三、实验小结

优点:

  1. 简单且效果稳定: 贝叶斯方法具有简单、直观的数学原理,易于理解和实现。在训练样本少或噪声较多的情况下,贝叶斯方法通常能够产生较为稳定的分类结果。
  2. 对小样本数据有良好的适应性: 贝叶斯方法可以通过引入先验概率,较好地处理小样本数据,降低过拟合的风险。
  3. 处理多类别分类问题: 贝叶斯方法天然支持多类别分类问题,不需要额外的处理。
  4. 能够处理缺失数据: 贝叶斯方法能够利用先验信息填充缺失的数据,提高模型的鲁棒性。

缺点:

  1. 对输入特征的独立性要求高: 贝叶斯方法通常假设输入特征之间相互独立,但在实际问题中,这种假设往往难以满足,导致模型性能下降。
  2. 需要对先验概率进行假设: 贝叶斯方法需要对先验概率进行合理的假设,这些假设的选择可能会影响最终的分类结果。
  3. 计算复杂度高: 贝叶斯方法在计算后验概率时需要对所有可能的情况进行求解,因此在特征空间较大或者类别较多时,计算复杂度会变得很高。
  4. 不适用于非线性问题: 贝叶斯方法通常假设类别的分布是高斯分布等简单形式,对于复杂的非线性问题,贝叶斯方法可能表现不佳。
  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
朴素叶斯算法是一种基于概率统计的分类算法,它的核心思想是利用叶斯定理计算出每个类别的后验概率,然后选择具有最大后验概率的类别作为分类结果。在这个过程中,朴素叶斯假设每个特征之间相互独立,也就是说,每个特征对于分类的贡献是独立的。 在Python中,我们可以使用scikit-learn库来实现朴素叶斯算法。具体步骤如下: 1.准备数据:将数据集划分为训练集和测试集。 2.训练模型:使用训练集来训练朴素叶斯模型。 3.测试模型:使用测试集来测试模型的准确率。 下面是一个简单的朴素叶斯分类器的实现示例: ``` from sklearn.naive_bayes import GaussianNB from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据集 iris = load_iris() # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=0) # 创建朴素叶斯分类器对象 gnb = GaussianNB() # 训练模型 gnb.fit(X_train, y_train) # 预测测试集的结果 y_pred = gnb.predict(X_test) # 计算准确率 accuracy = sum(y_pred == y_test) / len(y_test) print("准确率:", accuracy) ``` 这里使用了iris数据集作为示例数据集进行分类。首先,我们使用`train_test_split`函数将数据集划分为训练集和测试集,然后创建一个`GaussianNB`对象,训练模型并使用测试集来测试模型的准确率。最后,我们计算出准确率并将其打印出来。 完整的代码可以在以下链接中找到: https://github.com/Light-City/NaiveBayesClassifier-Python/blob/master/NaiveBayesClassifier.py

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值