贝叶斯网络基本结构学习


pgmpy

Parameter learning: Given a set of data samples and a DAG that captures the dependencies between the variables, estimate the (conditional) probability distributions of the individual variables.

Structure learning: Given a set of data samples, estimate a DAG that captures the dependencies between the variables.

pgmpy.org
github.com/pgmpy/pgmpy_notebook/blob/master/blob/master/notebooks

代码记录

"""
学习链接 :
http://pgmpy.org/
https://github.com/pgmpy/pgmpy_notebook/blob/master/notebooks/9.%20Learning%20Bayesian%20Networks%20from%20Data.ipynb
"""
# ====================BN模型=========================
# 贝叶斯模型
from pgmpy.models import BayesianModel
# ====================参数学习=========================
# 参数估计
from pgmpy.estimators import ParameterEstimator
# MLE参数估计
from pgmpy.estimators import MaximumLikelihoodEstimator
# Bayesian参数估计
from pgmpy.estimators import BayesianEstimator
# ====================结构学习=========================
# ========评分搜索=========================
# 评分
from pgmpy.estimators import BdeuScore, K2Score, BicScore
# 穷举搜索
from pgmpy.estimators import ExhaustiveSearch
# 爬山搜索
from pgmpy.estimators import HillClimbSearch
# ========  约束  =========================
from pgmpy.estimators import ConstraintBasedEstimator
# 独立性
from pgmpy.independencies import Independencies
# ========  混合  =========================
from pgmpy.estimators import MmhcEstimator
# ==================== 通用库 =========================
import pandas as pd
import numpy as np
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

parameter Learning


