贝叶斯决策基本原理和例题实战

一、贝叶斯决策的原理和基本概念

         1、贝叶斯决策的原理

        在类条件概率密度和先验概率已知(或可以估计)的情况下,通过贝叶斯公式比较样本属于两类的后验概率,将类别决策为后验概率大的一类,这样做的目的是为了使总体错误率最小。贝叶斯决策理论也称作统计决策理论。

        2、先验概率 

         理解:

        以猜测硬币大小为例子,硬币为x,w1,w2分别表示一毛硬币和五毛硬币,则p(w1)和p(w2)分别表示事件w1和w2的先验概率。

        其中:

        如果 P(w1)>P(w2),则 x∈w1;反之,则 x∈w2

        P(w1) + P(w2) = 1

        如果x∈w1,则那么犯错误的概率就是 P(error)=1−P(w1)=P(w2),反之亦然。 

        3、后验概率 

        理解:

        仍然以猜测硬币大小为例子,在不确定硬币面值的情况下根据硬币的重量下做决策。记硬币的重量为x,对两类硬币分别记做 P(ω1∣x)和 P(ω2∣x),这种概率处称为后验概率(a posterior probability)。

        其中:

        如果 P(w1∣x)>P(w2∣x),则 x∈w1;反之,则 x∈w2

        P(w1∣x) + P(w2∣x) = 1

        如果x∈w1,则那么犯错误的概率就是 P(error)=1−P(w1∣x)=P(w2∣x),反之亦然。

