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
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来获取所有特征向量?
答案 0 :(得分:5)
Eigenvector X
的定义是满足
X
AX = kX
其中A
是矩阵,k
是常量。从定义可以清楚地看出,cX
也是任何c
不等于0
的特征向量。因此,有一些c
常量X_matlab = cX_mathematica
。
看起来第一个是正常的(欧几里德长度为1,即加上坐标的平方和,然后取平方根,你将得到1),第二个被归一化,使最终坐标为1(找到任何特征向量,然后所有坐标除以最终坐标。)
如果你需要的只是一个特征向量,你可以使用你想要的任何一个。
答案 1 :(得分:3)
这是因为如果向量x是矩阵H的本征向量,则x的任何倍数也是如此。 你引用的矢量作为matlab的答案并没有完全检查:
In[41]:= H.matlab - matlab
Out[41]= {-0.0000333333, 0.0000666667, 0., 0., 0.0000333333, 0., \
-0.0000666667, 0.}
但假设它足够接近,你会看到
In[43]:= {12/59, 27/118, 6/59, 27/118, 39/118, 81/118, 36/59,
1}/{-0.1400, -0.1576, -0.0700, -0.1576,
-0.2276, -0.4727, -0.4201, -0.6886}
Out[43]= {-1.45278, -1.45186, -1.45278, -1.45186, -1.45215, -1.45217, \
-1.45244, -1.45222}
由几乎相同的元素组成。因此,matlab的向量是Mathematica的-1.45倍。
答案 2 :(得分:2)
特征向量不一定是唯一的。所有特征向量都需要
v_m*v_n=0
(正交性)的m ≠ n
Av_m=u_m v_m
,其中u_m
是对应的特征值返回的确切特征向量取决于实现的算法。作为一个简单的例子来证明一个矩阵可以有两组不同的特征向量,考虑一个NxN
单位矩阵:
I= 1 0 0 0
0 1 0 0
... ... ... ...
0 0 0 1
很明显(并且可以很容易地确认)I
的每列都是特征向量,特征值都是1。
我现在声明以下向量
v_m=[1,exp(2*pi*1i*m/N),...,exp(2*pi*1i*m*(N-1)/N)]';
m=1,2...,N
的形成具有范数1的正交基组,因此是I
的特征向量。这里1i
指的是MATLAB表示法中-1
的平方根。您可以自己验证:
N=50;
v=1/sqrt(N)*cumprod(repmat(exp(-1i*2*pi/N*(0:N-1)),N,1),1);
imagesc(real(v*v'));
这里我采用了实际部分,因为假想部分由于机器精度影响而非零(10^-16
阶),但应该为零(你甚至可以分析地做到这一点,它应该为零) )。 imagesc
否则会返回错误。
因此,总而言之,特征向量不一定是唯一的,并且都传达相同的信息;只是在不同的表现形式。