function H = calcHyperlinkMatrix(M)
[r c] = size(M);
H = zeros(r,c);
for i=1:r,
for j=1:c,
if (M(j,i) == 1)
colsum = sum(M,2);
H(i,j) = 1 / colsum(j);
end;
end;
end;
H
function V = pageRank(M)
[V D] = eigs(M,1);
V
function R = google(links)
R = pageRank(calcHyperlinkMatrix(links));
R
M=[[0 1 1 0 0 0 0 0];[0 0 0 1 0 0 0 0];[0 1 0 0 1 0 0 0];[0 1 0 0 1 1 0 0];
[0 0 0 0 0 1 1 1];[0 0 0 0 0 0 0 1];[1 0 0 0 1 0 0 1];[0 0 0 0 0 1 1 0];]
google(M)
ans =
-0.1400
-0.1576
-0.0700
-0.1576
-0.2276
-0.4727
-0.4201
-0.6886
Mathematica:
calculateHyperlinkMatrix[linkMatrix_] := {
{r, c} = Dimensions[linkMatrix];
H = Table[0, {a, 1, r}, {b, 1, c}];
For[i = 1, i < r + 1, i++,
For[j = 1, j < c + 1, j++,
If[linkMatrix[[j, i]] == 1, H[[i, j]] = 1/Total[linkMatrix[[j]]],
0]
]
];
H
}
H = {{0, 0, 0, 0, 0, 0, 1/3, 0}, {1/2, 0, 1/2, 1/3, 0, 0, 0, 0}, {1/2,
0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 1/2, 1/3,
0, 0, 1/3, 0}, {0, 0, 0, 1/3, 1/3, 0, 0, 1/2}, {0, 0, 0, 0, 1/3,
0, 0, 1/2}, {0, 0, 0, 0, 1/3, 1, 1/3, 0}};
R = Eigensystem[H];
VR = {R[[1, 1]], R[[2, 1]]}
PageRank = VR[[2]]
{1, {12/59, 27/118, 6/59, 27/118, 39/118, 81/118, 36/59, 1}}
Matlab и Mathematica не дают один и тот же собственный вектор с собственным значением 1. Оба работают, хотя ... какой из них правильный и почему они разные?Как мне получить все собственные векторы с собственным значением 1?