Glocal代码理解
目录
data
data为数据集,本论文提供的代码使用的数据集为:art,分test和train
evl
evl是评价指标,本论文代码主要采用以下指标:
AU_ROC-ROC曲线下面积,AUC表示ROC曲线下的面积,主要用于衡量模型的泛化性能,即分类效果的好坏.
Average_precision:计算预测的平均精度。
coverage:覆盖率,计算需要多少步才能将预测的标签排名向下移动以覆盖实例的所有正标签。
Ranking:排名损失,负面标签排名高于正面标签的分数。
lib
lib依赖里主要是manopt包,Manopt是一个用于流形优化的Matlab工具箱。
clf
clf为分类器,也是作者真正写代码的部分。
InitGroup是初始化组,聚类
InitUVW:作用为:初始化 U , V , W U,V,W U,V,W,其中, Y ∈ R l × n Y\in \mathbb{R}^{l\times n} Y∈Rl×n是一个 l × n l\times n l×n的实际标签矩阵,它的秩是 k < l k<l k<l,将它分解为两个矩阵 U ∈ R l × k U\in \mathbb{R}^{l\times k} U∈Rl×k和 V ∈ R k × n V\in \mathbb{R}^{k\times n} V∈Rk×n为了将实例映射到潜在标签,设置 W ∈ R d × k W\in \mathbb{R}^{d\times k} W∈Rd×k是一个 d × k d\times k d×k的矩阵。可通过最小化平方损失得到。
UpdateS:作用为在梯度下降的过程中不断的修正Z
UpdateU:作用为在梯度下降的过程中不断的修正U
UpdateV:作用为在梯度下降的过程中不断的修正V
UpdateW:作
用为在梯度下降的过程中不断的修正W
代码主程序MLCTrain(本质就是不断循环梯度下降修正参数来得到满足下式的4个参数):
function [V,U,W,MgPool,Beta,time,T,perf] = MLCTrain(J,Y, X, Ytst,Xtst,param)
[d,n] = size(X);
[l,~] = size(Y);
k = param.k;
k2 = param.k2;
V = rand(k,n);
W = zeros(d,k);
U = rand(l,k);
perf = 0;
o = sum(J(:));
perf = [];
param.lambda = param.lambda*o/(k*n);
param.lambda1 = param.lambda1*o/((n/param.g)^2);
param.lambda2 = param.lambda2*o/(n^2);
param.lambda3 = param.lambda3*o/(n*k);
param.lambda4 = param.lambda4*o/(l*k);
param.lambda5 = param.lambda5*o/(d*k);
% obj = 0.5*norm(J.*(Y-U*V),'fro')^2 + 0.5*param.lambda*norm(V-W'*X,'fro')^2;
% zz = mean(Ytst);
% Ytst(:,zz==-1) = [];
% Xtst(:,zz==-1) = [];
% tstv = (U*W'*Xtst);
% perf_tmp = evalt(tstv,Ytst, (max(tstv(:))-min(tstv(:)))/2);
% perf_tmp.obj = obj;
% perf = [perf;perf_tmp];
tic;
%[T, ~] = kmeans(X',param.g,'emptyaction','drop','MaxIter',50, 'Start','sample');
[T, ~] = kmeans(X',param.g,'emptyaction','drop');
cluster_time = toc;
tic;
[betav, XGXGPool, XX, param ] = InitGroup( Y, X,T, param );
Beta = betav;
g = param.g;
MgPool = cell(g,1);
LgPool = cell(g,1);
for i = 1:g
LgPool{i} = rand(l,k2);
end
% param.maxIter = 1;
% param.tooloptions.maxiter = 10;
% param.tooloptions.gradnorm = 1e-3;
param.maxIter = 15;
param.tooloptions.maxiter = 60;
param.tooloptions.gradnorm = 1e-5;
[ U,V,W ] = InitUVW(J,Y,U,V,W,X,XX,param);
obj_old = [];
last = 0;
WXXW = W'*XX*W;
UWXXWU = U*WXXW*U';
WXGXGWPool = cell(g,1);
UWXGXGWUPool = cell(g,1);
for i = 1:g
WXGXGWPool{i} = W'*XGXGPool{i}*W;
UWXGXGWUPool{i} = U*WXGXGWPool{i}*U';
end
init_time = toc;
tic;
for i=1:param.maxIter
disp(i);
for gr=1:g
UWXGXGWU = UWXGXGWUPool{gr};
[Lg] = UpdateS(LgPool{gr},betav(gr),UWXXWU,UWXGXGWU,param);
LgPool{gr} = Lg;
MgPool{gr} = Lg*Lg';
end
[ V ] = UpdateV(V, J,Y,U,W,X,param );
[ U ] = UpdateU(U, J, Y, V, betav,MgPool,WXXW,WXGXGWPool, param );
[ W, WXXW,WXGXGWPool ] = UpdateW(W, U, V, X, betav, XX, XGXGPool, MgPool, param );
UWXXWU = U*WXXW*U';
for gr=1:g
UWXGXGWUPool{gr} = U*WXGXGWPool{gr}*U';
end
% [ V ] = UpdateV( V, Y, U, W, X, param);
% [U,USU] = UpdateU( U, Y, V, S, WXXW, USU, param );
% [ W, WXXW ] = UpdateW(W, V, X, XX, WXXW, USU, param);
% UWXXWU = U'*WXXW*U;
% [ L,S,USU ] = UpdateS(L,U, UWXXWU);
% obj = 0.5*norm(Y-U*V)^2 + 0.5*param.lambda1*trace(WXXW*USU) + 0.5*param.lambda2*norm(U)^2 + 0.5*param.lambda3*norm(W)^2;
obj = 0.5*norm(J.*(Y-U*V),'fro')^2 + 0.5*param.lambda*norm(V-W'*X,'fro')^2;
% zz = mean(Ytst);
% Ytst(:,zz==-1) = [];
% Xtst(:,zz==-1) = [];
% tstv = (U*W'*Xtst);
% perf_tmp = evalt(tstv,Ytst, (max(tstv(:))-min(tstv(:)))/2);
% perf_tmp.obj = obj;
% perf = [perf;perf_tmp];
disp(obj);
last = last + 1;
obj_old = [obj_old;obj];
if last < 5
continue;
end
stopnow = 1;
for ii=1:3
stopnow = stopnow & (abs(obj-obj_old(last-1-ii)) < 1e-6);
end
if stopnow
break;
end
end
alg_time = toc;
time.fill=0;
time.clust=cluster_time;
time.init = init_time;
time.run = alg_time;
end
总体流程:先初始化四个矩阵,用梯度下降的方式得到 U , V , W , Z U,V,W,Z U,V,W,Z 的任意一个,然后确定其余的最终结束条件为得到满足要求的四个矩阵。
MASP阅读及代码复现
代码运行
配置环境
3.通过anconda下载pytorch(注意根据本机的cuda版本在pytorch官网查相对应的指令再下载),配置环境验证是否能使用pytorch与是否能用gpu加速。
MASP调试成功(能运行,部分结果未分析)
论文部分:
摘要:本文提出了一种基于串-并神经网络 的多标签主动学习算法。对于标签关联,网络的串行部分提取所有标签共有的特征。这种机制比显式特征提取和压缩感知方法更有效。对于缺少的标签,网络将其损耗设置为用于反向传播的零。这样,就不需要完成可能会引入其他错误的标签。对于标签查询,网络的并行部分独立地为每个标签提供成对的预测。这种成对预测提供了计算标签不确定性的适当信息。在20个基准数据集上进行了3组实验,并与14个流行算法进行了比较。实验结果表明,该算法达到了最先进的主动学习性能。
下一步工作
1.理解MASP的网络,算法部分及代码。
2.在尽快掌握MASP代码的基础上尽快掌握boolean矩阵分解的方法(看论文),然后争取早点写代码,跑出结果。