【机器学习】1.贝叶斯分类

部署运行你感兴趣的模型镜像

概率图模型中的贝叶斯算法:系统梳理与实践指南

概率图模型(Probabilistic Graphical Model, PGM)是概率模型图论的结合,核心是用图结构表示随机变量间的依赖关系,而贝叶斯算法是基于贝叶斯定理的概率推理与学习方法,二者结合形成了贝叶斯框架下的概率图模型体系。

本文将从核心基础→模型分类→关键算法→语法实现→案例实践→对比总结六个维度,系统梳理概率图模型中的贝叶斯核心方法,所有案例均基于Python实现(结合pgmpypomegranatenumpy等库),并融入计算机视觉/纺织领域场景,便于落地应用。

一、核心基础:贝叶斯定理与概率图模型定义

1. 贝叶斯定理(核心公式)

贝叶斯算法的本质是通过先验概率似然概率计算后验概率,公式如下:
P(θ∣X)=P(X∣θ)⋅P(θ)P(X) P(\theta | X) = \frac{P(X | \theta) \cdot P(\theta)}{P(X)} P(θX)=P(X)P(Xθ)P(θ)

  • P(θ)P(\theta)P(θ):先验概率(模型参数θ\thetaθ的初始信念,如“纺织缺陷A的出现概率为10%”);
  • P(X∣θ)P(X | \theta)P(Xθ):似然概率(给定参数θ\thetaθ时,观测数据XXX的概率,如“若缺陷为A,观测到纹理特征X的概率”);
  • P(X)P(X)P(X):证据(观测数据的边际概率,可通过积分/求和计算,用于归一化);
  • P(θ∣X)P(\theta | X)P(θX):后验概率(观测数据XXX后,参数θ\thetaθ的更新信念,即“观测到特征X后,缺陷为A的概率”)。

2. 概率图模型的贝叶斯视角

  • 图结构:节点表示随机变量(如“缺陷类型”“纹理特征”“亮度特征”),边表示变量间的依赖关系(如“缺陷类型→纹理特征”);
  • 贝叶斯特性:所有变量的联合概率分布可通过贝叶斯定理分解,且支持“先验+数据→后验”的迭代学习(适合小样本、增量学习场景)。

二、概率图模型中的贝叶斯核心模型分类

贝叶斯框架下的概率图模型主要分为生成式模型(建模联合概率P(X,Y)P(X,Y)P(X,Y))和判别式模型(建模条件概率P(Y∣X)P(Y|X)P(YX)),核心模型及关系如下:

模型类型核心代表模型图结构特点建模目标适用场景
生成式模型贝叶斯网络(BN)有向无环图(DAG)联合概率P(X1,X2,...,Xn)P(X_1,X_2,...,X_n)P(X1,X2,...,Xn)多变量依赖推理、不确定性建模
隐马尔可夫模型(HMM)有向链状图(序列结构)序列联合概率P(O1...OT,Z1...ZT)P(O_1...O_T,Z_1...Z_T)P(O1...OT,Z1...ZT)时序数据建模(如纹理序列识别)
贝叶斯混合模型(如GMM)有向层次图联合概率P(X,Z)P(X,Z)P(X,Z)(Z为隐变量)聚类、数据分布拟合
判别式模型条件随机场(CRF)无向图(序列结构)条件概率$P(YX)$
推断方法精确推断(变量消除、信念传播)基于图结构的分解精确计算后验概率$P(\thetaX)$
近似推断(变分推断、MCMC)逼近后验分布近似计算后验概率$P(\thetaX)$

注:CRF虽为判别式模型,但常与贝叶斯推断结合使用(如通过贝叶斯估计优化CRF参数),故纳入梳理。

三、核心模型与算法:原理+语法+案例

模块1:贝叶斯网络(Bayesian Network, BN)

1. 核心原理
  • 定义:有向无环图(DAG),每个节点表示随机变量,边表示变量间的直接依赖关系,联合概率分布可分解为:
    P(X1,X2,...,Xn)=∏i=1nP(Xi∣Pa(Xi)) P(X_1,X_2,...,X_n) = \prod_{i=1}^n P(X_i | Pa(X_i)) P(X1,X2,...,Xn)=i=1nP(XiPa(Xi))
    其中Pa(Xi)Pa(X_i)Pa(Xi)是节点XiX_iXi的父节点集合。
  • 关键特性:满足马尔可夫性(每个节点仅依赖于其父节点,与非后代节点条件独立)。
2. 语法实现(基于pgmpy库)

pgmpy是Python中专门用于概率图模型的库,支持BN的构建、参数学习、推断等功能。

