이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
pca
원시 데이터에 대한 주성분 분석
구문
설명
는 하나 이상의 coeff
= pca(X
,Name,Value
)Name,Value
쌍 인수로 지정된, 특수 데이터형의 계산 및 처리와 관련한 추가 옵션을 사용하여 위에 열거된 구문에 포함된 출력 인수를 반환합니다.
예를 들어, pca
에서 반환하는 주성분 개수를 지정하거나 SVD 이외의 알고리즘을 사용하도록 지정할 수 있습니다.
예제
데이터 세트의 주성분
표본 데이터 세트를 불러옵니다.
load hald
성분 데이터는 4개 변수에 대한 13개의 관측값을 가집니다.
성분 데이터에 대한 주성분을 구합니다.
coeff = pca(ingredients)
coeff = 4×4
-0.0678 -0.6460 0.5673 0.5062
-0.6785 -0.0200 -0.5440 0.4933
0.0290 0.7553 0.4036 0.5156
0.7309 -0.1085 -0.4684 0.4844
coeff
의 행은 4개 성분 변수에 대한 계수를 포함하고, 열은 4개 주성분에 대응됩니다.
누락된 데이터가 있을 때의 PCA
데이터 세트에 누락값이 있을 때의 주성분 계수를 구합니다.
표본 데이터 세트를 불러옵니다.
load imports-85
데이터 행렬 X
는 3열 ~ 15열에 13개의 연속형 변수가 있습니다. 휠베이스, 길이, 너비, 높이, 전비 중량, 엔진 크기, 구경, 스트로크, 압축비, 마력, 피크 rpm, 시내 주행 거리, 고속도로 주행 거리가 이에 해당됩니다. 구경 변수와 스트로크 변수는 56행 ~59행에 네 개의 누락값이 있으며, 마력 변수와 피크 rpm 변수는 131행~132행에 두 개의 누락값이 있습니다.
주성분 분석을 수행합니다.
coeff = pca(X(:,3:15));
기본적으로, pca
는 'Rows','complete'
이름-값 쌍의 인수로 지정된 동작을 수행합니다. 이 옵션은 계산을 수행하기 전에 NaN
값을 갖는 관측값을 제거합니다. NaN
이 있는 행은 대응되는 위치, 즉 56행 ~59행, 131행 및 132행에서 score
및 tsquared
에 다시 삽입됩니다.
'pairwise'
를 사용하여 주성분 분석을 수행합니다.
coeff = pca(X(:,3:15),'Rows','pairwise');
이 경우, pca
는 X
의 열 i 또는 j에서 NaN
값이 없는 행을 사용하여 공분산 행렬의 (i,j) 요소를 계산합니다. 참고로, 결과로 생성되는 공분산 행렬은 양의 정부호가 아닐 수 있습니다. 이 옵션은 pca
가 사용하는 알고리즘이 고유값 분해인 경우에만 적용됩니다. 이 예제에서 볼 수 있듯이, 알고리즘을 지정하지 않으면 pca
가 알고리즘을 'eig'
로 설정합니다. 사용자가 'pairwise'
옵션과 함께 알고리즘으로 'svd'
를 요구하면, pca
는 경고 메시지를 반환하고, 알고리즘을 'eig'
로 설정한 후 연산을 계속합니다.
'Rows','all'
이름-값 쌍의 인수를 사용하는 경우 이 옵션이 데이터 세트에 누락값이 없다고 가정하기 때문에 pca
가 종료됩니다.
coeff = pca(X(:,3:15),'Rows','all');
Error using pca (line 180) Raw data contains NaN missing value while 'Rows' option is set to 'all'. Consider using 'complete' or pairwise' option instead.
가중 PCA
주성분 분석을 수행하는 동안 역 가변 분산을 가중치로 사용합니다.
표본 데이터 세트를 불러옵니다.
load hald
성분에 대한 분산의 역을 가변 가중치로 사용하여 주성분 분석을 수행합니다.
[wcoeff,~,latent,~,explained] = pca(ingredients,'VariableWeights','variance')
wcoeff = 4×4
-2.7998 2.9940 -3.9736 1.4180
-8.7743 -6.4411 4.8927 9.9863
2.5240 -3.8749 -4.0845 1.7196
9.1714 7.5529 3.2710 11.3273
latent = 4×1
2.2357
1.5761
0.1866
0.0016
explained = 4×1
55.8926
39.4017
4.6652
0.0406
참고로, 계수 행렬 wcoeff
는 정규 직교가 아닙니다.
정규 직교 계수 행렬을 계산합니다.
coefforth = diag(std(ingredients))\wcoeff
coefforth = 4×4
-0.4760 0.5090 -0.6755 0.2411
-0.5639 -0.4139 0.3144 0.6418
0.3941 -0.6050 -0.6377 0.2685
0.5479 0.4512 0.1954 0.6767
새 계수 행렬 coefforth
의 정규 직교성을 확인합니다.
coefforth*coefforth'
ans = 4×4
1.0000 0.0000 -0.0000 0.0000
0.0000 1.0000 -0.0000 -0.0000
-0.0000 -0.0000 1.0000 0.0000
0.0000 -0.0000 0.0000 1.0000
누락된 데이터에 대한 ALS를 사용한 PCA
데이터에 누락값이 있을 때 교대최소제곱법(ALS) 알고리즘을 사용하여 주성분을 구합니다.
표본 데이터를 불러옵니다.
load hald
성분 데이터는 4개 변수에 대한 13개의 관측값을 가집니다.
ALS 알고리즘을 사용하여 주성분 분석을 수행하고 성분 계수를 표시합니다.
[coeff,score,latent,tsquared,explained] = pca(ingredients); coeff
coeff = 4×4
-0.0678 -0.6460 0.5673 0.5062
-0.6785 -0.0200 -0.5440 0.4933
0.0290 0.7553 0.4036 0.5156
0.7309 -0.1085 -0.4684 0.4844
누락값을 임의로 추가합니다.
y = ingredients; rng('default'); % for reproducibility ix = random('unif',0,1,size(y))<0.30; y(ix) = NaN
y = 13×4
7 26 6 NaN
1 29 15 52
NaN NaN 8 20
11 31 NaN 47
7 52 6 33
NaN 55 NaN NaN
NaN 71 NaN 6
1 31 NaN 44
2 NaN NaN 22
21 47 4 26
⋮
현재 대략적으로 데이터의 30%가 NaN
으로 표시되는 누락값을 가집니다.
ALS 알고리즘을 사용하여 주성분 분석을 수행하고 성분 계수를 표시합니다.
[coeff1,score1,latent,tsquared,explained,mu1] = pca(y,... 'algorithm','als'); coeff1
coeff1 = 4×4
-0.0362 0.8215 -0.5252 0.2190
-0.6831 -0.0998 0.1828 0.6999
0.0169 0.5575 0.8215 -0.1185
0.7292 -0.0657 0.1261 0.6694
추정된 평균을 표시합니다.
mu1
mu1 = 1×4
8.9956 47.9088 9.0451 28.5515
관측된 데이터를 재구성합니다.
t = score1*coeff1' + repmat(mu1,13,1)
t = 13×4
7.0000 26.0000 6.0000 51.5250
1.0000 29.0000 15.0000 52.0000
10.7819 53.0230 8.0000 20.0000
11.0000 31.0000 13.5500 47.0000
7.0000 52.0000 6.0000 33.0000
10.4818 55.0000 7.8328 17.9362
3.0982 71.0000 11.9491 6.0000
1.0000 31.0000 -0.5161 44.0000
2.0000 53.7914 5.7710 22.0000
21.0000 47.0000 4.0000 26.0000
⋮
ALS 알고리즘은 데이터에 포함된 누락값을 추정합니다.
결과를 비교하는 또 다른 방법은 계수 벡터에 의해 생성된(Span) 두 공간 사이의 각도를 구하는 것입니다. ALS를 사용하여 누락값이 있는 데이터에 대해 구한 계수와 전체 데이터에 대해 구한 계수 사이의 각도를 구합니다.
subspace(coeff,coeff1)
ans = 8.1104e-16
이 각도는 작은 값입니다. 이는 누락된 데이터가 없을 때 'Rows','complete'
이름-값 쌍의 인수와 함께 pca
를 사용하는 경우 생성된 결과와 누락된 데이터가 있을 때 'algorithm','als'
이름-값 쌍의 인수와 함께 pca
를 사용하는 경우 생성된 결과가 서로 근접하다는 것을 나타냅니다.
'Rows','complete'
이름-값 쌍의 인수를 사용하여 주성분 분석을 수행하고 성분 계수를 표시합니다.
[coeff2,score2,latent,tsquared,explained,mu2] = pca(y,... 'Rows','complete'); coeff2
coeff2 = 4×3
-0.2054 0.8587 0.0492
-0.6694 -0.3720 0.5510
0.1474 -0.3513 -0.5187
0.6986 -0.0298 0.6518
이 경우, pca
가 누락값이 있는 행을 제거하므로 y
는 누락값이 없는 네 개의 행만 가집니다. 따라서 pca
는 세 개의 주성분만 반환합니다. 공분산 행렬이 양의 준정부호가 아니고 pca
가 오류 메시지를 반환하므로 'Rows','pairwise'
옵션을 사용할 수 없습니다.
목록별(Listwise) 삭제를 사용하여 누락값이 있는 데이터에 대해 구한 계수와 전체 데이터에 대해 구한 계수 사이의 각도를 구합니다('Rows','complete'
인 경우).
subspace(coeff(:,1:3),coeff2)
ans = 0.3576
두 공간 사이의 각도는 상당히 큽니다. 이는 두 결과가 다르다는 것을 나타냅니다.
추정된 평균을 표시합니다.
mu2
mu2 = 1×4
7.8889 46.9091 9.8750 29.6000
이 경우, 이 평균이 바로 y
의 표본평균입니다.
관측된 데이터를 재구성합니다.
score2*coeff2'
ans = 13×4
NaN NaN NaN NaN
-7.5162 -18.3545 4.0968 22.0056
NaN NaN NaN NaN
NaN NaN NaN NaN
-0.5644 5.3213 -3.3432 3.6040
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
12.8315 -0.1076 -6.3333 -3.7758
⋮
이는 NaN
값을 포함하는 행을 삭제하는 것이 ALS 알고리즘만큼 효과가 좋지 않다는 것을 보여줍니다. 데이터에 누락값이 많은 경우 ALS를 사용하는 것이 더 좋습니다.
주성분 계수, 점수, 분산
주성분에 대한 계수, 점수, 분산을 구합니다.
표본 데이터 세트를 불러옵니다.
load hald
성분 데이터는 4개 변수에 대한 13개의 관측값을 가집니다.
성분 데이터의 성분에 대한 주성분 계수, 점수, 분산을 구합니다.
[coeff,score,latent] = pca(ingredients)
coeff = 4×4
-0.0678 -0.6460 0.5673 0.5062
-0.6785 -0.0200 -0.5440 0.4933
0.0290 0.7553 0.4036 0.5156
0.7309 -0.1085 -0.4684 0.4844
score = 13×4
36.8218 -6.8709 -4.5909 0.3967
29.6073 4.6109 -2.2476 -0.3958
-12.9818 -4.2049 0.9022 -1.1261
23.7147 -6.6341 1.8547 -0.3786
-0.5532 -4.4617 -6.0874 0.1424
-10.8125 -3.6466 0.9130 -0.1350
-32.5882 8.9798 -1.6063 0.0818
22.6064 10.7259 3.2365 0.3243
-9.2626 8.9854 -0.0169 -0.5437
-3.2840 -14.1573 7.0465 0.3405
⋮
latent = 4×1
517.7969
67.4964
12.4054
0.2372
score
의 열은 각각 하나의 주성분에 대응됩니다. 벡터 latent
는 네 개의 주성분에 대한 분산을 저장합니다.
중심화된 성분 데이터를 재구성합니다.
Xcentered = score*coeff'
Xcentered = 13×4
-0.4615 -22.1538 -5.7692 30.0000
-6.4615 -19.1538 3.2308 22.0000
3.5385 7.8462 -3.7692 -10.0000
3.5385 -17.1538 -3.7692 17.0000
-0.4615 3.8462 -5.7692 3.0000
3.5385 6.8462 -2.7692 -8.0000
-4.4615 22.8462 5.2308 -24.0000
-6.4615 -17.1538 10.2308 14.0000
-5.4615 5.8462 6.2308 -8.0000
13.5385 -1.1538 -7.7692 -4.0000
⋮
Xcentered
의 새 데이터는 대응되는 열에서 열 평균을 빼는 방식으로 중심화된 원래 성분 데이터입니다.
각 변수에 대한 정규 직교 주성분 계수와 각 관측값에 대한 주성분 점수를 하나의 플롯에 시각화합니다.
biplot(coeff(:,1:2),'scores',score(:,1:2),'varlabels',{'v_1','v_2','v_3','v_4'});
네 개 변수 모두 이 행렬도에서 벡터로 표현되며, 벡터의 방향과 길이는 각 변수가 플롯의 두 주성분에서 얼마나 큰 비중을 차지하는지를 나타냅니다. 예를 들어, 가로 축에 있는 첫 번째 주성분은 세 번째 변수와 네 번째 변수에 대한 양의 계수를 가집니다. 따라서, 벡터 및 는 플롯의 우반면 쪽을 향합니다. 첫 번째 주성분의 최대 계수는 네 번째 계수이며, 이는 변수 에 대응됩니다.
세로 축에 있는 두 번째 주성분은 변수 , , 에 대해서는 음의 계수를 가지고 변수 에 대해서는 양의 계수를 가집니다.
이 2차원 행렬도는 13개 관측값 각각에 대한 점도 포함하며, 이 점은 플롯에서 두 개 주성분에 대한 각 관측값의 점수를 나타내는 좌표를 가집니다. 예를 들어, 플롯의 왼쪽 가장자리 근처에 있는 점은 첫 번째 주성분에 대해 최소 점수를 가집니다. 점은 최대 점수 값과 최대 계수 길이에 대해 스케일링되므로, 플롯에서 점의 상대 위치만 확인할 수 있습니다.
T 제곱 통계량
호텔링(Hotelling)의 T 제곱 통계량 값을 구합니다.
표본 데이터 세트를 불러옵니다.
load hald
성분 데이터는 4개 변수에 대한 13개의 관측값을 가집니다.
주성분 분석을 수행하고 T 제곱 값을 요청합니다.
[coeff,score,latent,tsquared] = pca(ingredients); tsquared
tsquared = 13×1
5.6803
3.0758
6.0002
2.6198
3.3681
0.5668
3.4818
3.9794
2.6086
7.4818
⋮
처음 두 주성분만 요청하고 요청된 주성분의 감소된 공간에서 T 제곱 값을 계산합니다.
[coeff,score,latent,tsquared] = pca(ingredients,'NumComponents',2);
tsquared
tsquared = 13×1
5.6803
3.0758
6.0002
2.6198
3.3681
0.5668
3.4818
3.9794
2.6086
7.4818
⋮
참고로, 감소된 성분 공간을 지정하는 경우에도, pca
는 네 개 성분을 모두 사용하여 전체 공간에서 T 제곱 값을 계산합니다.
감소된 공간의 T 제곱 값은 감소된 공간에서 마할라노비스 거리에 대응됩니다.
tsqreduced = mahal(score,score)
tsqreduced = 13×1
3.3179
2.0079
0.5874
1.7382
0.2955
0.4228
3.2457
2.6914
1.3619
2.9903
⋮
전체 공간의 T 제곱 값과 감소된 공간의 마할라노비스 거리의 차이를 구하여 삭제된 공간에서의 T 제곱 값을 계산합니다.
tsqdiscarded = tsquared - tsqreduced
tsqdiscarded = 13×1
2.3624
1.0679
5.4128
0.8816
3.0726
0.1440
0.2362
1.2880
1.2467
4.4915
⋮
주성분으로 설명되는 변동성 백분율
주성분으로 설명되는 변동성 백분율을 구합니다. 주성분 공간에서의 데이터 표현을 표시합니다.
표본 데이터 세트를 불러옵니다.
load imports-85
데이터 행렬 X
는 3열 ~ 15열에 13개의 연속형 변수가 있습니다. 휠베이스, 길이, 너비, 높이, 전비 중량, 엔진 크기, 구경, 스트로크, 압축비, 마력, 피크 rpm, 시내 주행 거리, 고속도로 주행 거리가 이에 해당됩니다.
이러한 변수의 주성분으로 설명되는 변동성 백분율을 구합니다.
[coeff,score,latent,tsquared,explained] = pca(X(:,3:15)); explained
explained = 13×1
64.3429
35.4484
0.1550
0.0379
0.0078
0.0048
0.0013
0.0011
0.0005
0.0002
⋮
처음 세 개 성분은 모든 변동성의 99.95%를 설명합니다.
처음 세 개 주성분으로 구성된 공간에서 데이터 표현을 시각화합니다.
scatter3(score(:,1),score(:,2),score(:,3)) axis equal xlabel('1st Principal Component') ylabel('2nd Principal Component') zlabel('3rd Principal Component')
데이터는 첫 번째 주성분 축을 따라 가장 큰 변동성을 표시합니다. 이는 첫 번째 축에서 선택 가능한 모든 선택에서의 가장 큰 분산입니다. 두 번째 주성분 축을 따른 변동성은 두 번째 축에서 선택할 수 있는 남아 있는 모든 선택에서의 가장 큰 분산입니다. 세 번째 주성분 축은 세 번째로 큰 변동성을 가지며, 이는 두 번째 주성분 축을 따른 변동성보다 상당히 작습니다. 네 번째 주성분 축에서 열 세 번째 주성분 축까지는 검사할 가치가 없습니다. 이들 축은 데이터의 전체 변동성 중 0.05%만 설명하기 때문입니다.
특정 출력값을 생략하려면 그에 해당하는 요소의 위치에 ~
를 사용하면 됩니다. 예를 들어, T 제곱 값을 얻지 않으려는 경우 다음을 지정하십시오.
[coeff,score,latent,~,explained] = pca(X(:,3:15));
새 데이터에 PCA를 적용하고 C/C++ 코드 생성하기
하나의 데이터 세트에 대해 주성분을 구하고 다른 데이터 세트에 PCA를 적용합니다. 이 절차는 머신러닝 모델을 위한 훈련 데이터 세트와 테스트 데이터 세트가 있는 경우에 유용합니다. 예를 들어, PCA를 사용하여 훈련 데이터 세트를 전처리한 다음 모델을 훈련시킬 수 있습니다. 훈련된 모델을 테스트 데이터 세트를 사용하여 테스트하려면 훈련 데이터에서 얻은 PCA 변환을 테스트 데이터 세트에 적용해야 합니다.
이 예제에서는 C/C++ 코드를 생성하는 방법도 설명합니다. pca
는 코드 생성을 지원하므로, 훈련 데이터 세트를 사용하여 PCA를 수행하는 코드를 생성한 다음 PCA를 테스트 데이터 세트에 적용할 수 있습니다. 그런 다음 장치에 코드를 배포합니다. 이 워크플로에서는 훈련 데이터를 전달해야 하는데, 그 크기가 상당히 클 수 있습니다. 장치의 메모리를 절약하기 위해 훈련과 예측을 분리할 수 있습니다. MATLAB®에서 pca
를 사용하고, 장치에서 생성된 코드의 새 데이터에 PCA를 적용합니다.
C/C++ 코드를 생성하려면 MATLAB® Coder™가 필요합니다.
새 데이터에 PCA 적용하기
readtable
을 사용하여 데이터 세트를 테이블로 불러옵니다. 데이터 세트는 파일 CreditRating_Historical.dat
에 있습니다. 이 파일은 과거 신용 등급 데이터를 포함합니다.
creditrating = readtable('CreditRating_Historical.dat');
creditrating(1:5,:)
ans=5×8 table
ID WC_TA RE_TA EBIT_TA MVE_BVTD S_TA Industry Rating
_____ _____ _____ _______ ________ _____ ________ _______
62394 0.013 0.104 0.036 0.447 0.142 3 {'BB' }
48608 0.232 0.335 0.062 1.969 0.281 8 {'A' }
42444 0.311 0.367 0.074 1.935 0.366 1 {'A' }
48631 0.194 0.263 0.062 1.017 0.228 4 {'BBB'}
43768 0.121 0.413 0.057 3.647 0.466 12 {'AAA'}
첫 번째 열은 각 관측값의 ID이고, 마지막 열은 등급입니다. 두 번째 열부터 일곱 번째 열까지를 예측 변수 데이터로 지정하고, 마지막 열(Rating
)을 응답 변수로 지정합니다.
X = table2array(creditrating(:,2:7)); Y = creditrating.Rating;
처음 100개의 관측값을 테스트 데이터로 사용하고 나머지를 훈련 데이터로 사용합니다.
XTest = X(1:100,:); XTrain = X(101:end,:); YTest = Y(1:100); YTrain = Y(101:end);
훈련 데이터 세트 XTrain
에 대한 주성분을 구합니다.
[coeff,scoreTrain,~,~,explained,mu] = pca(XTrain);
이 코드는 4개의 출력값(coeff
, scoreTrain
, explained
, mu
)을 반환합니다. explained
(설명된 총 분산의 백분율)를 사용하여 최소 95%의 변동성을 설명하는 데 필요한 성분의 개수를 구합니다. coeff
(주성분 계수) 및 mu
(XTrain
에 대한 추정된 평균)를 사용하여 PCA를 테스트 데이터 세트에 적용합니다. 모델을 훈련시킬 때는 XTrain
대신 scoreTrain
(주성분 점수)을 사용하십시오.
주성분으로 설명되는 변동성 백분율을 표시합니다.
explained
explained = 6×1
58.2614
41.2606
0.3875
0.0632
0.0269
0.0005
처음 두 개 성분은 모든 변동성의 95% 이상을 설명합니다. 최소 95%의 변동성을 설명하는 데 필요한 성분의 개수를 구합니다.
idx = find(cumsum(explained)>95,1)
idx = 2
처음 두 개 성분을 사용하여 분류 트리를 훈련시킵니다.
scoreTrain95 = scoreTrain(:,1:idx); mdl = fitctree(scoreTrain95,YTrain);
mdl
은 ClassificationTree
모델입니다.
훈련된 모델을 테스트 세트에 대해 사용하려면 훈련 데이터 세트에서 얻은 PCA를 사용하여 테스트 데이터 세트를 변환해야 합니다. XTest
에서 mu
를 빼고 coeff
를 곱하여 테스트 데이터 세트의 주성분 점수를 구합니다. 처음 두 개 성분의 점수만 필요하므로 처음 두 개 계수 coeff(:,1:idx)
를 사용합니다.
scoreTest95 = (XTest-mu)*coeff(:,1:idx);
훈련된 모델 mdl
과 변환된 테스트 데이터 세트 scoreTest
를 predict
함수에 전달하여 테스트 세트에 대한 신용 등급을 예측합니다.
YTest_predicted = predict(mdl,scoreTest95);
코드 생성하기
데이터에 PCA를 적용하고 훈련된 모델을 사용하여 신용 등급을 예측하는 코드를 생성합니다. C/C++ 코드를 생성하려면 MATLAB® Coder™가 필요합니다.
saveLearnerForCoder
를 사용하여 분류 모델을 파일 myMdl.mat
에 저장합니다.
saveLearnerForCoder(mdl,'myMdl');
테스트 데이터 세트(XTest
)와 PCA 정보(coeff
및 mu
)를 받아서 테스트 데이터의 신용 등급을 반환하는 myPCAPredict
라는 이름의 진입점 함수를 정의합니다.
진입점 함수의 함수 시그니처 뒤에 %#codegen
컴파일러 지시문(또는 pragma)을 추가하여 MATLAB 알고리즘을 위한 코드를 생성하고자 함을 표시합니다. 이 지시문을 추가하면 MATLAB 코드 분석기에 코드 생성 중에 오류를 유발할 수 있는 위반을 진단하여 수정할 수 있도록 지원해 달라는 명령을 내리게 됩니다.
function label = myPCAPredict(XTest,coeff,mu) %#codegen % Transform data using PCA scoreTest = bsxfun(@minus,XTest,mu)*coeff; % Load trained classification model mdl = loadLearnerForCoder('myMdl'); % Predict ratings using the loaded model label = predict(mdl,scoreTest);
myPCAPredict
는 coeff
및 mu
를 사용하여 새 데이터에 PCA를 적용한 다음 변환된 데이터를 사용하여 신용 등급을 예측합니다. 이렇게 하면 크기가 상당히 클 수 있는 훈련 데이터를 전달하지 않아도 됩니다.
참고: 이 페이지의 오른쪽 위 섹션에 있는 버튼을 클릭하고 이 예제를 MATLAB®에서 열면 예제 폴더가 열립니다. 이 폴더에는 진입점 함수 파일이 포함되어 있습니다.
codegen
(MATLAB Coder)을 사용하여 코드를 생성합니다. C와 C++는 정적 유형 언어이므로 컴파일 시점에 진입점 함수의 모든 변수의 속성을 결정해야 합니다. 데이터형과 정확한 입력 배열 크기를 지정하려면 -args
옵션을 사용하여 특정 데이터형과 배열 크기를 포함하는 값 세트를 나타내는 MATLAB® 표현식을 전달하십시오. 컴파일 시점에 몇몇 관측값이 알려지지 않은 경우에는 coder.typeof
(MATLAB Coder)를 사용하여 입력값을 가변 크기로 지정할 수도 있습니다. 자세한 내용은 Specify Variable-Size Arguments for Code Generation 항목을 참조하십시오.
codegen myPCAPredict -args {coder.typeof(XTest,[Inf,6],[1,0]),coeff(:,1:idx),mu}
Code generation successful.
codegen
은 플랫폼별 확장자를 갖는 MEX 함수 myPCAPredict_mex
를 생성합니다.
생성된 코드를 확인합니다.
YTest_predicted_mex = myPCAPredict_mex(XTest,coeff(:,1:idx),mu); isequal(YTest_predicted,YTest_predicted_mex)
ans = logical
1
isequal
이 논리값 1(true
)을 반환합니다. 이는 모든 입력값이 동일하다는 의미입니다. 비교를 통해 mdl
의 predict
함수와 myPCAPredict_mex
함수가 동일한 신용 등급을 반환함을 확인할 수 있습니다.
코드 생성에 대한 자세한 내용은 Introduction to Code Generation 항목 및 Code Generation and Classification Learner App 항목을 참조하십시오. 후자 항목에서는 분류 학습기 앱을 사용하여 PCA를 수행하고 모델을 훈련시키는 방법과 훈련된 모델을 기반으로 새 데이터에 대해 레이블을 예측하는 C/C++ 코드를 생성하는 방법을 설명합니다.
입력 인수
X
— 입력 데이터
행렬
주성분을 계산할 입력 데이터로, n×p 행렬로 지정됩니다. X
의 행은 관측값에 대응되고 열은 변수에 대응됩니다.
데이터형: single
| double
이름-값 인수
선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN
으로 지정합니다. 여기서 Name
은 인수 이름이고 Value
는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.
R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name
을 따옴표로 묶으십시오.
예: 'Algorithm','eig','Centered','off','Rows','all','NumComponents',3
은 pca
가 고유값 분해 알고리즘을 사용하고, 데이터를 중심화하지 않으며, 모든 관측값을 사용하고, 처음 세 개의 주성분만 반환하도록 지정합니다.
Algorithm
— 주성분 알고리즘
'svd'
(디폴트 값) | 'eig'
| 'als'
pca
에서 주성분 분석을 수행하는 데 사용하는 주성분 알고리즘으로, 'Algorithm'
과 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.
값 | 설명 |
---|---|
'svd' | 디폴트 값. X 의 특이값 분해(SVD)입니다. |
'eig' | 공분산 행렬에 대한 고유값 분해(EIG)입니다. EIG 알고리즘은 관측값 개수 n이 변수 개수 p를 초과할 경우 SVD보다 더 빠르지만, 공분산의 조건수가 X 의 조건수의 제곱이기 때문에 덜 정확합니다. |
'als' | 교대최소제곱법(ALS) 알고리즘입니다. 이 알고리즘은 ALS는 누락값을 더 잘 처리하도록 설계되었습니다. 이 알고리즘은 쌍별(Pairwise) 삭제( |
예: 'Algorithm','eig'
Centered
— 열을 중심화할지 여부를 나타내는 표시자
'on'
(디폴트 값) | 'off'
열을 중심화할지 여부를 나타내는 표시자로, 'Centered'
와 함께 다음 논리식 중 하나가 쉼표로 구분되어 지정됩니다.
값 | 설명 |
---|---|
on | 디폴트 값. |
off | 이 경우 |
예: 'Centered',off
데이터형: logical
Economy
— 효율적인 크기로 출력하기 위한 표시자
true
(디폴트 값) | false
자유도 d가 변수 개수 p보다 작은 경우 효율적인 크기로 출력할지 여부를 나타내는 표시자로, 'Economy'
와 함께 다음 논리식 중 하나가 쉼표로 구분되어 지정됩니다.
값 | 설명 |
---|---|
true | 디폴트 값. 이 옵션을 사용하면 변수 개수 p가 d보다 훨씬 큰 경우 속도가 크게 빨라질 수 있습니다. |
false |
|
참고로, d < p이면 score(:,d+1:p)
및 latent(d+1:p)
는 반드시 0이며, coeff(:,d+1:p)
의 열은 X
에 직각인 방향을 정의합니다.
예: 'Economy',false
데이터형: logical
Rows
— NaN
값에 대해 수행할 동작
'complete'
(디폴트 값) | 'pairwise'
| 'all'
데이터 행렬 X
의 NaN
값에 대해 수행할 동작으로, 'Rows'
와 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.
값 | 설명 |
---|---|
'complete' | 디폴트 값. |
'pairwise' | 이 옵션은 알고리즘이
참고로, 결과로 생성되는 공분산 행렬은 양의 정부호가 아닐 수 있습니다. 이 경우, |
'all' |
|
예: 'Rows','pairwise'
Weights
— 관측값 가중치
1 (디폴트 값) | 행 벡터
관측값 가중치로, 'Weights'
와 함께 모든 양의 요소를 포함하는 길이가 n인 벡터가 쉼표로 구분되어 지정됩니다.
데이터형: single
| double
VariableWeights
— 가변 가중치
행 벡터 | 'variance'
가변 가중치로, 'VariableWeights'
와 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.
값 | 설명 |
---|---|
행 벡터 | 모든 양의 요소를 포함하는 길이가 p인 벡터입니다. |
'variance' | 가변 가중치는 표본 분산의 역입니다. 동시에 |
예: 'VariableWeights','variance'
데이터형: single
| double
| char
| string
Coeff0
— 계수의 초기값
난수 값으로 구성된 행렬 (디폴트 값) | p×k
행렬
계수 행렬 coeff
의 초기값으로, 'Coeff0'
과 함께 p×k
행렬이 쉼표로 구분되어 지정됩니다. 여기서 p는 변수 개수이고, k
는 요청된 주성분의 개수입니다.
참고
'algorithm'
이 'als'
인 경우에만 이 이름-값 쌍을 사용할 수 있습니다.
데이터형: single
| double
Score0
— 점수의 초기값
난수 값으로 구성된 행렬 (디폴트 값) | k
×m 행렬
점수 행렬 score
의 초기값으로, 'Score0'
과 함께 n×k
행렬이 쉼표로 구분되어 지정됩니다. 여기서 n은 관측값 개수이고, k
는 요청된 주성분의 개수입니다.
참고
'algorithm'
이 'als'
인 경우에만 이 이름-값 쌍을 사용할 수 있습니다.
데이터형: single
| double
Options
— 반복에 사용할 옵션
구조체
반복에 사용할 옵션으로, 'Options'
와 함께 statset
함수가 쉼표로 구분되어 지정됩니다. pca
는 options 구조체에 지정되는 다음 필드를 사용합니다.
필드 이름 | 설명 |
---|---|
'Display' | 표시 출력 수준입니다. 선택 항목은 'off' , 'final' , 'iter' 입니다. |
'MaxIter' | 허용되는 최대 스텝 수입니다. 디폴트 값은 1000입니다. 최적화 설정과 달리, MaxIter 값에 도달하면 수렴으로 간주됩니다. |
'TolFun' | 비용 함수에 대한 종료 허용오차를 제공하는 양수입니다. 디폴트 값은 1e-6입니다. |
'TolX' | ALS 알고리즘에서 좌측 인수 행렬 L과 우측 인수 행렬 R에 포함된 요소들의 상대적인 변경에 대한 수렴 분계점을 제공하는 양수입니다. 디폴트 값은 1e-6입니다. |
참고
'algorithm'
이 'als'
인 경우에만 이 이름-값 쌍을 사용할 수 있습니다.
이러한 필드의 값을 변경하고, 'Options'
이름-값 쌍의 인수를 사용하여 pca
에 새 구조체를 지정할 수 있습니다.
예: opt = statset('pca'); opt.MaxIter = 2000; coeff = pca(X,'Options',opt);
데이터형: struct
출력 인수
coeff
— 주성분 계수
숫자형 행렬
주성분 계수로, p
×k
숫자형 행렬로 반환되며, 여기서 p=size(X,2)
입니다.
NumComponents
를 지정하면 다음과 같은 조건이 적용됩니다.
NumComponents
를 지정하지 않으면 다음과 같은 조건이 적용됩니다.
Economy=true
(디폴트 값)를 지정하면k
는 자유도 개수와 같습니다.Economy=false
를 지정하면k
는p
와 같습니다.
coeff
의 열은 각각 하나의 주성분에 대한 계수를 포함합니다. 열은 주성분 분산을 기준으로 내림차순으로 정렬됩니다(latent
참조).
score
— 주성분 점수
숫자형 행렬
주성분 점수로, n
×k
숫자형 행렬로 반환되며, 여기서 n=size(X,1)
입니다.
NumComponents
를 지정하면 다음과 같은 조건이 적용됩니다.
NumComponents
를 지정하지 않으면 다음과 같은 조건이 적용됩니다.
Economy=true
(디폴트 값)를 지정하면k
는 자유도 개수와 같습니다.Economy=false
를 지정하면k
는size(X,2)
와 같습니다.
score
의 행은 관측값에 대응되고, 열은 성분에 대응됩니다.
tsquared
— 호텔링(Hotelling)의 T 제곱 통계량
숫자형 열 벡터
각 관측값에 대한 표준화된 점수의 제곱합인 호텔링(Hotelling)의 T 제곱 통계량으로, 길이가 size(X,2)
인 숫자형 열 벡터로 반환됩니다.
세부 정보
호텔링(Hotelling)의 T 제곱 통계량
호텔링의 T 제곱 통계량은 데이터 세트의 중심에서 각 관측값까지의 다변량 거리에 대한 통계적 측정값입니다.
변수 개수보다 적은 수의 성분을 요청하는 경우에도 pca
는 모든 주성분을 사용하여 T 제곱 통계량을 계산합니다(전체 공간에서 계산함). 감소된 공간이나 삭제된 공간에서 T 제곱 통계량을 구하려는 경우 다음 중 하나를 수행하십시오.
감소된 공간에서 T 제곱 통계량을 구하려면
mahal(score,score)
를 사용하십시오.삭제된 공간에서 T 제곱 통계량을 구하려면 먼저
[coeff,score,latent,tsquared] = pca(X,'NumComponents',k,...)
를 사용하여 T 제곱 통계량을 계산하고,tsqreduced = mahal(score,score)
를 사용하여 감소된 공간에서 T 제곱 통계량을 계산한 후 차이(tsquared
-tsqreduced
)를 구하십시오.
자유도
데이터가 중심화된 경우 자유도 d는 i – 1과 같습니다. 그렇지 않은 경우 i입니다.
'Rows','complete'
를 지정하는 경우, i는NaN
이 없는X
의 행 개수입니다.'Rows','pairwise'
를 지정하는 경우, i는NaN
이 없는 행을 가장 많이 갖는 열 쌍에서NaN
이 없는X
의 행 개수입니다.
가변 가중치
참고로, 가변 가중치가 사용되는 경우 계수 행렬이 정규 직교가 아닙니다. 사용한 가변 가중치 벡터를 varwei
라고 하고, pca
가 반환한 주성분 계수 벡터를 wcoeff
라고 가정합시다. 그러면 변환 diag(sqrt(varwei))*wcoeff
를 사용하여 정규 직교 계수를 계산할 수 있습니다.
알고리즘
pca
함수는 부호 규칙을 부과하여 coefs
의 각 열에서 최대 크기인 요소가 양수가 되도록 합니다. 계수 벡터의 부호를 변경해도 평균은 변하지 않습니다.
대체 기능
앱
라이브 편집기에서 대화형 방식으로 pca
를 실행하려면 차원 축소 라이브 편집기 작업을 사용하십시오.
참고 문헌
[1] Jolliffe, I. T. Principal Component Analysis. 2nd ed., Springer, 2002.
[2] Krzanowski, W. J. Principles of Multivariate Analysis. Oxford University Press, 1988.
[3] Seber, G. A. F. Multivariate Observations. Wiley, 1984.
[4] Jackson, J. E. A. User's Guide to Principal Components. Wiley, 1988.
[5] Roweis, S. “EM Algorithms for PCA and SPCA.” In Proceedings of the 1997 Conference on Advances in Neural Information Processing Systems. Vol.10 (NIPS 1997), Cambridge, MA, USA: MIT Press, 1998, pp. 626–632.
[6] Ilin, A., and T. Raiko. “Practical Approaches to Principal Component Analysis in the Presence of Missing Values.” J. Mach. Learn. Res.. Vol. 11, August 2010, pp. 1957–2000.
확장 기능
tall형 배열
메모리에 담을 수 없을 정도로 많은 행을 가진 배열을 계산할 수 있습니다.
이 함수는 메모리에 담을 수 없는 데이터에 대한 tall형 배열을 지원하지만 다음과 같은 몇 가지 제한 사항이 있습니다.
pca
는 공분산 행렬을 계산하고 메모리 내pcacov
함수를 사용하여 주성분을 계산함으로써 tall형 배열을 직접 처리합니다.지원되는 구문은 다음과 같습니다.
coeff = pca(X)
[coeff,score,latent] = pca(X)
[coeff,score,latent,explained] = pca(X)
[coeff,score,latent,tsquared] = pca(X)
[coeff,score,latent,tsquared,explained] = pca(X)
이름-값 쌍의 인수는 지원되지 않습니다.
자세한 내용은 메모리에 담을 수 없는 큰 데이터를 위한 tall형 배열 항목을 참조하십시오.
C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.
사용법 관련 참고 및 제한 사항:
'Algorithm'
이'als'
이면'Options'
에 대한'Display'
값이 무시됩니다.'Weights'
및'VariableWeights'
이름-값 쌍 인수의 값은 실수여야 합니다.'Economy'
이름-값 쌍 인수의 값은 컴파일타임 상수여야 합니다. 예를 들어, 생성되는 코드에'Economy',false
이름-값 쌍의 인수를 사용하려면codegen
(MATLAB Coder)의-args
값에{coder.Constant('Economy'),coder.Constant(false)}
를 포함시키십시오.이름-값 인수에 지정하는 이름은 컴파일타임 상수여야 합니다.
생성되는 코드는 다섯 번째 출력값
explained
를 항상 열 벡터로 반환합니다.생성되는 코드는 여섯 번째 출력값
mu
를 항상 행 벡터로 반환합니다.mu
가 비어 있는 경우,pca
는mu
를 1×0 배열로 반환합니다.pca
는mu
를 0×0 빈 배열로 반환하지 않습니다.생성되는 코드는 모든 값이
NaN
인 입력 행렬X
를 특수한 사례로 취급하지 않습니다. 출력 차원은 이에 대응되는 유한한 입력값과 동일합니다.생성된 코드가 배포될 장치의 메모리 절약을 위해 훈련(입력 데이터에서 PCA 성분 생성)과 예측(PCA 변환 수행)을 분리할 수도 있습니다. MATLAB®에서 PCA 성분을 생성하십시오. 그런 다음
pca
의 출력값인 주성분 계수(coeff
)와 추정된 평균(mu
)을 사용하여 PCA 변환을 수행하는 진입점 함수를 정의하십시오. 마지막으로, 진입점 함수에 대한 코드를 생성합니다. 예제는 새 데이터에 PCA를 적용하고 C/C++ 코드 생성하기 항목을 참조하십시오.
코드 생성에 대한 자세한 내용은 Introduction to Code Generation 항목 및 General Code Generation Workflow 항목을 참조하십시오.
GPU 배열
Parallel Computing Toolbox™를 사용해 GPU(그래픽스 처리 장치)에서 실행하여 코드 실행 속도를 높일 수 있습니다.
사용법 관련 참고 및 제한 사항:
이름-값 인수
Algorithm
을"als"
로 지정할 수 없습니다.EIG 알고리즘은 변수 개수가 많은 경우 일반적으로 SVD보다 더 빠릅니다.
자세한 내용은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오.
버전 내역
R2012b에 개발됨
참고 항목
barttest
| biplot
| canoncorr
| factoran
| pcacov
| pcares
| rotatefactors
| ppca
| incrementalPCA
| 차원 축소
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)