Учебник по анализу основных компонентов-преобразование кода R в вопросы Matlab
Я пытаюсь понять PCA, находя практические примеры в интернете. К сожалению, большинство учебников, которые я нашел, на самом деле не показывают простых практических применений PCA. После долгих поисков я наткнулся на это
Это хороший простой учебник. Я хочу воссоздать результаты в Matlab, но учебник находится в R. Я пытался воспроизвести результаты в Matlab, но пока безуспешно; я новичок в 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, и мне нравятся примеры, где я могу кодировать его и видеть результаты сам, поэтому я могу играть с ним, я нахожу, что это легче, когда учиться таким образом
Любая помощь была бы очень кстати. оценил!!
1 ответ:
Edit: проблема заключается исключительно в масштабировании.
Код 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 вы должны использовать это, если хотите масштабирования:
Код Matlab:
princomp(zscore(X))
Старый ответ (отвлекающий маневр):
Из
help(princomp)
(в R):Вычисление производится с использованием собственных значений корреляции или ковариации. матрица, как определено кор. Это делается для совместимости с S-плюс результат. Предпочтительный метод расчет заключается в использовании svd на x, как это делается в prcomp.
Обратите внимание, что в вычислении по умолчанию используется делитель N для ковариации матрица.В документации по функции R
prcomp
(help(prcomp)
) Вы можете прочитать:Вычисление производится путем сингулярного разложения (центрированная и, возможно, масштабируемая) матрица данных, а не с помощью eigen на ковариационная матрица. Это, как правило, предпочтительный метод для численная точность. [...] В отличие от princomp, дисперсии вычисляются с помощью обычный делитель 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.