步骤1:安装依赖
pip install pgmpy numpy pandas matplotlib
步骤2:BN构建与参数学习(以纺织缺陷检测为例)

场景:通过“纹理异常(T)”“亮度不均(B)”“边缘模糊(E)”三个特征,判断纺织面料是否存在“缺陷(D)”,变量均为二值变量(0=无,1=有)。

import numpy as np
import pandas as pd
from pgmpy.models import BayesianNetwork
from pgmpy.estimators import MaximumLikelihoodEstimator, BayesianEstimator
from pgmpy.inference import VariableElimination

# 1. 定义BN结构(有向边:父节点→子节点)
model = BayesianNetwork([('D', 'T'), ('D', 'B'), ('D', 'E')])

# 2. 准备训练数据(模拟纺织面料检测数据,共100条样本)
data = pd.DataFrame({
    'D': np.random.randint(0, 2, 100),  # 缺陷标签(0=无缺陷,1=有缺陷)
    'T': np.where(np.random.rand(100) < 0.8, lambda x: x['D'], np.random.randint(0, 2, 100)),  # 缺陷→纹理异常(依赖关系)
    'B': np.where(np.random.rand(100) < 0.7, lambda x: x['D'], np.random.randint(0, 2, 100)),  # 缺陷→亮度不均
    'E': np.where(np.random.rand(100) < 0.9, lambda x: x['D'], np.random.randint(0, 2, 100))   # 缺陷→边缘模糊
})
# 修正lambda函数语法(实际数据生成)
data['T'] = np.where(data['D'] == 1, np.random.binomial(1, 0.8, 100), np.random.binomial(1, 0.1, 100))
data['B'] = np.where(data['D'] == 1, np.random.binomial(1, 0.7, 100), np.random.binomial(1, 0.05, 100))
data['E'] = np.where(data['D'] == 1, np.random.binomial(1, 0.9, 100), np.random.binomial(1, 0.03, 100))

# 3. 参数学习(两种方法)
# 方法1:最大似然估计(MLE)
model.fit(data, estimator=MaximumLikelihoodEstimator)

# 方法2:贝叶斯估计(加入先验,避免数据稀疏导致的概率为0)
# 定义先验(如缺陷D的先验:P(D=0)=0.9,P(D=1)=0.1)
prior = {
    'D': [0.9, 0.1],
    'T': [[0.9, 0.1], [0.2, 0.8]],  # P(T|D=0), P(T|D=1)
    'B': [[0.95, 0.05], [0.3, 0.7]], # P(B|D=0), P(B|D=1)
    'E': [[0.97, 0.03], [0.1, 0.9]]  # P(E|D=0), P(E|D=1)
}
model.fit(data, estimator=BayesianEstimator, prior_type='dirichlet', pseudo_counts=prior)

# 4. 推断(给定观测特征,预测是否有缺陷)
infer = VariableElimination(model)
# 观测:纹理异常(T=1)、亮度不均(B=1),预测缺陷D的后验概率
result = infer.query(variables=['D'], evidence={'T': 1, 'B': 1})
print(result)
输出结果(示例)
+------+-----------+
| D    |   probability |
+======+===============+
| D_0  |        0.089  |
+------+-----------+
| D_1  |        0.911  |
+------+-----------+

即观测到“纹理异常+亮度不均”时,面料有缺陷的概率为91.1%。

3. 应用案例:纺织面料缺陷类型分类

扩展场景:将“缺陷类型(D)”扩展为多分类(0=无缺陷,1=破洞,2=污渍,3=跳线),特征包括“纹理异常(T)”“颜色偏差(C)”“形状不规则(S)”,构建BN模型实现多分类推理:

# 核心修改:变量D为多分类(0-3),调整先验和数据生成
data['D'] = np.random.randint(0, 4, 200)  # 4类缺陷
# 多分类条件概率学习(略,pgmpy支持多分类变量)
infer.query(variables=['D'], evidence={'T': 1, 'C': 1})  # 预测缺陷类型

模块2:隐马尔可夫模型(Hidden Markov Model, HMM)