def parameterLearning():
    data = pd.DataFrame(data={'fruit': ["banana", "apple", "banana", "apple", "banana","apple", "banana",
                                        "apple", "apple", "apple", "banana", "banana", "apple", "banana",],
                              'tasty': ["yes", "no", "yes", "yes", "yes", "yes", "yes",
                                        "yes", "yes", "yes", "yes", "no", "no", "no"],
                              'size': ["large", "large", "large", "small", "large", "large", "large",
                                        "small", "large", "large", "large", "large", "small", "small"]})
    model = BayesianModel([('fruit', 'tasty'), ('size', 'tasty')])  # fruit -> tasty <- size
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"========================================================"</span><span class="token punctuation">)</span>
pe <span class="token operator">=</span> ParameterEstimator<span class="token punctuation">(</span>model<span class="token punctuation">,</span> data<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">,</span> pe<span class="token punctuation">.</span>state_counts<span class="token punctuation">(</span><span class="token string">'fruit'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token comment"># unconditional</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">,</span> pe<span class="token punctuation">.</span>state_counts<span class="token punctuation">(</span><span class="token string">'size'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token comment"># unconditional</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">,</span> pe<span class="token punctuation">.</span>state_counts<span class="token punctuation">(</span><span class="token string">'tasty'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token comment"># conditional on fruit and size</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"========================================================"</span><span class="token punctuation">)</span>
mle <span class="token operator">=</span> MaximumLikelihoodEstimator<span class="token punctuation">(</span>model<span class="token punctuation">,</span> data<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>mle<span class="token punctuation">.</span>estimate_cpd<span class="token punctuation">(</span><span class="token string">'fruit'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token comment"># unconditional</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>mle<span class="token punctuation">.</span>estimate_cpd<span class="token punctuation">(</span><span class="token string">'tasty'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token comment"># conditional</span>

<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"========================================================"</span><span class="token punctuation">)</span>
est <span class="token operator">=</span> BayesianEstimator<span class="token punctuation">(</span>model<span class="token punctuation">,</span> data<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>est<span class="token punctuation">.</span>estimate_cpd<span class="token punctuation">(</span><span class="token string">'tasty'</span><span class="token punctuation">,</span> prior_type<span class="token operator">=</span><span class="token string">'BDeu'</span><span class="token punctuation">,</span> equivalent_sample_size<span class="token operator">=</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token comment"># Setting equivalent_sample_size to 10 means</span>
<span class="token comment"># that for each parent configuration, we add the equivalent of 10 uniform samples</span>
<span class="token comment"># (here: +5 small bananas that are tasty and +5 that aren't).</span>

<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"========================================================"</span><span class="token punctuation">)</span>
<span class="token comment"># Calibrate all CPDs of `model` using MLE:</span>
model<span class="token punctuation">.</span>fit<span class="token punctuation">(</span>data<span class="token punctuation">,</span> estimator<span class="token operator">=</span>MaximumLikelihoodEstimator<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"========================================================"</span><span class="token punctuation">)</span>
<span class="token comment"># generate data</span>
data <span class="token operator">=</span> pd<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span>np<span class="token punctuation">.</span>random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span>low<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> high<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">,</span> size<span class="token operator">=</span><span class="token punctuation">(</span><span class="token number">5000</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> columns<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'A'</span><span class="token punctuation">,</span> <span class="token string">'B'</span><span class="token punctuation">,</span> <span class="token string">'C'</span><span class="token punctuation">,</span> <span class="token string">'D'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
model <span class="token operator">=</span> BayesianModel<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">,</span> <span class="token string">'B'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'A'</span><span class="token punctuation">,</span> <span class="token string">'C'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'D'</span><span class="token punctuation">,</span> <span class="token string">'C'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'B'</span><span class="token punctuation">,</span> <span class="token string">'D'</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
model<span class="token punctuation">.</span>fit<span class="token punctuation">(</span>data<span class="token punctuation">,</span> estimator<span class="token operator">=</span>BayesianEstimator<span class="token punctuation">,</span> prior_type<span class="token operator">=</span><span class="token string">"BDeu"</span><span class="token punctuation">)</span> <span class="token comment"># default equivalent_sample_size=5</span>
<span class="token keyword">for</span> cpd <span class="token keyword">in</span> model<span class="token punctuation">.</span>get_cpds<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span>cpd<span class="token punctuation">)</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

structural Learning with Score


def structuralLearning_Score():
    """
        score-based structure learning
        constraint-based structure learning
    The combination of both techniques allows further improvement:
        hybrid structure learning
    """
    print("===================基于评分=================================")
    # create random data sample with 3 variables, where Z is dependent on X, Y:
    data = pd.DataFrame(np.random.randint(0, 4, size=(5000, 2)), columns=list('XY'))
    data['Z'] = data['X'] + data['Y']
bdeu <span class="token operator">=</span> BdeuScore<span class="token punctuation">(</span>data<span class="token punctuation">,</span> equivalent_sample_size<span class="token operator">=</span><span class="token number">5</span><span class="token punctuation">)</span>
k2 <span class="token operator">=</span> K2Score<span class="token punctuation">(</span>data<span class="token punctuation">)</span>
bic <span class="token operator">=</span> BicScore<span class="token punctuation">(</span>data<span class="token punctuation">)</span>

model1 <span class="token operator">=</span> BayesianModel<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token string">'X'</span><span class="token punctuation">,</span> <span class="token string">'Z'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'Y'</span><span class="token punctuation">,</span> <span class="token string">'Z'</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span>  <span class="token comment"># X -&gt; Z &lt;- Y</span>
model2 <span class="token operator">=</span> BayesianModel<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">(</span><span class="token string">'X'</span><span class="token punctuation">,</span> <span class="token string">'Z'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token string">'X'</span><span class="token punctuation">,</span> <span class="token string">'Y'</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">)</span>  <span class="token comment"># Y &lt;- X -&gt; Z</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"==========基于评分===model1==============="</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>bdeu<span class="token punctuation">.</span>score<span class="token punctuation">(</span>model1<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>k2<span class="token punctuation">.</span>score<span class="token punctuation">(</span>model1<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>bic<span class="token punctuation">.</span>score<span class="token punctuation">(</span>model1<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"==========基于评分===model2==============="</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>bdeu<span class="token punctuation">.</span>score<span class="token punctuation">(</span>model2<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>k2<span class="token punctuation">.</span>score<span class="token punctuation">(</span>model2<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>bic<span class="token punctuation">.</span>score<span class="token punctuation">(</span>model2<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"==========基于评分===局部评分=============="</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>bdeu<span class="token punctuation">.</span>local_score<span class="token punctuation">(</span><span class="token string">'Z'</span><span class="token punctuation">,</span> parents<span class="token operator">=</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>bdeu<span class="token punctuation">.</span>local_score<span class="token punctuation">(</span><span class="token string">'Z'</span><span class="token punctuation">,</span> parents<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'X'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>bdeu<span class="token punctuation">.</span>local_score<span class="token punctuation">(</span><span class="token string">'Z'</span><span class="token punctuation">,</span> parents<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'X'</span><span class="token punctuation">,</span> <span class="token string">'Y'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"==========基于评分===穷举搜索算法=============="</span><span class="token punctuation">)</span>
<span class="token comment"># 穷举搜索(计算困难),启发式搜索</span>
es <span class="token operator">=</span> ExhaustiveSearch<span class="token punctuation">(</span>data<span class="token punctuation">,</span> scoring_method<span class="token operator">=</span>bic<span class="token punctuation">)</span>
<span class="token comment"># 获取分数最高的分数</span>
best_model <span class="token operator">=</span> es<span class="token punctuation">.</span>estimate<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>best_model<span class="token punctuation">.</span>edges<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\n 遍历所有的分数:"</span><span class="token punctuation">)</span>
<span class="token keyword">for</span> score<span class="token punctuation">,</span> dag <span class="token keyword">in</span> <span class="token builtin">reversed</span><span class="token punctuation">(</span>es<span class="token punctuation">.</span>all_scores<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span>score<span class="token punctuation">,</span> dag<span class="token punctuation">.</span>edges<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"==========基于评分===爬山搜索算法=============="</span><span class="token punctuation">)</span>
data <span class="token operator">=</span> pd<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span>np<span class="token punctuation">.</span>random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> size<span class="token operator">=</span><span class="token punctuation">(</span><span class="token number">2500</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> columns<span class="token operator">=</span><span class="token builtin">list</span><span class="token punctuation">(</span><span class="token string">'ABCDEFGH'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
data<span class="token punctuation">[</span><span class="token string">'A'</span><span class="token punctuation">]</span> <span class="token operator">+=</span> data<span class="token punctuation">[</span><span class="token string">'B'</span><span class="token punctuation">]</span> <span class="token operator">+</span> data<span class="token punctuation">[</span><span class="token string">'C'</span><span class="token punctuation">]</span>
data<span class="token punctuation">[</span><span class="token string">'H'</span><span class="token punctuation">]</span> <span class="token operator">=</span> data<span class="token punctuation">[</span><span class="token string">'G'</span><span class="token punctuation">]</span> <span class="token operator">-</span> data<span class="token punctuation">[</span><span class="token string">'A'</span><span class="token punctuation">]</span>
hc <span class="token operator">=</span> HillClimbSearch<span class="token punctuation">(</span>data<span class="token punctuation">,</span> scoring_method<span class="token operator">=</span>BicScore<span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">)</span>
best_model <span class="token operator">=</span> hc<span class="token punctuation">.</span>estimate<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>best_model<span class="token punctuation">.</span>edges<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

structural Learning with Constraint


def structuralLearning_Constraint():
    print("===================基于约束=================================")
    # Identify independencies in the data set using hypothesis tests
    # Construct DAG (pattern) according to identified independencies
    data = pd.DataFrame(np.random.randint(0, 3, size=(2500, 8)),
                        columns=list('ABCDEFGH'))
    data['A'] += data['B'] + data['C']
    data['H'] = data['G'] - data['A']
    data['E'] *= data['F']
    # Independencies in the data can be identified
    #       using chi2 conditional independence tests
    est = ConstraintBasedEstimator(data)
    print("==========基于约束===条件独立测试===============")
    # test_conditional_independence(X, Y, Zs)
    # 判断X,Y在Zs的条件下是否条件独立
    # check if X is independent from Y given a set of variables Zs:
    print(est.test_conditional_independence('B', 'H'))  # dependent  False
    print(est.test_conditional_independence('B', 'E'))  # independent   True
    print(est.test_conditional_independence('B', 'H', ['A']))  # independent   True
    print(est.test_conditional_independence('A', 'G'))  # independent   True
    print(est.test_conditional_independence('A', 'G', ['H']))  # dependent   False
    print("==========基于约束===DAG构建=================")
    """
    1. 构造一个无向骨架——estimate_skeleton()
    2. 利用强迫边进行定向,得到部分有向无环图(PDAG;- skeleton_to_pdag()
    3. 通过以某种方式保守地定向剩余的边,将DAG模式扩展到DAG—pdag_to_dag()
    Step 1.&2. form the so-called PC algorithm.
    PDAGs are DirectedGraphs, that may contain both-way edges, 
        to indicate that the orientation for the edge is not determined.
    """
    skel, seperating_sets = est.estimate_skeleton(significance_level=0.01)
    print("Undirected edges: ", skel.edges())
    pdag = est.skeleton_to_pdag(skel, seperating_sets)
    print("PDAG edges:       ", pdag.edges())
    model = est.pdag_to_dag(pdag)
    print("DAG edges:        ", model.edges())
    print("==========基于约束===DAG构建===estimate方法=================")
    # he estimate()-method provides a shorthand for the three steps above
    #   and directly returns a BayesianModel
    # 三步并作一步,直接返回一个网络结构
    print(est.estimate(significance_level=0.01).edges())
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"==========基于约束===DAG构建===从independencies中学习======"</span><span class="token punctuation">)</span>
ind <span class="token operator">=</span> Independencies<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'B'</span><span class="token punctuation">,</span> <span class="token string">'C'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
                     <span class="token punctuation">[</span><span class="token string">'A'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string">'B'</span><span class="token punctuation">,</span> <span class="token string">'C'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'D'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
ind <span class="token operator">=</span> ind<span class="token punctuation">.</span>closure<span class="token punctuation">(</span><span class="token punctuation">)</span>  <span class="token comment"># required (!) for faithfulness</span>
model <span class="token operator">=</span> ConstraintBasedEstimator<span class="token punctuation">.</span>estimate_from_independencies<span class="token punctuation">(</span><span class="token string">"ABCD"</span><span class="token punctuation">,</span> ind<span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span>model<span class="token punctuation">.</span>edges<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

structural Learning with Hybrid

def structuralLearning_Hybrid():
    """
    MMHC算法[3]结合了基于约束和基于分数的方法。它有两部分:
        1. 使用基于约束的构造过程MMPC学习无向图骨架
        2. 基于分数的优化(BDeu分数+修改爬山)
    """
    print("===================混合方法=================================")
    # 实验数据生成
    data = pd.DataFrame(np.random.randint(0, 3, size=(2500, 8)), columns=list('ABCDEFGH'))
    data['A'] += data['B'] + data['C']
    data['H'] = data['G'] - data['A']
    data['E'] *= data['F']
    # 构建无向图骨架
    mmhc = MmhcEstimator(data)
    skeleton = mmhc.mmpc()
    print("Part 1) Skeleton: ", skeleton.edges())
    # 基于分数优化
    # use hill climb search to orient the edges:
    hc = HillClimbSearch(data, scoring_method=BdeuScore(data))
    model = hc.estimate(tabu_length=10, white_list=skeleton.to_directed().edges())
    print("Part 2) Model:    ", model.edges())
    print("===================两步划为一步=================================")
    # MmhcEstimator.estimate(self, scoring_method=None, tabu_length=10,
    #       significance_level=0.01)
    # mmhc.estimate(scoring_method=BdeuScore(data),tabu_length=10)

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

mian

if __name__ == "__main__":
    parameterLearning()
    structuralLearning_Score()
    structuralLearning_Constraint()
    structuralLearning_Hybrid()

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

运行展示

参数学习

1 ============参数估计=================================================
1 ========state_counts 统计信息=======
     fruit

apple 7
banana 7

    size

large 10
small 4

fruit apple banana
size large small large small
tasty
no 1.0 1.0 1.0 1.0
yes 3.0 2.0 5.0 0.0
1 MLE估计CPD按变量=====
±--------------±----+
| fruit(apple) | 0.5 |
±--------------±----+
| fruit(banana) | 0.5 |
±--------------±----+
±-----------±-------------±-------------------±--------------------±--------------+
| fruit | fruit(apple) | fruit(apple) | fruit(banana) | fruit(banana) |
±-----------±-------------±-------------------±--------------------±--------------+
| size | size(large) | size(small) | size(large) | size(small) |
±-----------±-------------±-------------------±--------------------±--------------+
| tasty(no) | 0.25 | 0.3333333333333333 | 0.16666666666666666 | 1.0 |
±-----------±-------------±-------------------±--------------------±--------------+
| tasty(yes) | 0.75 | 0.6666666666666666 | 0.8333333333333334 | 0.0 |
±-----------±-------------±-------------------±--------------------±--------------+
1 贝叶斯估计CPD按变量==
±-----------±--------------------±-------------------±-------------------±--------------------+
| fruit | fruit(apple) | fruit(apple) | fruit(banana) | fruit(banana) |
±-----------±--------------------±-------------------±-------------------±--------------------+
| size | size(large) | size(small) | size(large) | size(small) |
±-----------±--------------------±-------------------±-------------------±--------------------+
| tasty(no) | 0.34615384615384615 | 0.4090909090909091 | 0.2647058823529412 | 0.6428571428571429 |
±-----------±--------------------±-------------------±-------------------±--------------------+
| tasty(yes) | 0.6538461538461539 | 0.5909090909090909 | 0.7352941176470589 | 0.35714285714285715 |
±-----------±--------------------±-------------------±-------------------±--------------------+
1 fit函数估计=所有变量=
1 ===================================
±-----±---------+
| A(0) | 0.506593 |
±-----±---------+
| A(1) | 0.493407 |
±-----±---------+
±-----±-------------------±--------------------+
| A | A(0) | A(1) |
±-----±-------------------±--------------------+
| B(0) | 0.5183395779925064 | 0.48076533711277586 |
±-----±-------------------±--------------------+
| B(1) | 0.4816604220074936 | 0.5192346628872241 |
±-----±-------------------±--------------------+
±-----±-------------------±-------------------±--------------------±-------------------+
| A | A(0) | A(0) | A(1) | A(1) |
±-----±-------------------±-------------------±--------------------±-------------------+
| D | D(0) | D(1) | D(0) | D(1) |
±-----±-------------------±-------------------±--------------------±-------------------+
| C(0) | 0.5160626836434867 | 0.5142942227516378 | 0.49917576756645377 | 0.4964179104477612 |
±-----±-------------------±-------------------±--------------------±-------------------+
| C(1) | 0.4839373163565132 | 0.4857057772483621 | 0.5008242324335462 | 0.5035820895522388 |
±-----±-------------------±-------------------±--------------------±-------------------+
±-----±-------------------±-------------------+
| B | B(0) | B(1) |
±-----±-------------------±-------------------+
| D(0) | 0.5029982010793523 | 0.4918114639504693 |
±-----±-------------------±-------------------+
| D(1) | 0.4970017989206476 | 0.5081885360495306 |
±-----±-------------------±-------------------+

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

评分搜索


2 =基于评分===============
2 基于评分=model1=======
-13939.038934816337
-14329.822136429982
-14295.079563299281
2 基于评分=model2=======
-20900.389985754824
-20927.22925737244
-20944.436530518695
2 基于评分=局部评分======
-9232.535088735991
-6990.879293129073
-57.11895038935745
2 基于评分=穷举搜索算法======
[(‘X’, ‘Z’), (‘Y’, ‘Z’)]

 遍历所有的分数:

-14295.079563299281 [(‘X’, ‘Z’), (‘Y’, ‘Z’)]
-14326.77068416731 [(‘X’, ‘Y’), (‘Z’, ‘X’), (‘Z’, ‘Y’)]
-14326.770684167312 [(‘Y’, ‘X’), (‘Z’, ‘X’), (‘Z’, ‘Y’)]
-14326.770684167312 [(‘Y’, ‘Z’), (‘Y’, ‘X’), (‘Z’, ‘X’)]
-14326.770684167312 [(‘X’, ‘Z’), (‘Y’, ‘Z’), (‘Y’, ‘X’)]
-14326.770684167312 [(‘X’, ‘Y’), (‘X’, ‘Z’), (‘Z’, ‘Y’)]
-14326.770684167312 [(‘X’, ‘Y’), (‘X’, ‘Z’), (‘Y’, ‘Z’)]
-16536.707465219723 [(‘X’, ‘Y’), (‘Z’, ‘Y’)]
-16537.846854154086 [(‘Y’, ‘X’), (‘Z’, ‘X’)]
-18701.669239663883 [(‘Z’, ‘X’), (‘Z’, ‘Y’)]
-18701.669239663883 [(‘Y’, ‘Z’), (‘Z’, ‘X’)]
-18701.669239663886 [(‘X’, ‘Z’), (‘Z’, ‘Y’)]
-20911.606020716295 [(‘Z’, ‘Y’)]
-20911.606020716295 [(‘Y’, ‘Z’)]
-20912.745409650663 [(‘Z’, ‘X’)]
-20912.745409650663 [(‘X’, ‘Z’)]
-20943.297141584328 [(‘Y’, ‘X’), (‘Z’, ‘Y’)]
-20943.297141584328 [(‘Y’, ‘Z’), (‘Y’, ‘X’)]
-20943.297141584328 [(‘X’, ‘Y’), (‘Y’, ‘Z’)]
-20944.436530518695 [(‘X’, ‘Z’), (‘Y’, ‘X’)]
-20944.436530518695 [(‘X’, ‘Y’), (‘Z’, ‘X’)]
-20944.436530518695 [(‘X’, ‘Y’), (‘X’, ‘Z’)]
-23122.682190703075 []
-23154.373311571104 [(‘Y’, ‘X’)]
-23154.373311571104 [(‘X’, ‘Y’)]
2 基于评分=爬山搜索算法======
[(‘A’, ‘H’), (‘A’, ‘C’), (‘A’, ‘B’), (‘C’, ‘B’), (‘G’, ‘H’)]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

约束

3 ===================基于约束=================================
3 ==========基于约束===条件独立测试===============
False
True
True
True
False
3 ==========基于约束===DAG构建=================
Undirected edges:  [('A', 'B'), ('A', 'C'), ('A', 'H'), ('E', 'F'), ('G', 'H')]
PDAG edges:        [('A', 'H'), ('B', 'A'), ('C', 'A'), ('E', 'F'), ('F', 'E'), ('G', 'H')]
DAG edges:         [('A', 'H'), ('B', 'A'), ('C', 'A'), ('F', 'E'), ('G', 'H')]
3 ==========基于约束===DAG构建===estimate方法=================
[('A', 'H'), ('B', 'A'), ('C', 'A'), ('F', 'E'), ('G', 'H')]
3 ==========基于约束===DAG构建===从independencies中学习======
[('A', 'D'), ('B', 'D'), ('C', 'D')]

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

混合

4 ===================混合方法=================================
Part 1) Skeleton:  [('A', 'H'), ('A', 'C'), ('E', 'F'), ('G', 'H')]
Part 2) Model:     [('A', 'C'), ('E', 'F'), ('H', 'A'), ('H', 'G')]
4 ===================两步划为一步=================================
。。。

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值