1. 程式人生 > >Coursera概率圖模型(Probabilistic Graphical Models)第四周編程作業分析

Coursera概率圖模型(Probabilistic Graphical Models)第四周編程作業分析

map tel ica join 正常 最大化 expected 聯合 else

Decision Making

作決策

這一周的內容在老版本的CS228課程中,是作為第六周的一個小節講的(老版本的CS229只有9周的課程),而在概率圖模型的教材裏邊對應的是第22章效用和決策。也就是說,這一周的課程更多的是對之前所學知識的一種應用。

1.記號和定義

使用影響圖來表現本周所學的內容,如下圖所示:

技術分享圖片

其中,X表示隨機變量,D表示決策節點,U表示效用節點。

2.已知決策規則的期望效用

我們可以將隨機變量與決策節點一起看做一個貝葉斯網絡,並只保留效用節點的父節點,即對其它節點用VariableElimination函數進行變量消除,將所得因子的val值與效用節點的val值相乘即可。公式如下式所示:

技術分享圖片

SimpleCalcExpectedUtility.m 簡單計算期望效用

參考代碼如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%

% YOUR CODE HERE

%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

V = unique([F(:).var]);

Z = setdiff(V, U.var);

Fnew = VariableElimination(F, Z);

 

Ffinal 
= Fnew(1); for ii = 2 : length(Fnew)   Ffinal = FactorProduct(Ffinal, Fnew(ii)); end Ffinal.val = Ffinal.val / sum(Ffinal.val); U_reorder_val = zeros(size(U.val)); for ii = 1 : prod(U.card)   U_reorder_val(ii) = GetValueOfAssignment(U, IndexToAssignment(ii, U.card), Ffinal.var); end EU
= Ffinal.val * U_reorder_val;

2.基於期望效用因子最大化期望效用

上一章的公式可以變形如下式:

技術分享圖片

我們需要計算的期望效用,就是式中的技術分享圖片部分。這裏我們可以將隨機變量與效用節點一起看做一個貝葉斯網絡,將網絡中與決策節點無關的變量消除,其剩余因子的因子積就是我們要求的最大期望效用。

CalculateExpectedUtilityFactor.m 計算期望效用因子

參考代碼如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%

% YOUR CODE HERE...

%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

F = [I.RandomFactors, I.UtilityFactors];

 

V = unique([F(:).var]);

Z = setdiff(V, I.DecisionFactors(1).var);

Fnew = VariableElimination(F, Z);

 

EUF = Fnew(1);

for ii = 2 : length(Fnew)

  EUF = FactorProduct(EUF, Fnew(ii));

end

OptimizeMEU.m 優化最大期望效用

這裏就是取效用最大的決策方案。註意一下多個決策節點時OptimalDecisionRule.var的含義。

參考代碼如下:

OptimalDecisionRule = CalculateExpectedUtilityFactor(I);

 

if length(OptimalDecisionRule.var) == 1

  [MEU, index] = max(OptimalDecisionRule.val);

  OptimalDecisionRule.val = zeros(size(OptimalDecisionRule.val));

  OptimalDecisionRule.val(index) = 1;

else

  assignments = IndexToAssignment(1 : prod(OptimalDecisionRule.card(1 : end - 1)), OptimalDecisionRule.card(1 : end - 1));

  MEU = 0;

  for ii = 1 : OptimalDecisionRule.card(end)

    indices1 = AssignmentToIndex([assignments, ii * ones(size(assignments, 1), 1)], OptimalDecisionRule.card);

    [meu, indices2] = max(OptimalDecisionRule.val(indices1));

    MEU = MEU + meu;

    OptimalDecisionRule.val(indices1) = 0;

    OptimalDecisionRule.val(indices1(indices2)) = 1;

  end

end

3.多效用因子

我們還往往會遇到不止一個效用節點的情況,如下圖所示:

技術分享圖片

這種情況下,我們當然是選擇能夠使多個效用節點期望值的和最大的決策啦。我們有兩種處理方案:一種是直接求出每一個效用節點的期望值,之後直接加和即可;另一種是利用下式所示的公式對效用節點進行變形,之後直接計算最大期望效用即可。

上述的兩種方法都會要用到因子求和函數,這個函數在這一周的作業中並沒有提供……但是,可以在第七周的作業PA-Exact-Inference-Release中找到,函數名為FactorSum.m,直接把函數的全部內容復制在我們這一周的作業後邊就好。

FactorSum.m 因子求和

第七周作業提供的代碼如下:

function C = FactorSum(A, B)

 

if (isempty(A.var)), C = B; return; end;

if (isempty(B.var)), C = A; return; end;

 

[dummy iA iB] = intersect(A.var, B.var);

if ~isempty(dummy)

    assert(all(A.card(iA) == B.card(iB)), Dimensionality mismatch in factors);

end

 

C.var = union(A.var, B.var);

 

 

[dummy, mapA] = ismember(A.var, C.var);

[dummy, mapB] = ismember(B.var, C.var);

 

C.card = zeros(1, length(C.var));

C.card(mapA) = A.card;

C.card(mapB) = B.card;

 

C.val = zeros(1,prod(C.card));

 

assignments = IndexToAssignment(1:prod(C.card), C.card);

indxA = AssignmentToIndex(assignments(:, mapA), A.card);

indxB = AssignmentToIndex(assignments(:, mapB), B.card);

 

C.val = A.val(indxA) + B.val(indxB);

 

end

OptimizeWithJointUtility.m 聯合效用優化

參考代碼如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%

% YOUR CODE HERE

%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

U = I.UtilityFactors(1);

for ii = 2 : length(I.UtilityFactors)

    U = FactorSum(U, I.UtilityFactors(ii));

end

I.UtilityFactors = U;

[MEU, OptimalDecisionRule] = OptimizeMEU(I);

OptimizeLinearExpectations.m 線性期望優化

參考代碼如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%

% YOUR CODE HERE

%

% A decision rule for D assigns, for each joint assignment to Ds parents,

% probability 1 to the best option from the EUF for that joint assignment

% to Ds parents, and 0 otherwise. Note that when D has no parents, it is

% a degenerate case we can handle separately for convenience.

%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

OptimalDecisionRule = struct(var, [], card, [], val, []);

for ii = 1 : length(I.UtilityFactors)

I_ = I;

I_.UtilityFactors = I.UtilityFactors(ii);

EUF_ = CalculateExpectedUtilityFactor(I_);

OptimalDecisionRule = FactorSum(OptimalDecisionRule, EUF_);

end

 

if length(OptimalDecisionRule.var) == 1

    [MEU, index] = max(OptimalDecisionRule.val);

    OptimalDecisionRule.val = zeros(size(OptimalDecisionRule.val));

    OptimalDecisionRule.val(index) = 1;

else

    assignments = IndexToAssignment(1 : prod(OptimalDecisionRule.card(1 : end - 1)), OptimalDecisionRule.card(1 : end - 1));

    MEU = 0;

    for ii = 1 : OptimalDecisionRule.card(end)

        indices1 = AssignmentToIndex([assignments, ii * ones(size(assignments, 1), 1)], OptimalDecisionRule.card);

        [meu, indices2] = max(OptimalDecisionRule.val(indices1));

        MEU = MEU + meu;

        OptimalDecisionRule.val(indices1) = 0;

        OptimalDecisionRule.val(indices1(indices2)) = 1;

    end

end

交作業的截圖:

技術分享圖片

這兩周諸事繁雜,所以概率圖的學習進度放緩了些,下周開始要保持正常進度才行……

Coursera概率圖模型(Probabilistic Graphical Models)第四周編程作業分析