Done 5.1, check 5.2 impl (convergence error is a bit high)
This commit is contained in:
parent
1bcce91807
commit
7355b27cd3
3 changed files with 156 additions and 22 deletions
|
@ -1,22 +0,0 @@
|
|||
%[U,G] = surfer('https://www.usi.ch',500);
|
||||
% pagerank(U,G);
|
||||
|
||||
% A = (1/40) * [1 1 1 35 1 1;
|
||||
% 18 1 1 1 1 1;
|
||||
% 18 18 1 1 1 1;
|
||||
% 1 18 35 1 1 1;
|
||||
% 1 1 1 1 1 35;
|
||||
% 1 1 1 1 35 1];
|
||||
A = (1/40) * [
|
||||
0 0 0 40 0 0;
|
||||
20 0 0 0 0 0;
|
||||
20 20 0 0 0 0;
|
||||
0 20 40 0 0 0;
|
||||
0 0 0 0 0 40;
|
||||
0 0 0 0 40 0];
|
||||
|
||||
[v,d] = eig(A);
|
||||
|
||||
display(d);
|
||||
display(v);
|
||||
|
72
mp1/files_data/pagerank1.m
Normal file
72
mp1/files_data/pagerank1.m
Normal file
|
@ -0,0 +1,72 @@
|
|||
function x = pagerank1(U,G,p)
|
||||
% PAGERANK Google's PageRank
|
||||
% pagerank(U,G,p) uses the URLs and adjacency matrix produced by SURFER,
|
||||
% together with a damping factory p, (default is .85), to compute and plot
|
||||
% a bar graph of page rank, and print the dominant URLs in page rank order.
|
||||
% x = pagerank(U,G,p) returns the page ranks instead of printing.
|
||||
% See also SURFER, SPY.
|
||||
|
||||
if nargin < 3, p = .85; end
|
||||
|
||||
% Eliminate any self-referential links
|
||||
%G = G - diag(diag(G));
|
||||
|
||||
% c = out-degree, r = in-degree
|
||||
[~,n] = size(G);
|
||||
c = sum(G,1);
|
||||
r = sum(G,2);
|
||||
|
||||
% Scale column sums to be 1 (or 0 where there are no out links).
|
||||
k = find(c~=0);
|
||||
D = sparse(k,k,1./c(k),n,n);
|
||||
|
||||
e = ones(n,1);
|
||||
|
||||
% ----------------------------- POWER METHOD ------------------------------
|
||||
disp('Using power method implementation\n');
|
||||
|
||||
x = ones(n, 1) * 1/n;
|
||||
|
||||
G = p * G * D;
|
||||
z = ((1 - p) * (c ~= 0) + (c == 0))/n;
|
||||
it = 0;
|
||||
|
||||
new_x = x;
|
||||
old_norm = -1;
|
||||
no = +Inf;
|
||||
|
||||
while old_norm == -1 || old_norm > no
|
||||
x = new_x;
|
||||
old_norm = no;
|
||||
new_x = G * x + e * (z * x);
|
||||
new_x = new_x/sum(new_x);
|
||||
it = it + 1;
|
||||
no = norm(new_x - x, 2);
|
||||
end
|
||||
|
||||
% -------------------------------------------------------------------------
|
||||
|
||||
% Normalize so that sum(x) == 1.
|
||||
x = x/sum(x);
|
||||
|
||||
% Bar graph of page rank.
|
||||
shg
|
||||
bar(x)
|
||||
title('Page Rank')
|
||||
|
||||
% Print URLs in page rank order.
|
||||
|
||||
if nargout < 1
|
||||
[~,q] = sort(-x);
|
||||
disp(' page-rank in out url')
|
||||
k = 1;
|
||||
maxN = length(U);
|
||||
while (k <= maxN) && (x(q(k)) >= .005)
|
||||
disp(k)
|
||||
j = q(k);
|
||||
temp1 = r(j);
|
||||
temp2 = c(j);
|
||||
disp(fprintf(' %3.0f %8.4f %4.0f %4.0f %s', j,x(j),full(temp1),full(temp2),U{j}))
|
||||
k = k+1;
|
||||
end
|
||||
end
|
84
mp1/files_data/pagerank2.m
Normal file
84
mp1/files_data/pagerank2.m
Normal file
|
@ -0,0 +1,84 @@
|
|||
function x = pagerank2(U,G,p)
|
||||
% PAGERANK Google's PageRank
|
||||
% pagerank(U,G,p) uses the URLs and adjacency matrix produced by SURFER,
|
||||
% together with a damping factory p, (default is .85), to compute and plot
|
||||
% a bar graph of page rank, and print the dominant URLs in page rank order.
|
||||
% x = pagerank(U,G,p) returns the page ranks instead of printing.
|
||||
% See also SURFER, SPY.
|
||||
|
||||
if nargin < 3, p = .85; end
|
||||
|
||||
% Eliminate any self-referential links
|
||||
%G = G - diag(diag(G));
|
||||
|
||||
% c = out-degree, r = in-degree
|
||||
[~,n] = size(G);
|
||||
c = sum(G,1);
|
||||
r = sum(G,2);
|
||||
|
||||
% Scale column sums to be 1 (or 0 where there are no out links).
|
||||
k = find(c~=0);
|
||||
D = sparse(k,k,1./c(k),n,n);
|
||||
|
||||
e = ones(n,1);
|
||||
I = speye(n,n);
|
||||
|
||||
% ---------------------------- INVERSE ITERATION --------------------------
|
||||
disp('Using inverse iteration implementation\n');
|
||||
|
||||
z = ((1 - p) * (c ~= 0) + (c == 0)) / n;
|
||||
A = p * G * D + e * z;
|
||||
x = e/n;
|
||||
|
||||
% Check if B will be a singular matrix. If so, change it
|
||||
alpha = 1;
|
||||
while rcond(A - alpha * I) <= eps
|
||||
alpha = alpha + 0.01;
|
||||
end
|
||||
display(alpha);
|
||||
|
||||
B = (A - alpha * I);
|
||||
|
||||
old_x = zeros(n, 1);
|
||||
old_norm = -1;
|
||||
no = +Inf;
|
||||
|
||||
it = 0;
|
||||
while old_norm == -1 || old_norm > no
|
||||
old_norm = no;
|
||||
old_x = x;
|
||||
x = B \ x;
|
||||
x = x/norm(x, 2);
|
||||
it = it + 1;
|
||||
no = norm(x - old_x, 2);
|
||||
end
|
||||
|
||||
x = old_x;
|
||||
display(it);
|
||||
|
||||
% -------------------------------------------------------------------------
|
||||
|
||||
% Normalize so that sum(x) == 1.
|
||||
x = x/sum(x);
|
||||
|
||||
% Bar graph of page rank.
|
||||
shg
|
||||
bar(x)
|
||||
title('Page Rank')
|
||||
|
||||
% Print URLs in page rank order.
|
||||
|
||||
if nargout < 1
|
||||
[~,q] = sort(-x);
|
||||
disp(' page-rank in out url')
|
||||
k = 1;
|
||||
maxN = length(U);
|
||||
while (k <= maxN) && (x(q(k)) >= .005)
|
||||
disp(k)
|
||||
j = q(k);
|
||||
temp1 = r(j);
|
||||
temp2 = c(j);
|
||||
disp(fprintf(' %3.0f %8.4f %4.0f %4.0f %s', j,x(j),full(temp1),full(temp2),U{j}))
|
||||
k = k+1;
|
||||
end
|
||||
end
|
Reference in a new issue