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(c∣x)∝P(c)i=1∏dP(xi∣c,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(c∣x)∝i=1∑nDxi≥m′P(c,xi)j=1∏dP(xj∣c,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,xj∣c)logP(xi∣c)P(xj∣c)P(xi,xj∣c)
②以属性为结点构建完全图,任意两个节点边的权重设为上式结果
③构建此完全图的最大带权生成树,挑选根变量,将边置为有向边
④加入类别结点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)训练数据模型