PCA를 이용한 차원 축소 소스 코드


매트랩 사용

차원 축소 방법을 사용한 결과와 x,y 값만 추출한 결과를 비교


<Command Line>

%% 1) 랜덤한 3차원 데이터를 100개 생성하고 x, y 값만 추출하여 차원축소

>> close all

>> clear all

>> clc

>> x = randn(3,100);

% 3차원 데이터 100개 랜덤으로 생성

>> figure(1);
>> scatter(x(1,:),x(2,:)); axis equal; drawnow;

% x, y 값만 이용하여 2차원 데이터로 표현

>> axis('square');
>> title('Display 2 Dimentional Data');
>> xlabel('x');
>> ylabel('y');
>>


%% 2) 3차원 데이터를 분석하여 사영될 새로운 축을 생성함

>> figure(2);
>> scatter3(x(1,:),x(2,:),x(3,:)); axis equal; drawnow;

%% 3차원 랜덤 데이터를 3차원 공간에 그림

>> [pc, latent, explained]=pcacov(cov(x'));

% pc : the principal components

% latent : eigenvalues

>>
>> hold on;
>> plot3([-3 3]*pc(1,1), [-3 3]*pc(2,1), [-3 3]*pc(3,1), 'r-');
>> plot3([-3 3]*pc(1,2), [-3 3]*pc(2,2), [-3 3]*pc(3,2), 'g-');
>> plot3([-3 3]*pc(1,3), [-3 3]*pc(2,3), [-3 3]*pc(3,3), 'b-');
>>

% 데이터 상에 주성분을 그림

>> y=(x'*pc)';
>>

% 주성분을 축으로 데이터를 회전

>> figure(3); scatter3(y(1,:),y(2,:),y(3,:)); axis equal; drawnow;
>> [pc2, latent, explained] = pcacov(cov(y'));
>> hold on;
>> plot3([-3 3]*pc2(1,1), [-3 3]*pc2(2,1), [-3 3]*pc2(3,1), 'r-');
>> plot3([-3 3]*pc2(1,2), [-3 3]*pc2(2,2), [-3 3]*pc2(3,2), 'g-');
>> plot3([-3 3]*pc2(1,3), [-3 3]*pc2(2,3), [-3 3]*pc2(3,3), 'b-');
>> 


%% 3) 위에서 구한 고유벡터와 고유값을 토대로 가장 적합한 사영축을 찾은 후 3차원 랜덤값과 내적(사영)

>> z(1,:) = pc(:,1)'*x;
>> z(2,:) = pc(:,2)'*x;
>> 

% 주축에 대한 계수값을 구함, 계수값은 내적으로 통해 얻음
>> figure(4)
>> scatter(z(1,:),z(2,:)); axis equal; drawnow;

% 주축을 중심으로 차원 축소된 값을 그림



1) 3차원 데이터를 x, y 값만 추출하여 2차원으로 표시



2) 3차원 데이터를 PCA 분석하여 새로운 축 3개를 얻음


3) 축을 회전 시켜 데이터가 어떻게 분포하고 있는지 확인


4) 고유치와 고유벡터를 고려하여 최적의 축에 사영


5) 고유치와 고유벡터

pc

1                                        2                                            3

1    -0.580314506145636    -0.808252223106021    0.0998169214167680
2    0.195312598786910    -0.0191361300365170    0.980554331632026
3    -0.790625108829748    0.588525405034821    0.168966816021814

latent

1

1    1.28221606958555
2    1.09959619083537
3    1.01180555585219

Posted by 그래제길