4、基于贝叶斯公式的后验概率 

        根据概率论中的贝叶斯公式(Bayes'formula 或 Bayesian Theorem),有

                                       P(ωi∣x)=p(x,ωi)p(x)=p(x∣ωi)p(ωi)p(x),i=1,2

        其中,P(ωi)是先验概率;P(x,ωi)是 x与 ωi的联合概率密度;p(x)是两类所有硬币重量的概率密度,称为总体密度;p(x∣ωi)是第 i类硬币重量的概率密度,称为类条件密度。

5.条件概率

        假设有A,B两个事件,在B事件发生的条件下,A事件发生的概率。

                                                          

6.全概率公式

                

公式表示若事件A1,A2,…,An构成一个完备事件组且都有正概率,则对任意一个事件B都有公式成立。 

7.贝叶斯公式

        在事件A发生的条件下,考察每种情况出现的条件概率。其中样本空间由A和A’组成。

 

二、贝叶斯算法的实例 

假设我们有一个西瓜数据集,其中包括以下特征:色泽、根蒂、敲声和好坏(1表示好瓜,0表示坏瓜)。

我们可以根据这些特征来训练一个朴素贝叶斯分类器,并使用它来预测新的西瓜的好坏。

以下是示例代码:

import numpy as np

# 训练数据集
data = [['青绿', '蜷缩', '浊响', 1],
        ['乌黑', '蜷缩', '沉闷', 1],
        ['乌黑', '蜷缩', '浊响', 1],
        ['青绿', '稍蜷', '浊响', 1],
        ['浅白', '稍蜷', '浊响', 1],
        ['浅白', '硬挺', '清脆', 0],
        ['乌黑', '稍蜷', '沉闷', 0],
        ['浅白', '稍蜷', '沉闷', 0],
        ['青绿', '硬挺', '清脆', 0],
        ['浅白', '蜷缩', '浊响', 0]]

# 特征名称
features_name = ['色泽', '根蒂', '敲声']

# 将特征值转化为数值
def convert_feature_to_num(feature_list):
    feature_set = set(feature_list)
    feature_dict = {}
    for i, feature in enumerate(feature_set):
        feature_dict[feature] = i
    return [feature_dict[feature] for feature in feature_list]

# 将训练数据集转化为数组
data_array = np.array([convert_feature_to_num(d[:-1]) + [d[-1]] for d in data])

# 好瓜数量和坏瓜数量
good_count = np.sum(data_array[:, -1] == 1)
bad_count = np.sum(data_array[:, -1] == 0)

# 计算每个特征每个取值下好瓜的概率和坏瓜的概率
prob_good_given_feature_value = np.zeros((len(features_name), max([len(set(data_array[:, i])) for i in range(len(features_name))]), 2))
prob_bad_given_feature_value = np.zeros((len(features_name), max([len(set(data_array[:, i])) for i in range(len(features_name))]), 2))
for i, feature_name in enumerate(features_name):
    feature_values = set(data_array[:, i])
    for feature_value in feature_values:
        good_given_feature_value = np.sum((data_array[:, i] == feature_value) & (data_array[:, -1] == 1))
        bad_given_feature_value = np.sum((data_array[:, i] == feature_value) & (data_array[:, -1] == 0))
        prob_good_given_feature_value[i, feature_value, :] = [(good_given_feature_value + 1) / (good_count + len(feature_values)), (bad_given_feature_value + 1) / (bad_count + len(feature_values))]
        prob_bad_given_feature_value[i, feature_value, :] = [(bad_given_feature_value + 1) / (bad_count + len(feature_values)), (good_given_feature_value + 1) / (good_count + len(feature_values))]

# 测试数据集
test_data = ['青绿', '稍蜷', '浊响']

# 将测试数据集转化为数组
test_data_array = np.array(convert_feature_to_num(test_data))

# 计算好瓜概率和坏瓜概率
prob_good = good_count / len(data_array)
prob_bad = bad_count / len(data_array)
for i, feature_value in enumerate(test_data_array):
    prob_good *= prob_good_given_feature_value[i, feature_value, 0]
    prob_bad *= prob_bad_given_feature_value[i, feature_value, 0]

# 根据概率比较判断好瓜或坏瓜
if prob_good > prob_bad:
    print('好瓜')
else:
    print('坏瓜')

根据我们自定义的测试数据集

       

得到的运行结果为:

         

算法思想: 

  1. good_count 和 bad_count 分别计算出训练数据中好瓜和坏瓜的数量。
  2. prob_good_given_feature_value 和 prob_bad_given_feature_value 将分别存储每个特征值下好瓜和坏瓜的概率。
  3. 对于测试数据 ['青绿', '稍蜷', '浊响'],代码将计算它是好瓜和坏瓜的概率,并比较这两个概率。
  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个混合图像基本原理例题解答: 假设有一张山水照片和一张人像照片,现在需要将这两张照片进行混合,使得人像清晰可见,同时山水的细节也能够保留下来。其中,人像照片的权重为0.7,山水照片的权重为0.3。 解答: 根据混合图像的基本原理,可以使用以下公式来计算每个像素点的新灰度值: I = α * F + (1-α) * B 其中,I表示新图像的灰度值,F表示前景图像的灰度值,B表示背景图像的灰度值,α表示前景图像的权重。 根据题目要求,可以将人像照片作为前景图像,山水照片作为背景图像,将人像照片的权重设置为0.7,山水照片的权重设置为0.3。然后,对于每个像素点,可以按照上述公式计算出新的灰度值。 具体来说,可以使用Python中的OpenCV库来实现混合图像的操作。代码如下: ``` import cv2 # 读取人像照片和山水照片 img1 = cv2.imread('portrait.jpg') img2 = cv2.imread('landscape.jpg') # 调整人像照片的尺寸,使其与山水照片大小相同 img1 = cv2.resize(img1, (img2.shape[1], img2.shape[0])) # 将人像照片作为前景图像,山水照片作为背景图像,设置权重 alpha = 0.7 beta = 0.3 # 按照公式计算新的灰度值 new_img = cv2.addWeighted(img1, alpha, img2, beta, 0) # 显示混合后的图像 cv2.imshow('Blended Image', new_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在代码中,首先使用cv2.imread()函数读取人像照片和山水照片,并使用cv2.resize()函数将人像照片的尺寸调整为与山水照片相同。然后,使用cv2.addWeighted()函数按照公式计算新的灰度值,并将结果保存到new_img变量中。最后,使用cv2.imshow()函数显示混合后的图像。 通过运行上述代码,就可以得到混合后的图像,其中人像清晰可见,同时山水的细节也能够保留下来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值