1. 核心原理
  • 定义:有向链状概率图模型,用于时序数据建模,包含两类变量:
    • 隐变量ZtZ_tZt(如“纺织纹理类型”):构成马尔可夫链,满足P(Zt∣Zt−1,...,Z1)=P(Zt∣Zt−1)P(Z_t | Z_{t-1},...,Z_1) = P(Z_t | Z_{t-1})P(ZtZt1,...,Z1)=P(ZtZt1)
    • 观测变量OtO_tOt(如“图像像素灰度值”):满足观测独立性P(Ot∣Z1,...,ZT,O1,...,Ot−1)=P(Ot∣Zt)P(O_t | Z_1,...,Z_T, O_1,...,O_{t-1}) = P(O_t | Z_t)P(OtZ1,...,ZT,O1,...,Ot1)=P(OtZt)
  • 三大核心问题:
    1. 评估问题(前向算法):计算P(O∣λ)P(O | \lambda)P(Oλ)(给定模型λ=(A,B,π)\lambda=(A,B,\pi)λ=(A,B,π),观测序列OOO的概率);
    2. 解码问题(Viterbi算法):给定OOOλ\lambdaλ,求最优隐序列Z∗=arg⁡max⁡ZP(Z∣O,λ)Z^* = \arg\max_Z P(Z | O,\lambda)Z=argmaxZP(ZO,λ)
    3. 学习问题(Baum-Welch算法):给定OOO,估计模型参数λ∗=arg⁡max⁡λP(O∣λ)\lambda^* = \arg\max_\lambda P(O | \lambda)λ=argmaxλP(Oλ)
2. 语法实现(基于pomegranate库)

pomegranate支持HMM的快速实现,适合时序数据(如纺织纹理序列、OCR字符序列)。

步骤1:安装依赖
pip install pomegranate
步骤2:HMM实现(纺织纹理序列识别)

场景:纺织面料的纹理序列为隐变量ZZZ(0=平纹,1=斜纹,2=缎纹),观测变量OOO为纹理的灰度值序列(模拟连续观测),通过HMM实现纹理类型的序列解码。

import numpy as np
from pomegranate import HiddenMarkovModel, NormalDistribution

# 1. 定义HMM模型参数(模拟先验)
# 状态:平纹(0)、斜纹(1)、缎纹(2)
states = [
    NormalDistribution(mean=50, std=10),   # 状态0的观测分布(灰度值均值50)
    NormalDistribution(mean=100, std=15),  # 状态1的观测分布(灰度值均值100)
    NormalDistribution(mean=150, std=20)   # 状态2的观测分布(灰度值均值150)
]

# 转移矩阵A:P(Z_t | Z_{t-1})
transitions = np.array([
    [0.8, 0.15, 0.05],  # 平纹→平纹、斜纹、缎纹的概率
    [0.1, 0.85, 0.05],  # 斜纹→平纹、斜纹、缎纹的概率
    [0.05, 0.1, 0.85]   # 缎纹→平纹、斜纹、缎纹的概率
])

# 初始状态概率π:P(Z_1)
starts = np.array([0.3, 0.5, 0.2])

# 2. 构建HMM模型
model = HiddenMarkovModel.from_matrix(
    transitions, states, starts,
    state_names=["平纹", "斜纹", "缎纹"]
)
model.bake()

# 3. 生成模拟观测序列(100个时间步的灰度值)
np.random.seed(42)
observations = np.concatenate([
    np.random.normal(50, 10, 30),   # 前30步:平纹
    np.random.normal(100, 15, 40),  # 中间40步:斜纹
    np.random.normal(150, 20, 30)   # 后30步:缎纹
])

# 4. 解码(求最优隐序列)
log_probability, path = model.viterbi(observations)
predicted_states = [state.name for state in path[1:]]  # 去掉起始节点

# 5. 输出结果
print("观测序列前10个灰度值:", observations[:10].round(2))
print("预测的纹理序列前10个状态:", predicted_states[:10])
print("预测的纹理序列后10个状态:", predicted_states[-10:])
输出结果(示例)
观测序列前10个灰度值: [54.97 48.61 56.49 46.50 52.31 47.74 51.56 45.59 55.79 48.70]
预测的纹理序列前10个状态: ['平纹', '平纹', '平纹', '平纹', '平纹', '平纹', '平纹', '平纹', '平纹', '平纹']
预测的纹理序列后10个状态: ['缎纹', '缎纹', '缎纹', '缎纹', '缎纹', '缎纹', '缎纹', '缎纹', '缎纹', '缎纹']

成功解码出时序纹理的类型变化。

3. 关键扩展:Baum-Welch算法学习参数

若未知模型参数(A,B,π),可通过观测序列学习:

# 基于观测序列训练HMM(Baum-Welch算法)
model = HiddenMarkovModel.from_samples(
    NormalDistribution, n_components=3,  # 3个隐状态
    X=[observations], algorithm='baum-welch',
    state_names=["平纹", "斜纹", "缎纹"]
)
model.bake()

模块3:条件随机场(Conditional Random Field, CRF)

