PCA в matlab выбор верхних N компонентов

Я хочу выбрать верхний N=10,000 основные компоненты от матрицы. После завершения pca MATLAB должен вернуть pxp Матрица, Но это не так!

>> size(train_data)
ans =
         400      153600

>> [coefs,scores,variances] = pca(train_data);
>> size(coefs)
ans =
      153600         399

>> size(scores)
ans =

   400   399
>> size(variances)
ans =
    399     1

он должен быть!--5-->? и scores:400 X 153600?

когда я использую приведенный ниже код, он дает мне ошибку из памяти::

>> [V D] = eig(cov(train_data));
Out of memory. Type HELP MEMORY for your options.

Error in cov (line 96)
    xy = (xc' * xc) / (m-1);

я не понимаю, почему MATLAB возвращает меньшую размерную матрицу. Он должен возвращать ошибку с pca: 153600*153600*8 байт=188 ГБ

ошибка с eigs:

>> eigs(cov(train_data));
Out of memory. Type HELP MEMORY for your options.

Error in cov (line 96)
    xy = (xc' * xc) / (m-1);

3 ответов


предисловие

Я думаю, что вы стали жертвой проблема по XY, поскольку попытка найти 153.600 измерений в ваших данных полностью нефизическая, пожалуйста, спросите о проблеме (X), а не о предлагаемом решении (Y), чтобы получить содержательный ответ. Я буду использовать этот пост только для того, чтобы сказать вам, почему PCA не хорошо подходит в этом случае. Я не могу сказать вам, что решит вашу проблему, поскольку вы не сказали нам, что это.

Это математически необоснованная проблема, как я попытаюсь объяснить здесь.

PCA

PCA, как сказал user3149915, способ уменьшить размеры. Это означает, что где-то в вашей проблеме плавают сто пятьдесят три тысячи шестьсот измерений. Это много. Чертовски много. Объяснить физическую причину существования всех из них может быть большей проблемой, чем пытаться решить математическую проблему.

пытаясь соответствовать, что многие измерения только до 400 наблюдений не будут работать, так как даже если все наблюдения являются линейными независимыми векторами в вашем векторном пространстве, вы все равно можете извлечь только 399 измерений, так как остальные просто не могут быть найдены, так как нет наблюдений. Вы можете максимально вместить N-1 уникальных измерений через N точек, другие измерения имеют бесконечное количество возможностей местоположения. Как попытка поместить плоскость через две точки: есть линия, которую вы можете поместить через эти и третье измерение будет перпендикулярна этой линии, но не определена в направлении вращения. Следовательно, у вас остается бесконечное число возможных плоскостей, которые проходят через эти две точки.

Я не думаю, что вы пытаетесь соответствовать "шуму" после первых 400 компонентов, я думаю, что после этого вы устанавливаете пустоту. Вы использовали все свои данные, чтобы получить измерения и невозможно создать больше измерений. Невозможно. Все, что вы можете сделать, это получить больше наблюдений, около 1,5 м, и сделать PCA снова.

больше наблюдений, чем размеры

почему вам нужно больше наблюдений, чем размеры? вы можете спросить. Легко, вы не можете поместить уникальную линию через точку, ни уникальную плоскость через две точки, ни уникальную гиперплоскость 153.600 через 400 точек.

Итак, если я получу 153.600 наблюдений, я настроен?

к сожалению, нет. Если у вас есть две точки и вписать линию через него вы получите 100% подходят. Никакой ошибки, Джей! Хватит на сегодня, пойдем домой и посмотрим телевизор! К сожалению, Ваш босс позвонит вам на следующее утро, так как ваш припадок-мусор. Почему? Ну, если бы у вас было, например, 20 точек, разбросанных вокруг, подгонка не была бы без ошибок, но, по крайней мере, ближе к представлению ваших фактических данных, поскольку первые два могут быть выбросами, см. Эту очень иллюстративную цифру, где красные точки будут вашими первыми двумя наблюдениями:

enter image description here

Если бы вы должны были извлечь первые 10.000 компонентов, это было бы 399 точные пригонки и 9601 zero размеры. Можно даже не пытаться вычислить за пределами 399-го измерения и вставить это в нулевой массив с 10.000 записями.

TL; DR вы не можете использовать PCA, и мы не можем помочь вам решить вашу проблему, пока вы не скажете нам, в чем ваша проблема.


PCA-это алгоритм уменьшения размера, так как он пытается уменьшить количество объектов до основных компонентов (PC), каждый из которых представляет некоторую линейную комбинацию общих объектов. Все это делается для того, чтобы уменьшить размеры пространства объектов, т. е. преобразовать большое пространство объектов в более управляемое, но все еще сохраняющее большую часть, если не всю информацию.

теперь для вашей проблемы, вы пытаетесь объяснить разницу между вашими 400 наблюдения с использованием 153600 функций, однако, нам не нужно, что много информации 399 ПК будет объяснить 100% дисперсии по всей выборке (я буду очень удивлен, если это не так). Причина этого в том, что ваш алгоритм находит шум, который объясняет каждое наблюдение в вашем образце.

Итак, то, что rayryeng говорил вам, правильно, если вы хотите уменьшить пространство функций до 10 000 ПК, вам понадобится 100 000 наблюдений для ПК что угодно (это эмпирическое правило, но довольно стабильное).

и причина, по которой matlab давал вам 399 ПК, потому что он смог правильно извлечь 399 линейных комбинаций, которые объяснили некоторые #% дисперсии по вашей выборке.

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

поэтому, чтобы прояснить, если ваше пространство объектов является мусором, и там нет никакой информации, просто шум, объясненная дисперсия будет неактуальной и действительно будет меньше 100%, например, см. Следующее

data = rand(400,401);
[coefs,scores,variances] = pca(data);
numel(variances) 
disp('Var explained ' num2str(cumsum(variances)) '%'])

опять же, если вы хотите уменьшить пространство объектов, есть способы сделать это даже с небольшим m, но PCA не является одним из них.

Удачи


Matlab пытается не тратить слишком много ресурсов на его вычисление. Но вы все равно можете делать то, что хотите, просто используйте:

pca(train_data,'Economy','off')