Coursera概率圖模型(Probabilistic Graphical Models)第四周編程作業分析
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 D‘s parents, % probability 1 to the best option from the EUF for that joint assignment % to D‘s 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)第四周編程作業分析