Matlab: как найти, какие переменные из набора данных могут быть отброшены с использованием PCA в matlab? - PullRequest
7 голосов
/ 28 сентября 2011

Я использую PCA, чтобы выяснить, какие переменные в моем наборе данных являются избыточными и из-за их высокой корреляции с другими переменными. Я использую функцию princomp matlab для данных, ранее нормализованных с помощью zscore:

[coeff, PC, eigenvalues] = princomp(zscore(x))

Я знаю, что собственные значения говорят мне, насколько вариация набора данных покрывает каждый главный компонент, и что coeff говорит мне, сколько i-й исходной переменной находится в j- главный компонент (где i - строки, j - столбцы).

Итак, я предположил, что для выяснения, какие переменные из исходного набора данных являются наиболее важными, а какие - наименьшими, мне нужно умножить матрицу coeff на собственные значения - значения coeff представляют, сколько из каждой переменной имеет каждый компонент, а собственные значения указывают, насколько важен этот компонент. Итак, это мой полный код:

[coeff, PC, eigenvalues] = princomp(zscore(x));
e = eigenvalues./sum(eigenvalues);
abs(coeff)/e

Но это на самом деле ничего не показывает - я попробовал это на следующем наборе, где переменная 1 полностью коррелирует с переменной 2 (v2 = v1 + 2):

     v1    v2    v3
     1     3     4
     2     4    -1
     4     6     9
     3     5    -2

но результаты моих расчетов были следующими:

v1 0.5525
v2 0.5525
v3 0.5264

и это на самом деле ничего не показывает. Я ожидаю, что результат для переменной 2 покажет, что он гораздо менее важен, чем v1 или v3. Какое из моих предположений неверно?

1 Ответ

3 голосов
/ 29 сентября 2011

РЕДАКТИРОВАТЬ Я полностью переработал ответ, теперь, когда я понимаю, какие предположения были неверными.

Прежде чем объяснить, что не работает в ОП, позвольте мне убедиться, что у нас будет такая же терминология. В анализе главных компонентов цель состоит в том, чтобы получить преобразование координат, которое хорошо разделяет наблюдения, и это может упростить описание данных, то есть различных многомерных наблюдений, в пространстве меньшего размера. Наблюдения многомерны, когда состоят из нескольких измерений. Если линейно независимых наблюдений меньше, чем измерений, мы ожидаем, что хотя бы одно из собственных значений будет равно нулю, потому что, например, два линейно независимых вектора наблюдения в трехмерном пространстве могут быть описаны двумерной плоскостью.

Если у нас есть массив

x = [    1     3     4
         2     4    -1
         4     6     9
         3     5    -2];

, который состоит из четырех наблюдений с тремя измерениями в каждом, princomp(x) найдет пространство меньшего измерения, охватываемое четырьмя наблюдениями. Поскольку есть два взаимозависимых измерения, одно из собственных значений будет близко к нулю, поскольку пространство измерений только 2D, а не 3D, что, вероятно, и было результатом, который вы хотели найти. Действительно, если вы проверите собственные векторы (coeff), то обнаружите, что первые два компонента чрезвычайно очевидно коллинеарны

coeff = princomp(x)
coeff =
      0.10124      0.69982      0.70711
      0.10124      0.69982     -0.70711
       0.9897     -0.14317   1.1102e-16

Поскольку первые два компонента фактически указывают в противоположных направлениях, значения первых двух компонентов преобразованных наблюдений сами по себе не имеют смысла: [1 1 25] эквивалентно [1000 1000 25].

Теперь, если мы хотим выяснить, являются ли какие-либо измерения линейно зависимыми, и если мы действительно хотим использовать для этого основные компоненты, потому что в реальной жизни измерения не могут быть идеально коллинеарными, и мы Заинтересованный в поиске хороших векторов дескрипторов для машинного обучения, имеет больше смысла рассматривать три измерения как «наблюдения» и запускать princomp(x'). Таким образом, существует только три «наблюдения», но четыре «измерения», четвертый собственный вектор будет равен нулю. Однако, поскольку существует два линейно зависимых наблюдения , у нас остается только два ненулевых собственных значения:

eigenvalues =
       24.263
       3.7368
            0
            0

Чтобы выяснить, какие из измерений имеют высокую степень корреляции (на самом деле это не нужно, если вы используете измерения с преобразованием собственного вектора в качестве входных данных, например, для машинного обучения), лучшим способом было бы посмотреть на корреляцию между измерениями:

corr(x)
  ans =
        1            1      0.35675
        1            1      0.35675
  0.35675      0.35675            1

Неудивительно, что каждое измерение идеально коррелирует с самим собой, а v1 прекрасно коррелирует с v2.

РЕДАКТИРОВАТЬ2

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

Это работает, если ваши наблюдения показывают очень небольшую дисперсию в одной переменной измерения (например, где x = [1 2 3;1 4 22;1 25 -25;1 11 100];, и, таким образом, первая переменная ничего не вносит в дисперсию). Однако при коллинеарных измерениях оба вектора содержат эквивалентную информацию и вносят равный в дисперсию. Таким образом, собственные векторы (коэффициенты), вероятно, будут похожи друг на друга.


Чтобы комментарии @ agnieszka продолжали иметь смысл, я оставил исходные пункты 1-4 моего ответа ниже. Обратите внимание, что # 3 был в ответ на деление собственных векторов на собственные значения, что для меня не имело большого смысла.

  1. векторы должны быть в строках, а не в столбцах (каждый вектор наблюдение).
  2. coeff возвращает базисные векторы принципала компоненты, и его порядок имеет мало общего с исходным вводом
  3. Чтобы увидеть важность главных компонентов , вы используете eigenvalues/sum(eigenvalues)
  4. Если у вас есть два коллинеарных вектора, вы не можете сказать, что первый важен, а второй нет.«т.Откуда ты знаешь, что не должно быть наоборот?Если вы хотите проверить коллинеарность, вам следует вместо этого проверить ранг массива или вызвать unique для нормализованных (то есть norm, равных 1) векторов.
...