1. 核心原理
  • 定义:无向图模型,属于判别式模型,直接建模条件概率P(Y∣X)P(Y | X)P(YX)YYY为标签序列,XXX为观测序列),不依赖联合概率分布。
  • 核心优势:相比HMM,CRF放松了“观测独立性”假设,能捕捉观测序列XXX的全局依赖(如纺织缺陷检测中,相邻像素的特征依赖)。
  • 概率形式(线性链CRF,最常用):
    P(Y∣X)=1Z(X)exp⁡(∑i=1n∑kλktk(Yi−1,Yi,X,i)+∑i=1n∑lμlsl(Yi,X,i)) P(Y | X) = \frac{1}{Z(X)} \exp\left( \sum_{i=1}^n \sum_k \lambda_k t_k(Y_{i-1}, Y_i, X, i) + \sum_{i=1}^n \sum_l \mu_l s_l(Y_i, X, i) \right) P(YX)=Z(X)1exp(i=1nkλktk(Yi1,Yi,X,i)+i=1nlμlsl(Yi,X,i))
    其中tkt_ktk为转移特征(依赖相邻标签),sls_lsl为状态特征(依赖当前标签和观测),Z(X)Z(X)Z(X)为归一化因子。
2. 语法实现(基于sklearn-crfsuite库)

sklearn-crfsuite是Python中常用的CRF实现库,适合序列标注任务(如纺织缺陷边界检测、OCR字符标注)。

步骤1:安装依赖
pip install sklearn-crfsuite sklearn
步骤2:CRF实现(纺织缺陷边界序列标注)

场景:对纺织面料图像的像素序列进行标注,XXX为像素的特征(灰度值、梯度值、邻域像素均值),YYY为标签(0=背景,1=缺陷边界),通过线性链CRF实现边界标注。

import numpy as np
import sklearn_crfsuite
from sklearn_crfsuite import metrics

# 1. 准备数据:生成10个样本,每个样本为50个像素的序列
def generate_sample():
    """生成单个样本:观测序列X(3维特征)+ 标签序列Y(0=背景,1=边界)"""
    length = 50
    # 观测特征X:[灰度值, 梯度值, 邻域均值]
    gray = np.random.normal(120, 30, length)  # 灰度值
    gradient = np.abs(np.diff(gray, prepend=gray[0]))  # 梯度值(边缘特征)
    neighbor_mean = np.convolve(gray, np.ones(3)/3, mode='same')  # 3邻域均值
    X = np.column_stack([gray, gradient, neighbor_mean])
    # 标签Y:模拟缺陷边界(第20-25个像素为边界)
    Y = np.zeros(length)
    Y[20:26] = 1
    return X, Y

# 生成100个训练样本,20个测试样本
train_samples = [generate_sample() for _ in range(100)]
test_samples = [generate_sample() for _ in range(20)]

# 转换为CRF输入格式(每个样本的特征为字典列表)
def extract_features(sequence):
    features = []
    for i, pixel in enumerate(sequence):
        feat = {
            'gray': pixel[0],
            'gradient': pixel[1],
            'neighbor_mean': pixel[2],
            'pos': i / len(sequence)  # 位置特征
        }
        # 加入前一个像素的特征(捕捉依赖)
        if i > 0:
            feat['prev_gray'] = sequence[i-1][0]
        else:
            feat['prev_gray'] = 0
        features.append(feat)
    return features

X_train = [extract_features(sample[0]) for sample in train_samples]
y_train = [sample[1].astype(int).tolist() for sample in train_samples]
X_test = [extract_features(sample[0]) for sample in test_samples]
y_test = [sample[1].astype(int).tolist() for sample in test_samples]

# 2. 训练CRF模型
crf = sklearn_crfsuite.CRF(
    algorithm='lbfgs',  # 优化算法
    c1=0.1,  # L1正则化系数
    c2=0.1,  # L2正则化系数
    max_iterations=100,
    all_possible_transitions=True  # 考虑所有标签间的转移
)
crf.fit(X_train, y_train)

# 3. 预测与评估
y_pred = crf.predict(X_test)
# 计算F1分数(序列标注任务的核心指标)
f1_score = metrics.flat_f1_score(y_test, y_pred, average='weighted')
print(f"CRF模型F1分数:{f1_score:.4f}")
print("测试样本1的预测标签(前30个像素):", y_pred[0][:30])
输出结果(示例)
CRF模型F1分数:0.9872
测试样本1的预测标签(前30个像素): [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]

成功准确标注出缺陷边界(第20-25个像素)。

模块4:贝叶斯推断方法(精确+近似)

概率图模型的核心任务是推断(给定部分变量,计算目标变量的后验概率),贝叶斯推断分为精确推断和近似推断两类。

1. 精确推断

