Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

pca

원시 데이터에 대한 주성분 분석

설명

예제

coeff = pca(X)는 n×p 데이터 행렬 X에 대한 주성분 계수(적재값이라고도 함)를 반환합니다. X의 행은 관측값에 대응되고, 열은 변수에 대응됩니다. 계수 행렬은 p×p입니다. coeff의 각 열은 하나의 주성분에 대한 계수를 포함하고, 이러한 열들은 성분 분산을 기준으로 내림차순으로 정렬됩니다. 기본적으로, pca는 데이터를 중심화하고 특이값 분해(SVD) 알고리즘을 사용합니다.

예제

coeff = pca(X,Name,Value)는 하나 이상의 Name,Value 쌍 인수로 지정된, 특수 데이터형의 계산 및 처리와 관련한 추가 옵션을 사용하여 위에 열거된 구문에 포함된 출력 인수를 반환합니다.

예를 들어, pca에서 반환하는 주성분 개수를 지정하거나 SVD 이외의 알고리즘을 사용하도록 지정할 수 있습니다.

예제

[coeff,score,latent] = pca(___)score로 주성분 점수도 반환하고 latent로 주성분 분산도 반환합니다. 위에 열거된 구문의 모든 입력 인수와 사용할 수 있습니다.

주성분 점수는 주성분 공간에서 X의 표현입니다. score의 행은 관측값에 대응되고, 열은 성분에 대응됩니다.

주성분 분산은 X의 공분산 행렬의 고유값입니다.

예제

[coeff,score,latent,tsquared] = pca(___)X에 포함된 각 관측값에 대한 호텔링(Hotelling)의 T 제곱 통계량도 반환합니다.

예제

[coeff,score,latent,tsquared,explained,mu] = pca(___)는 각 주성분으로 설명된 총 분산의 백분율인 explainedX에 포함된 각 변수에 대한 추정된 평균인 mu도 반환합니다.

예제

모두 축소

표본 데이터 세트를 불러옵니다.

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개 주성분에 대응됩니다.

데이터 세트에 누락값이 있을 때의 주성분 계수를 구합니다.

표본 데이터 세트를 불러옵니다.

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행에서 scoretsquared에 다시 삽입됩니다.

'pairwise'를 사용하여 주성분 분석을 수행합니다.

coeff = pca(X(:,3:15),'Rows','pairwise');

이 경우, pcaX의 열 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.

주성분 분석을 수행하는 동안 역 가변 분산을 가중치로 사용합니다.

표본 데이터 세트를 불러옵니다.

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
   -0.0000    0.0000    1.0000   -0.0000
    0.0000         0   -0.0000    1.0000

