Почему некоторые собственные векторы, полученные функцией matlab pca, различаются по знаку от собственных векторов, полученных методом pca вручную? [Дубликат]

Не используйте дезинфицированную функцию mysql_ * (лишенная php 5.5 будет удалена в php 7). и вы можете сделать это с помощью mysqli или pdo

здесь полный запрос выбора

connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>

1
задан IKavanagh 25 October 2015 в 10:41
поделиться

4 ответа

Собственные векторы НЕ уникальны по целому ряду причин. Измените знак, и собственный вектор все еще является собственным вектором для одного и того же собственного значения. На самом деле, умножьте на любую константу, а собственный вектор все еще таков. Различные инструменты иногда могут выбирать разные нормализации.

Если собственное значение имеет кратность больше единицы, то собственные векторы снова не уникальны, если они охватывают одно и то же подпространство.

11
ответ дан user 28 August 2018 в 01:02
поделиться

Как указывают древесные щепы (+1), собственные векторы уникальны только до линейного преобразования. Этот факт легко понять из определения, т. Е. Пара собственных векторов / собственных значений решает характеристическую функцию A * v = k * v, где A - матрица, v - собственный вектор, а k - собственное значение.

Давайте рассмотрим гораздо более простой пример, чем ваш (ужасающий) вопрос:

M = [1, 2, 3; 4, 5, 6; 7, 8, 9];
[EigVec, EigVal] = eig(M);

Matlab дает:

EigVec =
-0.2320   -0.7858    0.4082
-0.5253   -0.0868   -0.8165
-0.8187    0.6123    0.4082

, в то время как Mathematica дает:

EigVec = 
0.2833    -1.2833    1
0.6417    -0.1417    -2
1         1          1

Из документации Matlab:

«Для eig (A) собственные векторы масштабируются так, что каждая из них равна 1.0.»

С другой стороны, Mathematica явно масштабируя собственные векторы, так что конечный элемент равен единице.

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

Кстати, я предлагаю вам отредактировать свой вопрос, чтобы иметь более простую входную матрицу M, такую ​​как тот, который я использовал здесь. Это сделает его более читаемым для всех, кто посещает эту страницу в будущем. На самом деле это не так уж плохо, но способ, которым он в настоящее время отформатирован, скорее всего, заставит его отказаться от голосования.

10
ответ дан Colin T Bowers 28 August 2018 в 01:02
поделиться

Как указывает Роди, нормализация Mathematica использует, чтобы сделать последний элемент единицей. Другой eig функционирует подобно алгоритму QZ (который вы должны использовать в коде Matlab, например, поскольку Cholesky не поддерживается), не номинируйте способ, которым Matlab делает для [V, lam] = eig (C). EX: [V, lam] = eig (C, eye (размер (C)), 'qz');

Из документации http://www.mathworks.com/help/ techdoc / ref / eig.html

Примечание. Для eig (A) собственные векторы масштабируются так, чтобы каждая из них составляла 1,0. Для eig (A, B), eig (A, «nobalance») и eig (A, B, флаг) собственные векторы не нормированы. Также заметим, что если A симметрично, eig (A, 'nobalance') игнорирует опцию nobalance, так как A уже сбалансирован.

Для [V, lam] = eig (C); собственные векторы масштабируются так, чтобы каждая из них составляла 1,0. Вот что нам нужно здесь. Матлаб делает это для формулировки Холецкого, так, как можно изменить нормальные собственные векторы, создаваемые QZ, чтобы они имели такой же масштаб? Так же:

W = V;
for i = 1:size(V,2) % for each column
    V(:,i) = V(:,i) / norm(V(:,i), 2);  % Normalize column i
end

Это найдет длину каждого вектора и разделит элементы на эту длину, чтобы масштабировать вектор. Mathamatica в основном делает то же самое, делая последний элемент 1 вместо нормализации вектора. http://www.fundza.com/vectors/normalize/

Обратите внимание, что векторы и значения не находятся в одном порядке, поэтому вам все равно придется сортировать их , Алгоритм Matlab Cholesky создает элементы в порядке сортировки следующим образом:

lam=diag(lam);
[sorted_lam,index]=sort(lam);
for cont=1:length(sorted_lam)
   sorted_V(:,cont)=V(:,index(cont));
end
W=sorted_W;
lam = diag(sorted_lam);

И даже после этого знаки могут не указываться в одном направлении (собственные векторы по-прежнему являются собственными векторами, если они умножаются - 1). Обратите внимание, что одна и та же сортировка должна применяться к лямбда (собственные значения), или они будут не в порядке.

Типичным условием является очистка знаков столбца, если первый элемент в столбце отрицательный.

Одна вещь, которую вы могли бы сделать, это перевернуть знаки, если более 2 отрицательных:

%FLIP SIGNS IF MORE THAN 2 ARE NEGATIVE
W=sorted_W;
for i = 1:size(W,2) % for each column in V
    A = W(:,i);
    s=sign(A);
    inegatif=sum(s(:)==-1);
    if(inegatif>1)
        W(:,i) = -W(:,i);
    end
end

Но это только реально помогает, если элементы не близки к 0, потому что если они близки к 0, другой алгоритм может найти значение на другой стороне 0, но это лучше, чем ничего.

. Последняя вещь для значения «B» (матрица ввода обобщенной матрицы собственных значений ), Я использую «eye (size (C))». Существует ли оптимальный способ выбора «B», чтобы улучшить этот алгоритм и дать ему ответы ближе к тем из Cholesky или быть более точным? Вы можете использовать любую (реальную матрицу такого же размера), что и B, включая A снова, или A '(A - входная матрица), но что такое «хороший выбор»? возможно, A ', я заметил для некоторых входов 3x3 из -1, похоже, близко к тем же ответам, что и «chol»?

https://www.mathworks.com/help/matlab /ref/eig.html?searchHighlight=eig&s_tid=doc_srchtitle#inputarg_B

0
ответ дан ggb667 28 August 2018 в 01:02
поделиться

Я полностью согласен с г-ном Колином Т. Бауэрсом, что MATHEMATICA делает нормировку так, что последнее значение EigenVectors становится единым. Используя MATLAB, если кто-то хочет получить результат EigenVectors, как MATHEMATICA, тогда мы можем сказать MATLAB. Нормализовать последнее значение результата EigenVectors на 1, используя следующий шаг нормализации.

M = [1, 2, 3; 4, 5, 6; 7, 8, 9];

[EigVec, EigVal] = eig(M);

sf=1./EigVec(end,:); %get the last value of each eigen vector and inverse for scale factor

sf=repmat(sf,size(EigVec,1),1); % Repeat Scale value of each element in the vector

Normalize_EigVec=EigVec.*sf;

Normalize_EigVec =

    0.2833   -1.2833    1.0000
    0.6417   -0.1417   -2.0000
    1.0000    1.0000    1.0000
3
ответ дан Rody Oldenhuis 28 August 2018 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: