clc;
clear all;
R1 = rand(1000, 2);
R1_mean = [mean(R1(:,1)), mean(R1(:,2))];
Rctr = [R1(:, 1) - R1_mean(:, 1) , R1(:,2) - R1_mean(:,2)];
for i = 1:1000
if ((sqrt(Rctr(i, 1)^2 + Rctr(i, 2)^2)) > 0.5)
for j = 1 : 2
Rcirc(i, j ) =0;
end
else
for j = 1 : 2
Rcirc(i, j) = Rctr(i, j);
end
end
end
plot(Rcirc(:,1), Rcirc(:,2), "r*");
grid
axis("square");
title("uniform distributed random vectors의 원점을 0으로");
xlabel('x');
ylabel("y");
4.4 공분산 행렬과 고유벡터, 고유치 구하기
- 방금 구한 원의 데이터들로 공분산 행렬 계산
clc;
clear all;
R1 = rand(1000, 2);
R1_mean = [mean(R1(:,1)), mean(R1(:,2))];
Rctr = [R1(:, 1) - R1_mean(:, 1) , R1(:,2) - R1_mean(:,2)];
for i = 1:1000
if ((sqrt(Rctr(i, 1)^2 + Rctr(i, 2)^2)) > 0.5)
for j = 1 : 2
Rcirc(i, j ) =0;
end
else
for j = 1 : 2
Rcirc(i, j) = Rctr(i, j);
end
end
end
N = 1000
a = 0;
for i = 1 : N
a = a + Rcirc(i, 1)^2;
end
a = a /N;
b = 0;
for i = 1 : N
b = b + Rcirc(i, 1) * Rcirc(i, 2);
end
b = b /N;
c = 0;
for i = 1 : N
c = c + Rcirc(i, 2)^2;
end
c = c / N;
C = [a b;b c]
[EigenVector, EigenValue] = eig(C)
5. 주성분 분석실습
- 방금 구한 2차원 데이터를 1차원으로 축소시키자
5.1 데이터 준비하기
균일 분포로 차원이 2인 벡터 1000개 생성
- 방금 구한 2차원 데이터를 1차원으로 축소시키자
clear all;
close all;
clc;
% 정규 분포를 따르는 2차원 데이터 생성
x(1, :) = randn(1, 100);
x(2, :) = randn(1, 100) *3;
% 타원 모양 분포를 약간 회전시키자
% 카티지안 좌표계를 극좌표계로 변환후 pi/3회전 후 다시 카티지안으로변환
[p(1, :), p(2,:) ] = cart2pol(x(1, :), x(2, :));
p(1, :) = p(1, :) - pi/3;
[x(1, :), x(2,:)] = pol2cart(p(1,:), p(2,:));
% 데이터 플로팅
scatter(x(1,:), x(2,:));
axis equal;
5.2 주성분 찾기
- pacov : 공분산 행렬로 주성분을 바로 구하여 고유값 크기순으로 정렬해주는 함수
* 주성분 : 고유 벡터를 기저로하고, 고유치만큼 길이를 갖는 데이터를 가장 잘나타내는 축?
=> 붉은 선이 제1 주성분으로 최대 변동 축
=> 녹색 선이 제 2 주성분 , 제1주성분과 수직
clear all;
close all;
clc;
% 정규 분포를 따르는 2차원 데이터 생성
x(1, :) = randn(1, 100);
x(2, :) = randn(1, 100) *3;
% 타원 모양 분포를 약간 회전시키자
% 카티지안 좌표계를 극좌표계로 변환후 pi/3회전 후 다시 카티지안으로변환
[p(1, :), p(2,:) ] = cart2pol(x(1, :), x(2, :));
p(1, :) = p(1, :) - pi/3;
[x(1, :), x(2,:)] = pol2cart(p(1,:), p(2,:));
% 데이터 플로팅
scatter(x(1,:), x(2,:));
axis equal;
% 주성분 PC 찾기
[pc, latent, explained] = pcacov(cov(x'));
% 데이터 상에 주성분 그림
hold on;
plot([-4 4] * pc(1,1), [-4 4] *pc(2, 1), 'r-');
plot([-2 2] * pc(1,2), [-2 2] *pc(2, 2), 'g-');
5.3 데이터들이 주성분을 주축으로 하도록 회전
-원 데이터 집합과 주성분을 곱하면 데이터들이 주성분이 주축이 되도록 회전됨
clear all;
close all;
clc;
% 정규 분포를 따르는 2차원 데이터 생성
x(1, :) = randn(1, 100);
x(2, :) = randn(1, 100) *3;
% 타원 모양 분포를 약간 회전시키자
% 카티지안 좌표계를 극좌표계로 변환후 pi/3회전 후 다시 카티지안으로변환
[p(1, :), p(2,:) ] = cart2pol(x(1, :), x(2, :));
p(1, :) = p(1, :) - pi/3;
[x(1, :), x(2,:)] = pol2cart(p(1,:), p(2,:));
% 주성분 PC 찾기
[pc, latent, explained] = pcacov(cov(x'));
% 주성분을 축으로 데이터를 회전
y = (x' * pc)';
% 데이터 플로팅
figure;
scatter(y(1, :), y(2, :));
axis equal;
5.4 축 상으로 주성분이 놓여졌는지 확인하기
clear all;
close all;
clc;
% 정규 분포를 따르는 2차원 데이터 생성
x(1, :) = randn(1, 100);
x(2, :) = randn(1, 100) *3;
% 타원 모양 분포를 약간 회전시키자
% 카티지안 좌표계를 극좌표계로 변환후 pi/3회전 후 다시 카티지안으로변환
[p(1, :), p(2,:) ] = cart2pol(x(1, :), x(2, :));
p(1, :) = p(1, :) - pi/3;
[x(1, :), x(2,:)] = pol2cart(p(1,:), p(2,:));
% 주성분 PC 찾기
[pc, latent, explained] = pcacov(cov(x'));
% 주성분을 축으로 데이터를 회전
y = (x' * pc)';
% 데이터 플로팅
figure;
scatter(y(1, :), y(2, :));
axis equal;
% 주성분 PC 찾기
[pc2, latent, explained] = pcacov(cov(y'));
% 데이터 상에 주성분 그림
hold on;
plot([-4 4] * pc2(1,1), [-4 4]*pc2(2,1), 'r-');
plot([-2 2]* pc2(1, 2), [-2 2] *pc(2, 2), 'g-');
5.5 주성분 분석
-원 데이터와 주성분을 내적하면 데이터들이 주성분 축으로 사상되어 1차원 데이터로 축소됨
clear all;
close all;
clc;
% 정규 분포를 따르는 2차원 데이터 생성
x(1, :) = randn(1, 100);
x(2, :) = randn(1, 100) *3;
% 타원 모양 분포를 약간 회전시키자
% 카티지안 좌표계를 극좌표계로 변환후 pi/3회전 후 다시 카티지안으로변환
[p(1, :), p(2,:) ] = cart2pol(x(1, :), x(2, :));
p(1, :) = p(1, :) - pi/3;
[x(1, :), x(2,:)] = pol2cart(p(1,:), p(2,:));
% 주성분 PC 찾기
[pc, latent, explained] = pcacov(cov(x'));
% 주성분을 축으로 데이터를 회전
y = (x' * pc)';
% 1차원으로 축소하기 위해 두번째 성분을 0으로 설정.
y(2,:)=0;
%원 데이터 역변환
x = (y' * inv(pc)');
% 데이터 플로팅
figure;
scatter(y(1, :), y(2, :));
axis equal;