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
交作业的截图:
这两周诸事繁杂,所以概率图的学习进度放缓了些,下周开始要保持正常进度才行……