Matlab против Mathematica, собственные векторы? - PullRequest
2 голосов
/ 13 апреля 2011
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?

Ответы [ 3 ]

5 голосов
/ 13 апреля 2011

Определение Собственного вектора X - это некоторый вектор X, который удовлетворяет

AX = kX

, где A - матрица, а k - константа. Из определения довольно ясно, что cX также является собственным вектором для любого c, не равного 0. Таким образом, существует некоторая постоянная c такая, что X_matlab = cX_mathematica.

Похоже, что первое нормальное (имеет евклидову длину 1, т.е. сложите суммы квадратов координат, затем возьмите квадратный корень, и вы получите 1), а второе нормализуется, так что конечная координата равна 1 ( любой собственный вектор был найден, а затем все координаты были разделены на конечную координату).

Вы можете использовать любой, который вам нужен, если вам нужен только собственный вектор.

3 голосов
/ 13 апреля 2011

Это потому, что если вектор 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 голосов
/ 13 апреля 2011

Собственные векторы не обязательно уникальны.Все, что требуется от собственного вектора, это то, что

  1. Он должен иметь единичную норму
  2. v_m*v_n=0 для всех m ≠ n (ортогональность)
  3. Он удовлетворяет 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 относится к квадратному корню из -1 в обозначении MATLAB.Вы можете убедиться в этом сами:

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 в противном случае возвращает ошибку.

Итак, чтобы подвести итог, собственные векторы не обязательно являются уникальными и передают одну и ту же информацию;просто в разных представлениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...