데이터에 누락값이 있을 때 교대최소제곱법(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 = 6.8730e-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'});

Figure contains an axes object. The axes object with xlabel Component 1, ylabel Component 2 contains 8 objects of type line, text. One or more of the lines displays its values using only markers

네 개 변수 모두 이 행렬도에서 벡터로 표현되며, 벡터의 방향과 길이는 각 변수가 플롯의 두 주성분에서 얼마나 큰 비중을 차지하는지를 나타냅니다. 예를 들어, 가로 축에 있는 첫 번째 주성분은 세 번째 변수와 네 번째 변수에 대한 양의 계수를 가집니다. 따라서, 벡터 v3v4는 플롯의 우반면 쪽을 향합니다. 첫 번째 주성분의 최대 계수는 네 번째 계수이며, 이는 변수 v4에 대응됩니다.

세로 축에 있는 두 번째 주성분은 변수 v1, v2, v4에 대해서는 음의 계수를 가지고 변수 v3에 대해서는 양의 계수를 가집니다.

이 2차원 행렬도는 13개 관측값 각각에 대한 점도 포함하며, 이 점은 플롯에서 두 개 주성분에 대한 각 관측값의 점수를 나타내는 좌표를 가집니다. 예를 들어, 플롯의 왼쪽 가장자리 근처에 있는 점은 첫 번째 주성분에 대해 최소 점수를 가집니다. 점은 최대 점수 값과 최대 계수 길이에 대해 스케일링되므로, 플롯에서 점의 상대 위치만 확인할 수 있습니다.

호텔링(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')

Figure contains an axes object. The axes object with xlabel 1st Principal Component, ylabel 2nd Principal Component contains an object of type scatter.

데이터는 첫 번째 주성분 축을 따라 가장 큰 변동성을 표시합니다. 이는 첫 번째 축에서 선택 가능한 모든 선택에서의 가장 큰 분산입니다. 두 번째 주성분 축을 따른 변동성은 두 번째 축에서 선택할 수 있는 남아 있는 모든 선택에서의 가장 큰 분산입니다. 세 번째 주성분 축은 세 번째로 큰 변동성을 가지며, 이는 두 번째 주성분 축을 따른 변동성보다 상당히 작습니다. 네 번째 주성분 축에서 열 세 번째 주성분 축까지는 검사할 가치가 없습니다. 이들 축은 데이터의 전체 변동성 중 0.05%만 설명하기 때문입니다.

특정 출력값을 생략하려면 그에 해당하는 요소의 위치에 ~를 사용하면 됩니다. 예를 들어, T 제곱 값을 얻지 않으려는 경우 다음을 지정하십시오.

[coeff,score,latent,~,explained] = pca(X(:,3:15));

하나의 데이터 세트에 대해 주성분을 구하고 다른 데이터 세트에 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);

mdlClassificationTree 모델입니다.

훈련된 모델을 검정 세트에 대해 사용하려면 훈련 데이터 세트에서 얻은 PCA를 사용하여 검정 데이터 세트를 변환해야 합니다. XTest에서 mu를 빼고 coeff를 곱하여 검정 데이터 세트의 주성분 점수를 구합니다. 처음 두 개 성분의 점수만 필요하므로 처음 두 개 계수 coeff(:,1:idx)를 사용합니다.

scoreTest95 = (XTest-mu)*coeff(:,1:idx);

훈련된 모델 mdl과 변환된 검정 데이터 세트 scoreTestpredict 함수에 전달하여 검정 세트에 대한 신용 등급을 예측합니다.

YTest_predicted = predict(mdl,scoreTest95);

코드 생성하기

데이터에 PCA를 적용하고 훈련된 모델을 사용하여 신용 등급을 예측하는 코드를 생성합니다. C/C++ 코드를 생성하려면 MATLAB® Coder™가 필요합니다.

saveLearnerForCoder를 사용하여 분류 모델을 파일 myMdl.mat에 저장합니다.

saveLearnerForCoder(mdl,'myMdl');

검정 데이터 세트(XTest)와 PCA 정보(coeffmu)를 받아서 검정 데이터의 신용 등급을 반환하는 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);

myPCAPredictcoeffmu를 사용하여 새 데이터에 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)을 반환합니다. 이는 모든 입력값이 동일하다는 의미입니다. 비교를 통해 mdlpredict 함수와 myPCAPredict_mex 함수가 동일한 신용 등급을 반환함을 확인할 수 있습니다.

코드 생성에 대한 자세한 내용은 Introduction to Code Generation 항목 및 Code Generation and Classification Learner App 항목을 참조하십시오. 후자 항목에서는 분류 학습기 앱을 사용하여 PCA를 수행하고 모델을 훈련시키는 방법과 훈련된 모델을 기반으로 새 데이터에 대해 레이블을 예측하는 C/C++ 코드를 생성하는 방법을 설명합니다.

입력 인수

모두 축소

주성분을 계산할 입력 데이터로, n×p 행렬로 지정됩니다. X의 행은 관측값에 대응되고 열은 변수에 대응됩니다.

데이터형: single | double

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: 'Algorithm','eig','Centered',false,'Rows','all','NumComponents',3pca가 고유값 분해 알고리즘을 사용하고, 데이터를 중심화하지 않으며, 모든 관측값을 사용하고, 처음 세 개의 주성분만 반환하도록 지정합니다.

pca에서 주성분 분석을 수행하는 데 사용하는 주성분 알고리즘으로, 'Algorithm'과 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