适用于小规模、稀疏图(如贝叶斯网络),核心是通过变量分解减少计算量。

方法核心思想语法实现(pgmpy)适用场景
变量消除法按顺序消除非目标变量,逐步求和VariableElimination(model).query(...)单目标变量推断
信念传播法基于消息传递,迭代更新节点信念BeliefPropagation(model).query(...)多目标变量、树结构模型

示例:信念传播法推断贝叶斯网络

from pgmpy.inference import BeliefPropagation

# 基于之前构建的纺织缺陷BN模型
bp_infer = BeliefPropagation(model)
result = bp_infer.query(variables=['D'], evidence={'T': 1, 'E': 1})
print(result)
2. 近似推断

适用于大规模、复杂图(如深度概率图模型、目标检测中的多变量依赖),核心是通过逼近后验分布减少计算量。

方法核心思想语法实现(库)适用场景
变分推断(VI)用简单分布逼近后验分布(如平均场)tensorflow-probabilitypyro连续变量、深度模型
MCMC(马尔可夫链蒙特卡洛)通过采样逼近后验分布(如Metropolis-Hastings)pymc3stan高维变量、复杂后验分布

示例:MCMC推断(基于pymc3,纺织面料缺陷率估计)

import pymc3 as pm
import numpy as np

# 场景:估计纺织面料的缺陷率p(二项分布)
# 数据:100件面料中,15件有缺陷
data = np.array([1]*15 + [0]*85)

# 构建贝叶斯模型
with pm.Model() as model:
    # 先验:缺陷率p服从Beta分布(共轭先验)
    p = pm.Beta('p', alpha=2, beta=18)  # 先验均值=2/(2+18)=0.1
    # 似然:观测数据服从二项分布
    y = pm.Binomial('y', n=1, p=p, observed=data)
    # MCMC采样(NUTS算法)
    trace = pm.sample(2000, tune=1000, cores=2)

# 输出后验分布结果
pm.summary(trace).round(3)
pm.plot_trace(trace)  # 绘制后验分布曲线

输出结果(示例):缺陷率p的后验均值为0.148,95%置信区间为[0.089, 0.217],符合数据观测(15/100=0.15)。

四、核心方法对比总结

模型/方法图结构建模目标核心优势核心劣势适用场景
贝叶斯网络(BN)有向无环图联合概率P(X)P(X)P(X)可解释性强、支持多变量推理不适合序列数据、大规模图计算慢纺织缺陷分类、多特征融合推理
隐马尔可夫模型(HMM)有向链状图序列联合概率P(O,Z)P(O,Z)P(O,Z)适合时序数据、计算高效观测独立性假设限制、隐状态依赖简单纺织纹理序列识别、OCR字符序列建模
条件随机场(CRF)无向链状图条件概率$P(YX)$捕捉全局依赖、序列标注效果好训练复杂度高、参数敏感
变分推断(VI)无特定限制近似后验$P(\thetaX)$计算高效、适合大规模数据逼近误差可能较大
MCMC无特定限制近似后验$P(\thetaX)$逼近精度高、适合复杂分布采样效率低、收敛慢

纺织领域应用选型建议

  1. 若需多特征融合判断缺陷类型(如纹理+亮度+边缘)→ 贝叶斯网络;
  2. 若需时序/序列数据建模(如纺织生产线的连续纹理监测)→ HMM;
  3. 若需图像序列标注(如缺陷边界检测、像素级分类)→ CRF;
  4. 若需大规模/深度模型推断(如基于深度学习的目标检测后验优化)→ 变分推断;
  5. 若需小样本参数估计(如稀有缺陷率估计)→ MCMC。

五、延伸学习资源

  1. 库文档:
    • pgmpy(贝叶斯网络):https://pgmpy.org/
    • pomegranate(HMM):https://pomegranate.readthedocs.io/
    • sklearn-crfsuite(CRF):https://sklearn-crfsuite.readthedocs.io/
    • pymc3(MCMC):https://docs.pymc.io/
  2. 经典教材:
    • 《概率图模型:原理与技术》(Koller著,概率图模型圣经)
    • 《贝叶斯机器学习实战》(Python实现案例)
  3. 纺织领域应用论文:
    • 《Bayesian network-based defect classification for textile fabrics》
    • 《A CRF-based approach for fabric defect detection using texture features》

通过以上梳理,可系统掌握概率图模型中的贝叶斯核心方法,并直接应用于纺织领域的目标检测、缺陷识别、序列建模等任务。如需针对具体场景(如基于CRF的纺织缺陷分割)深入优化,可进一步提供数据细节或需求,进行定制化调整。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值