📄 ep.m
字号:
function EP()
%function [M,S,A]=EP()
%
%
%
%
%
%
load kernel.txt %sigma矩阵
load edgematrix.txt %epsilon矩阵
sigma = kernel;
epsilon = edgematrix;
M = zeros(size(sigma)); %零矩阵
S = ones(size(sigma)); %全1矩阵
A = sigma;
delta = 0.01;
[row col]=size(epsilon);
k=1;
%对所有的边进行M值学习,若只需对67%的边进行预测,则可只修改下边的两层for循环
%因为Matlab中没有Do...While语句,可利用k来实现Do...While循环
while k == 1 | chg > 1.0E-6
%while k < 10
k = k+1;
chg = 0;
%只计算上三角矩阵
for i = 1:1:row-1
for j = i+1:1:col
if epsilon(i,j)==1 %用于判断两个知识元之间有无后续关系,有关系则进行M的计算
lambda = sigma([i j],[i j]);
lambda_ij = inv(inv(lambda)-M([i j],[i j]));
if all(eig(lambda_ij))%判断lambda_ij是否是正定矩阵
%rho = lambda_ij(1,2) / sqrt((abs(lambda_ij(1,1))+delta^2)*(abs(lambda_ij(2,2))+delta^2));
%下句sqrt(x)中x可能会出现负值,则结果可能为复数
rho = lambda_ij(1,2) / sqrt((lambda_ij(1,1)+delta^2)*(lambda_ij(2,2)+delta^2));
%下句asin(x)中x的值可能超出-1~1的范围,则结果可能为复数
Z = 1/2 + asin(rho*epsilon(i,j))/pi;
temp = [-lambda_ij(1,2)/(lambda_ij(1,1)+delta^2) 1;1 -lambda_ij(1,2)/(lambda_ij(2,2)+delta^2)];
beta_ij = epsilon(i,j) / (2*pi*sqrt(det(lambda_ij+eye(2)*rho*rho))*Z) * temp;
%fprintf('%f\n',beta_ij);
lambda_new = lambda_ij + 2*lambda_ij*beta_ij*lambda_ij;
M_new = inv(lambda_new) - inv(lambda_ij);
S_new = Z * sqrt(det(inv(lambda_new)*lambda_ij));
else continue
end
if all(eig(lambda_new))%判断lambda_new是否是正定矩阵
chg = chg + norm(M_new-M([i j],[i j])) + norm(S_new-S(i,j));
A_new = A + A(:,[i j])*inv(lambda)*(lambda_new-lambda)*inv(lambda)*A(:,[i j])';
else continue
end
M([i j],[i j]) = M_new;
S(i,j) = S_new;
A = A_new;
else continue
end
end
end
end
%M=triu(M)+triu(M,1)';
%S=triu(S)+triu(S,1)';
%fid=fopen('d.txt','w');
%fprintf(fid,'%d',M);
%fclose(fid);
%将M值写入M.txt文件中
dlmwrite('M.txt' ,M ,' ');
%Linkage Prediction,对所有的边进行链接预测,若只需对33%的边进行预测,则可只修改下边的两层for循环
[row col]=size(epsilon);
for r = 1:1:row-1
for s = r+1:1:col
K_rr = sigma(r,r) - sigma(:,r)'*(eye(size(sigma))+M*sigma)'*M*sigma(:,r);
K_rs = sigma(r,s) - sigma(:,r)'*(eye(size(sigma))+M*sigma)'*M*sigma(:,s);
K_ss = sigma(s,s) - sigma(:,s)'*(eye(size(sigma))+M*sigma)'*M*sigma(:,s);
%K_sr = sigma(s,r) - sigma(:,s)'*(eye(size(sigma))+M*sigma)'*M*sigma(:,r);
%sigma_rs = [K_rr K_rs, K_sr K_ss];
%为了和上面的变量rho区别,将此处变量定义为rho_
rho_ = K_rs / sqrt(K_ss * K_rr);
P(r,s)=1/2 + asin(rho_ * epsilon);
end
end
%将所有链接预测值输入到P.txt文件中
dlmwrite('P.txt', M, ' ');
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -