⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ep.m

📁 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 + -