我在MATLAB中编写了一个小程序来计算Shapley值 使用TU游戏的多线性扩展。但是,我跑了 使用MATLAB的Symbolic Math Toolbox陷入困境。在 程序我必须集成一组函数来获得 Shapley值。但是,在MATLAB程序中我无法使用 int()命令
Error using sym/subsindex (line 663) Ivalid indexing or function definition. When defining a function, ensure that the body of the function is a SYM object. When indexing, the input must be numeric, logical or ':'.
Error in ShapleyValueML (line 65)shv(jj)=int(dfy,0,1)
因此我必须使用integral()代替。在这种情况下,我 需要将表达式转录成MATLAB函数句柄 用matlabFunction()。但是,在所有Linux机器(MATLAB R2014a)上 我有权访问此命令不起作用(请参阅下面的讨论)。 作为解决方法,MATLAB程序返回一组函数 在当前工作空间中,可以计算Shapley值 使用int()命令。
为了使讨论更具体,让我们考虑一下这个问题 首先是MATLAB程序。
function [shv,F,dfm]=ShapleyValueML(v)
N=length(v);
[~, n]=log2(N);
S=1:N;
int=0:-1:1-n;
mat=(rem(floor(S(:)*pow2(int)),2)==1);
cmat=(rem(floor(S(:)*pow2(int)),2)==0);
x=sym('x',[1 n]);
mx=1-x;
y = sym('y');
vy=ones(1,n)*y;
F=0;
shv=zeros(1,n);
dfm=cell(1,n);
for ss=1:N
pd1=x(mat(ss,:));
pd2=mx(cmat(ss,:));
pd=prod(pd1)*prod(pd2)*v(ss);
F=pd+F;
end
F=expand(F);
for jj=1:n
dF=diff(F,x(jj));
dfy=subs(dF,x,vy);
%% Does not work!! MATLAB bug???
% mf=matlabFunction(dfy);
% shv(jj)=integral(mf,0,1);
%%
%% The best would be to use:
%%
% shv(jj)=int(dfy,0,1)
%% but it cannot be used inside a program.
dfm{jj}=dfy;
end
end
评论的部分是不能在里面工作的部分 程序,但需要计算Shapley值 与该计划,这是它的目的。我测试了这个程序 最多12名球员,我能够成功计算出来 Shapley值通过两步程序。因此,上述计划 正确指出所考虑的问题。为了更好 理解这两步程序和功能 在上述节目中,让我们专注于三人游戏。 联盟的值由以下数据数组
给出>> v = [0,0,90,0,100,120,220];
请注意,联盟是按照其独特的方式订购的 整数表示。游戏已定义,我们现在可以评估 多线性扩展和一组偏导数 以上程序,但不是Shapley值。
>> [shv,F,dfm]=ShapleyValueML(v);
该组偏导数的积分在对角线上运行 单位立方体,但我们可以设置[x1,x2,x3]的变量 到[y,y,y],积分从0到1运行。
>> for k=1:3, shv(k)=int(dfm{k},0,1);end;
整合的解决方案是Shapley值,由下式给出:
>> shv
shv =
65 75 80
检查这确实是Shapley值可以完成
中实施的潜在功能方法>> sh_v=ShapleyValue(v)
sh_v =
65 75 80
附带我的MATLAB Game Theory Toolbox MatTuGames来自
http://www.mathworks.com/matlabcentral/fileexchange/35933-mattugames
不是与int()集成,也可以使用integral(), 但接下来的内容如
>> dfm{1}
ans =
- 90*y^2 + 190*y
必须用matlabFunction()重写成函数句柄。就像我一样 如上所述,这在Linux下不起作用 (MATLAB R2013a,R2013b,R2014a)。要看到这一点,让我们尝试重现 例子
>> syms x y
>> r = sqrt(x^2 + y^2);
来自网址上的文档:
这应该给出
ht =
@(x,y)tanh(sqrt(x.^2+y.^2))
但我得到
>> ht = matlabFunction(tanh(r))
Cell contents reference from a non-cell array object.
Error in vectorize (line 15)
c = cells{i};
Error in sym/matlabFunction>mup2mat (line 319)
res = vectorize(res(2:end-1)); % remove quotes
Error in sym/matlabFunction>mup2matcell (line 304)
r = mup2mat(c{1});
Error in sym/matlabFunction (line 123)
body = mup2matcell(funs);
现在我的问题出现了:存在一个替代程序 来自
>> dfm{1}
ans =
- 90*y^2 + 190*y
一个函数句柄
>> df=@(y) (- 90.*y.^2 + 190.*y)
df =
@(y)(-90.*y.^2+190.*y)
通过
整合它>> integral(df,0,1)
ans =
65
或者换句话说。有没有替代方法可用 将乘法*改为逐元素乘法。*,和 动力操作^以元素为动力。^?
当然,对上述MATLAB程序有任何改进建议 非常感谢。
答案 0 :(得分:2)
我想我知道问题是什么;在ShapleyValueML
函数的开头,您有一个名为int
的变量,它隐藏内置integration function:
...
int=0:-1:1-n; %# <-- problem!
...
shv(jj)=int(dfy,0,1)
...
这解释了来自sym/subsindex
的错误,您使用符号对象作为数值数组int
的索引。
将变量名称更改为其他名称,并且注释的代码运行正常(符号集成)!很简单:)