설명
'svd'디폴트 값. X의 특이값 분해(SVD)입니다.
'eig'공분산 행렬에 대한 고유값 분해(EIG)입니다. EIG 알고리즘은 관측값 개수 n이 변수 개수 p를 초과할 경우 SVD보다 더 빠르지만, 공분산의 조건수가 X의 조건수의 제곱이기 때문에 덜 정확합니다.
'als'

교대최소제곱법(ALS) 알고리즘입니다. 이 알고리즘은 X를 n×k 좌측 인수 행렬 L과 p×k 우측 인수 행렬 R로 분해하여 최적의 랭크-k 근삿값을 구합니다(여기서 k는 주성분의 개수임). 행렬 분해는 임의의 초기값으로 시작하는 반복법을 사용합니다.

ALS는 누락값을 더 잘 처리하도록 설계되었습니다. 이 알고리즘은 쌍별(Pairwise) 삭제('Rows','pairwise')보다 선호되며 목록별(Listwise) 삭제('Rows','complete') 없이 누락값을 처리합니다. 이 알고리즘은 작은 비율의 누락값이 무작위로 분포하는 데이터 세트에서는 제대로 동작할 수 있지만, 희소 데이터 세트에서는 성능이 좋지 않을 수도 있습니다.

예: 'Algorithm','eig'

열을 중심화할지 여부를 나타내는 표시자로, 'Centered'와 함께 다음 논리식 중 하나가 쉼표로 구분되어 지정됩니다.

설명
true

디폴트 값. pca는 특이값 분해 또는 고유값 분해를 계산하기 전에 열 평균을 빼서 X를 중심화합니다. XNaN 누락값을 포함하는 경우, 사용 가능한 데이터로 평균을 구하기 위해 mean(X,'omitnan')이 사용됩니다. score*coeff'를 사용하여 중심화된 데이터를 재구성할 수 있습니다.

false

이 경우 pca는 데이터를 중심화하지 않습니다. score*coeff'를 사용하여 원래 데이터를 재구성할 수 있습니다.

예: 'Centered',false

데이터형: logical

자유도 d가 변수 개수 p보다 작은 경우 효율적인 크기로 출력할지 여부를 나타내는 표시자로, 'Economy'와 함께 다음 논리식 중 하나가 쉼표로 구분되어 지정됩니다.

설명
true

디폴트 값. pcalatent의 처음 d개 요소와 coeffscore에서 이에 대응되는 열만 반환합니다.

이 옵션을 사용하면 변수 개수 p가 d보다 훨씬 큰 경우 속도가 크게 빨라질 수 있습니다.

false

pcalatent의 모든 요소를 반환합니다. latent의 0 요소에 대응되는 coeffscore의 열은 0입니다.

참고로, d < p이면 score(:,d+1:p)latent(d+1:p)는 반드시 0이며, coeff(:,d+1:p)의 열은 X에 직각인 방향을 정의합니다.

예: 'Economy',false

데이터형: logical

요청된 성분의 개수로, 'NumComponents'와 함께 0 < k ≤ p 조건을 충족하는 정수 스칼라 k 가 쉼표로 구분되어 지정됩니다. 여기서 p는 X에 포함된 원래 변수의 개수입니다. 지정된 경우 pcacoeffscore의 처음 k개 열을 반환합니다.

예: 'NumComponents',3

데이터형: single | double

데이터 행렬 XNaN 값에 대해 수행할 동작으로, 'Rows'와 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

설명
'complete'

디폴트 값. NaN 값을 포함하는 관측값이 계산 전에 제거됩니다. NaN이 있는 행은 scoretsquared의 해당 위치에 다시 삽입됩니다.

'pairwise'

이 옵션은 알고리즘이 'eig'인 경우에만 적용됩니다. 'pairwise'와 함께 알고리즘을 지정하지 않으면 pca가 알고리즘을 'eig'로 설정합니다. 옵션 'Rows','pairwise'와 함께 'svd'를 알고리즘으로 지정하면 pca가 경고 메시지를 반환하고, 알고리즘을 'eig'로 설정한 후 계속합니다.

