平均通勤時(shí)間ACT( train, test )
function [ thisauc ] = ACT( train, test )
%% 計(jì)算ACT指標(biāo)并返回AUC值
? ? D = sparse(eye(size(train,1)));?
? ? % 生成稀疏的單位矩陣
? ? D(logical(D)) = sum(train,2);?
? ? % 生成度矩陣(對角線元素為同下標(biāo)節(jié)點(diǎn)的度)
? ? pinvL = sparse(pinv( full(D - train) ));? clear D;【pinvL代表Lxy】
? ? % 拉普拉斯矩陣的偽逆【pinv偽逆】
? ? Lxx = diag(pinvL);? ?
? ? % 取對角線元素【下標(biāo)相同的元素,為構(gòu)建?Lxx萧锉、Lyy】
? ? Lxx = repmat(Lxx, [1,size(train,1)]);?
? ? % 將對角線元素向量擴(kuò)展為n×n階矩陣【每行看成Lxx珊随,每列看成Lyy】
? ? sim = 1./(Lxx + Lxx' - 2*pinvL);? ? ? ? ? ? ?
? ? % 求相似度矩陣
? ? sim(isnan(sim)) = 0; sim(isinf(sim)) = 0;
? ? thisauc = CalcAUC(train,test,sim, 10000);? ?
? ? % 評測,計(jì)算該指標(biāo)對應(yīng)的AUC
end
余弦相似性CosPlus( train, test )
? ? sim = pinvL ./ (Lxx*Lxx').^0.5;? ? ? ? ? 【區(qū)別之處,其實(shí)只要有了Lxy叶洞,后續(xù)都好說了】? ? ? ? ? ? ?
其余同ACT
?重啟的隨機(jī)游走RWR( train, test, lambda )
function [ thisauc ] = RWR( train, test, lambda )
%% 計(jì)算RWR指標(biāo)并返回AUC值
? ? deg = repmat(sum(train,2),[1,size(train,2)]);
? ? train = train ./ deg; clear deg;
? ? % 求轉(zhuǎn)移矩陣
? ? I = sparse(eye(size(train,1)));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? % 生成單位矩陣
? ? sim = (1 - lambda) * inv(I- lambda * train') * I;
? ? sim = sim+sim';? ? ? ? ? ? ? ? ? ? ? ? ?
? ? % 相似度矩陣計(jì)算完成
? ? train = spones(train);?
? ? % 將鄰接矩陣還原,因?yàn)闊o孤立點(diǎn)惭婿,所以不會(huì)有節(jié)點(diǎn)的度為0
? ? thisauc = CalcAUC(train,test,sim, 10000);? ? ?
? ? % 評測不恭,計(jì)算該指標(biāo)對應(yīng)的AUC
end
SimRank( train, test, lambda)
function [ thisauc ] = SimRank( train, test, lambda)
%% 計(jì)算SimRank指標(biāo)并返回AUC值
? ? deg = sum(train,1);? ?
? ? % 求節(jié)點(diǎn)的入度【按列求和】,構(gòu)成行向量财饥,供調(diào)用
? ? lastsim = sparse(size(train,1), size(train,2));
? ? % 存儲(chǔ)前一步的迭代結(jié)果换吧,初始化為全0矩陣
? ? sim = sparse(eye(size(train,1)));
? ? % 存儲(chǔ)當(dāng)前步的迭代結(jié)果,初始化為單位矩陣
? ? while(sum(sum(abs(sim-lastsim)))>0.0000001)? ?
? ? % 迭代至穩(wěn)態(tài)的判定條件【多次迭代之后sim與上一次之差不足0.000001才可退出while】
? ? ? ? lastsim = sim;? sim = sparse(size(train,1), size(train,2));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? for nodex = 1:size(train,1)-1? ? ?
? ? ? ? %對每一對節(jié)點(diǎn)的值進(jìn)行更新
? ? ? ? ? ? if deg(nodex) == 0
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? end
? ? ? ? ? ? for nodey = nodex+1:size(train,1)? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? %-----將點(diǎn)x的鄰居和點(diǎn)y的鄰居所組成的所有節(jié)點(diǎn)對的前一步迭代結(jié)果相加
? ? ? ? ? ? ? ? if deg(nodey) == 0
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ? sim(nodex,nodey) = lambda * sum(sum(lastsim(train(:,nodex)==1,train(:,nodey)==1))) / (deg(nodex)*deg(nodey));
? ? end
? ? ? ? end
? ? ? ? sim = sim+sim'+ sparse(eye(size(train,1)));
? ? end
? ? thisauc = CalcAUC(train,test,sim, 10000);? ?
? ? % 評測钥星,計(jì)算該指標(biāo)對應(yīng)的AUC
end
局部隨機(jī)游走指標(biāo)LRW( train, test, steps, lambda )
function [ thisauc ] = LRW( train, test, steps, lambda )
%% 計(jì)算LRW指標(biāo)并返回AUC值
? ? deg = repmat(sum(train,2),[1,size(train,2)]);
? ? train = train ./ deg; clear deg;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? % 求轉(zhuǎn)移矩陣
? ? I = sparse(eye(size(train,1)));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? % 生成單位矩陣
? ? sim = I;
? ? stepi = 0;
? ? while(stepi < steps)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? % 隨機(jī)游走的迭代
? ? ? ? sim = (1-lambda)*I + lambda * train' * sim;
? ? ? ? stepi = stepi + 1;
? ? end
? ? sim = sim+sim';? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? % 相似度矩陣計(jì)算完成
? ? train = spones(train);
? ? % 將鄰接矩陣還原沾瓦,因?yàn)闊o孤立點(diǎn),所以不會(huì)有節(jié)點(diǎn)的度為0
? ? thisauc = CalcAUC(train,test,sim, 10000);? ?
? ? % 評測谦炒,計(jì)算該指標(biāo)對應(yīng)的AUC
end
function [ thisauc ] = SRW( train, test, steps, lambda )
%% 計(jì)算SRW指標(biāo)并返回AUC值
? ? deg = repmat(sum(train,2),[1,size(train,2)]);
? ? train = train ./ deg; clear deg;
? ? % 求轉(zhuǎn)移矩陣
? ? I = sparse(eye(size(train,1)));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? % 生成單位矩陣
? ? tempsim = I;? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? % 用來暫存每步的迭代結(jié)果
? ? stepi = 0; sim = sparse(size(train,1),size(train,2));? ? ? ? ?
? ? % 隨機(jī)游走的迭代 sim用來存儲(chǔ)每步迭代的分值之和
? ? while(stepi < steps)
? ? ? ? tempsim = (1-lambda)*I + lambda * train' * tempsim;
? ? ? ? stepi = stepi + 1;
? ? ? ? sim = sim + tempsim;
? ? end
? ? sim = sim+sim';? ? ? ? ? ? ? ? ? ? ? ?
? ? % 相似度矩陣計(jì)算完成
? ? train = spones(train);?
? ? %將鄰接矩陣還原贯莺,因?yàn)闊o孤立點(diǎn),所以不會(huì)有節(jié)點(diǎn)的度為0
? ? thisauc = CalcAUC(train,test,sim, 10000);? ?
? ? % 評測宁改,計(jì)算該指標(biāo)對應(yīng)的AUC
end