2023.10.14学习-贝叶斯分类器2

2023.10.14学习-贝叶斯分类器2

人工智能基础学习

半朴素贝叶斯分类器

朴素贝叶斯分类器是在已知数据的分类情况下,反推数据各维属性的条件概率从而预测新数据的分类,但是前提是属性之间相互独立,但在现实中这个假设往往很难成立。

半朴素贝叶斯分类器适当考虑一部分属性之间相互依赖,不需进行完全联合概率计算,也不至于忽略了比较强的属性依赖关系。

ODE(One-dependent Estimator):独依赖估计

​ 每个属性最多仅依赖一个其他属性pa。

​ (1)超父(super-parent):假设所有属性都依赖同一个属性。

​ ①SPODE(super-parent + ODE = SPODE):在所有属性中选定唯一一个超父
P ( c ∣ x ) ∝ P ( c ) ∏ i = 1 d P ( x i ∣ c , p a i ) P(c|\boldsymbol x)∝P(c)\prod^d_{i=1}P(x_i|c,pa_i) P(cx)P(c)i=1dP(xic,pai)
​ ②AODE(Average One-Dependent Estimator):每个属性都作为超父来构建SPODE,然后将具有足够训练数据支撑的SPODE集成起来作为最终结果(集成学习)
P ( c ∣ x ) ∝ ∑ i = 1 n D x i ≥ m ′ P ( c , x i ) ∏ j = 1 d P ( x j ∣ c , x i ) P(c|\boldsymbol x)∝ \mathop{\sum \limits^n\limits_{i=1}}_{D_{x_i}\geq m'}P(c,x_i)\prod^d_{j=1}P(x_j|c,x_i) P(cx)i=1nDximP(c,xi)j=1dP(xjc,xi)
​ (2)TAN(Tree Augmented naive Bayes):在最大带权生成树算法的基础上,将属性间的依赖关系整理成树形结果(关注强相关性属性)

​ ①计算任意两个属性之间的条件互信息(相关性)
I ( x i , x j , y ) = ∑ x i , x j ; c ∈ γ P ( x i , x j ∣ c ) l o g P ( x i , x j ∣ c ) P ( x i ∣ c ) P ( x j ∣ c ) I(x_i,x_j,y)=\sum_{x_i,x_j;c\in \gamma}P(x_i,x_j|c)log\frac {P(x_i, x_j|c)} {P(x_i|c)P(x_j|c)} I(xi,xj,y)=xi,xj;cγP(xi,xjc)logP(xic)P(xjc)P(xi,xjc)

​ ②以属性为结点构建完全图,任意两个节点边的权重设为上式结果

​ ③构建此完全图的最大带权生成树,挑选根变量,将边置为有向边

​ ④加入类别结点y增加从y到每个属性的有向边

动手写了AODE的算法,编写的函数是输入测试数据,可以获取其为好瓜或坏瓜的概率,并得出结果是“好瓜”或“坏瓜”。

没有参考较多别人的代码,在写的过程中纠正了很多关于数据结构的知识。
在这里插入图片描述

import numpy as np
import pandas as pd

data = pd.read_csv('data.csv', encoding='gbk')
print(data.head())

# 创建属性字典
features = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']
featuresDic = {}
for i in range(len(features)):
    colomn = data.loc[:, features[i]]
    colomn = list(set(colomn))  # 去重
    featuresDic[features[i]] = colomn
    print(featuresDic[features[i]])


def AODE(test, evaluate):
    # 挑选出“好瓜”/“坏瓜”的数据
    y = data.loc[:, '好瓜']
    good_or_bad = data[y == evaluate]
    D = np.array(data).shape[0]  # 瓜总数

    P = 0.0
    for i in range(len(features)):
        xi = test[i]  # 属性xi
        colomn1 = data.loc[:, features[i]]
        Dxi = good_or_bad.loc[:, features[i]][colomn1 == xi].shape[0]  # 第i个属性上为xi的样本数
        Ni = len(featuresDic[features[i]])  # 第i个属性可能的取值数
        Pcxi = (Dxi + 1) / float(D + 2 * Ni)  # 计算概率P(xi|c)

        MulP = 1.0
        for j in range(len(features)):
            xj = test[j]  # 属性xj
            colomn2 = data.loc[:, features[j]]
            Dxixj = good_or_bad.loc[:, features[j]][colomn1 == xi][colomn2 == xj].shape[0]  # 第i、j属性上为xi、xj的样本数
            Nj = len(featuresDic[features[j]])
            Pxjxi = (Dxixj + 1) / float(Dxi + Nj)  # 计算概率P(xj|xi)
            MulP *= Pxjxi
        P += Pcxi * MulP
    print(P)
    return P


def judge(test):
    p_good = AODE(test, 1)
    p_bad = AODE(test, 0)
    if p_good > p_bad:
        print('好瓜')
    else:
        print('坏瓜')


data1 = ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑']
data2 = ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘']

judge(data1)

judge(data2)

贝叶斯网

考虑属性的高阶依赖。ODE → kDE

借助有向无环图(DAG)来刻画属性之间的依赖关系,并使用条件概率表来描述属性联合概率分布

三种典型的依赖关系:
在这里插入图片描述

在这里插入图片描述

如何分析有向图中的变量条件独立性?

有向分离

①找出有向图中的所有V形结构,在V形结构的两个父节点之间加上一条无向边(道德化

②将所有有向边改为无向边,构成道德图

贝叶斯网的学习

已知网络结构,只需要对训练样本进行计数,估计出每个结点的条件概率表

​ ↓

确定结构:评分搜索。

引入偏好(评分函数:评价贝叶斯网与训练数据的契合程度)

信息论准则:找到一个能以最短编码长度(最小描述长度MDL)训练数据模型

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值