'Rows','pairwise' 옵션을 지정하면 pcaX의 열 i 또는 j 내에 NaN 값이 없는 행을 사용하여 공분산 행렬의 (i,j) 요소를 계산합니다.

참고로, 결과로 생성되는 공분산 행렬은 양의 정부호가 아닐 수 있습니다. 이 경우, pca가 종료되고 오류 메시지가 표시됩니다.

'all'

X에는 누락값이 없어야 합니다. pca는 모든 데이터를 사용하며 NaN 값이 검색되면 종료됩니다.

예: 'Rows','pairwise'

관측값 가중치로, 'Weights'와 함께 모든 양의 요소를 포함하는 길이가 n인 벡터가 쉼표로 구분되어 지정됩니다.

데이터형: single | double

가변 가중치로, 'VariableWeights'와 함께 다음 중 하나가 쉼표로 구분되어 지정됩니다.

설명

행 벡터

모든 양의 요소를 포함하는 길이가 p인 벡터입니다.

'variance'

가변 가중치는 표본 분산의 역입니다. 'Weights'를 사용하여 관측값에 가중치를 할당하는 경우에도 가변 가중치가 가중 표본 분산의 역이 됩니다.

동시에 'Centered'true로 설정되면 데이터 행렬 X가 중심화되고 표준화됩니다. 이 경우, pca는 상관 행렬을 기반으로 하여 주성분을 반환합니다.

예: 'VariableWeights','variance'

데이터형: single | double | char | string

계수 행렬 coeff의 초기값으로, 'Coeff0'과 함께 p×k 행렬이 쉼표로 구분되어 지정됩니다. 여기서 p는 변수 개수이고, k는 요청된 주성분의 개수입니다.

참고

'algorithm''als'인 경우에만 이 이름-값 쌍을 사용할 수 있습니다.

데이터형: single | double

점수 행렬 score의 초기값으로, 'Score0'과 함께 n×k 행렬이 쉼표로 구분되어 지정됩니다. 여기서 n은 관측값 개수이고, k는 요청된 주성분의 개수입니다.

참고

'algorithm''als'인 경우에만 이 이름-값 쌍을 사용할 수 있습니다.

데이터형: single | double

반복에 사용할 옵션으로, '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

출력 인수

모두 축소

주성분 계수로, p×p 행렬로 반환됩니다. coeff의 열은 각각 하나의 주성분에 대한 계수를 포함합니다. 열은 성분 분산 latent을 기준으로 내림차순으로 정렬됩니다.

주성분 점수로, 행렬로 반환됩니다. score의 행은 관측값에 대응되고, 열은 성분에 대응됩니다.

X의 공분산 행렬의 고유값인 주성분 분산으로, 열 벡터로 반환됩니다.

각 관측값에 대한 표준화된 점수의 제곱합인 호텔링(Hotelling)의 T 제곱 통계량으로, 열 벡터로 반환됩니다.

각 주성분으로 설명된 총 분산의 백분율로, 열 벡터로 반환됩니다.

X의 변수에 대한 추정된 평균으로, Centeredtrue로 설정된 경우 행 벡터로 반환됩니다. Centeredfalse인 경우 소프트웨어가 평균을 계산하지 않고 0으로 구성된 벡터를 반환합니다.

세부 정보

모두 축소

호텔링(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는 n – 1과 같습니다. 그렇지 않은 경우 n입니다. 여기서 다음 사항이 적용됩니다.

  • 'Rows','complete'를 사용하는 경우 n은 NaN이 없는 행 개수입니다.

  • 'Rows','pairwise'를 사용하는 경우 n은 NaN이 없는 행을 가장 많이 갖는 열 쌍에서 NaN이 없는 행 개수입니다.

가변 가중치

참고로, 가변 가중치가 사용되는 경우 계수 행렬이 정규 직교가 아닙니다. 사용한 가변 가중치 벡터를 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.

확장 기능

버전 내역

R2012b에 개발됨