Учебное пособие по анализу основных компонентов - преобразование кода R в проблемы Matlab

Я пытаюсь понять PCA, находя практические примеры в Интернете. К сожалению, большинство учебников, которые я нашел, на самом деле не показывают простых практических приложений PCA. После долгих поисков я наткнулся на это

http://yatani.jp/HCIstats/PCA

Это хороший простой учебник. Я хочу воссоздать результаты в Matlab, но учебник находится в R. Я пытался воспроизвести результаты в Matlab, но пока безуспешно; Я новичок в Матлабе. Я создал массивы следующим образом:

Price = [6,7,6,5,7,6,5,6,3,1,2,5,2,3,1,2];
Software = [5,3,4,7,7,4,7,5,5,3,6,7,4,5,6,3];
Aesthetics = [3,2,4,1,5,2,2,4,6,7,6,7,5,6,5,7];
Brand = [4,2,5,3,5,3,1,4,7,5,7,6,6,5,5,7];

Затем в своем примере он делает это

data <- data.frame(Price, Software, Aesthetics, Brand)

Я сделал быстрый поиск в Интернете, и это, по-видимому, преобразует векторы в таблицу данных в коде R. Итак, в Matlab я сделал это

dataTable(:,1) = Price;
dataTable(:,2) = Software;
dataTable(:,3) = Aesthetics;
dataTable(:,4) = Brand;

Теперь это следующая часть, в которой я не уверен.

pca <- princomp(data, cor=TRUE)
summary(pca, loadings=TRUE)

Я попытался использовать функцию PCA Matlab

 [COEFF SCORE LATENT] = princomp(dataTable)

Но мои результаты совсем не совпадают с показанными в туториале. Мои результаты

COEFF =

   -0.5958    0.3786    0.7065   -0.0511
   -0.1085    0.8343   -0.5402   -0.0210
    0.6053    0.2675    0.3179   -0.6789
    0.5166    0.2985    0.3287    0.7321


SCORE =

   -2.3362    0.0276    0.6113    0.4237
   -4.3534   -2.1268    1.4228   -0.3707
   -1.1057   -0.2406    1.7981    0.4979
   -3.6847    0.4840   -2.1400    1.0586
   -1.4218    2.9083    1.2020   -0.2952
   -3.3495   -1.3726    0.5049    0.3916
   -4.1126    0.1546   -2.4795   -1.0846
   -1.7309    0.2951    0.9293   -0.2552
    2.8169    0.5898    0.4318    0.7366
    3.7976   -2.1655   -0.2402   -1.2622
    3.3041    1.0454   -0.8148    0.7667
    1.4969    2.9845    0.7537   -0.8187
    2.3993   -1.1891   -0.3811    0.7556
    1.7836   -0.0072   -0.2255   -0.7276
    2.2613   -0.1977   -2.4966    0.0326
    4.2350   -1.1899    1.1236    0.1509


LATENT =

    9.3241
    2.2117
    1.8727
    0.5124 

Тем не менее, результаты в учебнике

Importance of components:
            Comp.1    Comp.2    Comp.3     Comp.4
Standard deviation     1.5589391 0.9804092 0.6816673 0.37925777
Proportion of Variance 0.6075727 0.2403006 0.1161676 0.03595911
Cumulative Proportion  0.6075727 0.8478733 0.9640409 1.00000000

Loadings:
        Comp.1 Comp.2 Comp.3 Comp.4
Price      -0.523         0.848       
Software   -0.177  0.977 -0.120       
Aesthetics  0.597  0.134  0.295 -0.734
Brand       0.583  0.167  0.423  0.674

Может ли кто-нибудь объяснить, почему мои результаты так сильно отличаются от учебника. Я использую неправильную функцию Matlab?

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

Любая помощь приветствуется!!


person AdamM    schedule 09.10.2013    source источник
comment
Если вы новичок в Matlab, почему бы вам просто не использовать R? ;)   -  person Roland    schedule 09.10.2013
comment
Только что начал докторантуру, кажется, что большинство студентов используют Matlab, и большинство примеров, которым я следовал, были в Matlab. Плюс другой пример кода, который мне дадут, относящийся к моей докторской диссертации, будет в Matlab, поэтому я предпочел бы использовать Matlab.   -  person AdamM    schedule 09.10.2013


Ответы (1)


Изменить: проблема заключается исключительно в масштабировании.

R-код:

summary(princomp(data, cor = FALSE), loadings=T, cutoff = 0.01)

Loadings:
           Comp.1 Comp.2 Comp.3 Comp.4
Price      -0.596 -0.379  0.706 -0.051
Software   -0.109 -0.834 -0.540 -0.021
Aesthetics  0.605 -0.268  0.318 -0.679
Brand       0.517 -0.298  0.329  0.732

Согласно справке Matlab, вы должны использовать это, если хотите масштабировать:

Матлаб код:

princomp(zscore(X))

Старый ответ (красная сельдь):

От help(princomp) (в правом):

Вычисление выполняется с использованием собственных значений корреляционной или ковариационной матрицы, как определено cor. Это сделано для совместимости с результатом S-PLUS. Предпочтительным методом расчета является использование svd для x, как это делается в prcomp.

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

В документации функции R prcomp (help(prcomp)) можно прочитать:

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

Функция Matlab, по-видимому, использует алгоритм svd. Если я использую prcom (без масштабирования, т.е. не на основе корреляций) с данными примера, я получаю:

> prcomp(data)
Standard deviations:
[1] 3.0535362 1.4871803 1.3684570 0.7158006

Rotation:
                  PC1       PC2        PC3         PC4
Price      -0.5957661 0.3786184 -0.7064672  0.05113761
Software   -0.1085472 0.8342628  0.5401678  0.02101742
Aesthetics  0.6053008 0.2675111 -0.3179391  0.67894297
Brand       0.5166152 0.2984819 -0.3286908 -0.73210631

Это (за исключением нерелевантных знаков) идентично выводу Matlab.

person Roland    schedule 09.10.2013
comment
Кажется, у меня нет этой функции prcomp в Matlab. Есть ли набор инструментов, который мне нужно загрузить, чтобы использовать эту функцию? - person AdamM; 09.10.2013
comment
@AdamM Я ошибся. Проблема в том, что вы не масштабируете свой код Matlab. - person Roland; 09.10.2013
comment
Спасибо за код. Не могли бы вы объяснить, почему в коде R некоторые результаты отсутствуют в его примере с загрузками? Например, если вы посмотрите на PC2 в результате R-кода, у него отсутствует результат, то же самое с PC4, у него отсутствуют первые 2 результата? А также как он получил накопительную пропорцию? Я хотел бы получить те же результаты, что и его, поэтому я могу построить график в Matlab. - person AdamM; 09.10.2013
comment
Хорошо посмотрите параметр cutoff в summary.princomp и код функции печати: getAnywhere(print.summary.princomp) - person Roland; 09.10.2013