728x90

1. 차원이 너무 클때의 문제와 개선법

차원을 줄여야 하는 이유

- 패턴 인식에서 다차원의 특징 벡터를 사용하는데 어떤 벡터를 사용할까?

- 어떤 벡터를 사용할지와 특징 개수에 따라서 패턴 인식기의 성능이 크게 좌우됨.

 

차원의 저주 curse of dimensionality : 차원이 큰 경우의 문제점

- 잡음들도 포함되어 분류에 에러가 심해짐

- 패턴 분류기의 학습과 분류 속도가 느려짐

- 모델링해야할 집합이 너무 큼

 

주성분분석 principal component analysis

- 고차원 특징 벡터를 중요한 특징들을 추출하여 저차원의 특징벡터로 만드는 방법

 

주성분 분석의 사용 예시

- 데이터 시각화 : 고차원 데이터를 시각화 하기 위해서 2차원이나 3차원으로 축소함

- 특징 추출 : 고차원 데이터 집합에 강건한 분류기를 만들려하나 샘플이 부족

               -> PCA로 차원 축소하여 설계시 적은 샘플로 좋은 성능 보임

 

 

 

 

 

 

 

 

2. 고유 벡터와 고유치

고유벡터와 고유치 개요

- 행렬 A가 주어질때 다음의 정의를 만족하는 값 lamdba를 고유치 eigen value 와 벡터 v를 고유 벡터 eigen vector

고유벡터의 의미

- 행렬 곱셈의 특별한 경우

- 다음의 예시를 보자

- 위의 곱은 원래 백터의 스칼라 곱으로 결과가 안나오지만, 아래의 곱샘 결과는 원래의 벡터에 스칼라 곱이 나옴

- 이유 

     1. 벡터 (3; 2)는 2차원 점으로 원점 (0,0)에서 (3, 2)를 가리킴.

     2. 좌측의 정방 행렬은 벡터의 왼쪽에서 곱하여 벡터를 다른 위치로 만든는 변환 행렬

     3. 정방 행렬이 벡터를 직선 y = x에 대칭하게 만드는 행렬의 경우, 벡터는 변환 행렬을 곱해도 자기자신이 됨

     4. 이 때 벡터 (3; 2)는 변환 행렬의 고유 벡터

- 특징

     1.고유 벡터는 정방 행렬에서만 존재하나 모든 정방 행렬은 고유 벡터를 갖고 있지 않음.

     2. 정방 행렬이 n x n 인 경우 고유 벡터는 n 개

     3. 고유 벡터는 곱하기 전에 스케일링을 해도 여전히 동일한 스칼라 곱의 결과가 나옴

        => 스칼라 값은 고유벡터의 길이를 늘리거나 줄이기 밖에 못함

     4. 고유벡터들은 서로 직교 orthogonal함

        => 셈플 데이터들을 x-y축이 아닌 직교 고유 벡터를 기저로하여 표현 가능

 

 

고유 값의 의미

- 이미 고유 벡터에서 설명.

- 고유 벡터의 스칼라 곱이 고유값 -> 위 예시에서 4가 고유벡터의 고유치

 

 

* 고유값과 고유벡터가 중요한 이유 !!!!

-> 특이값 분해 SVD, 선형 연립방정식의 해, 주성분 분석 PCA 등 많이 사용됨

 

 

 

 

 

 

 

3. 주성분 분석법

다변량 분석 multivariate analysis

- 각 차원간에 상관 관계를 가지는 변수 데이터들을 다루게 됨.

 

주성분 분석 PCA Principal Component Analysis

- 다차원 특징 벡터로 이루어진 데이터의 정보들은 유지시키면서 낮은 차원으로 축소시키는 다변량 처리 방법 중 하나

 

주성분 분석에서의 차원

- 특징 데이터는 특징 벡터의 차원수 만큼의 축을 기준으로 표현

 => ex. 2차원 특징 데이터는 2개의 기준 축으로 표현

- 차원 축소 -> 기준 축을 줄여나간다 

 => 10차원 데이터를 4차원으로 줄인다 -> 10개의 기준축을 4개로 축소함

 

주성분 분석의 과정

1. 다변량 데이터의 주성분인 주축을 통계적 방법으로 구함

2. 주축 principal axis 방향으로 특징 벡터 x를 사영 projection하여 차원 축소.

=> 상관 관계있는 변수들을 상관 없는 변수들의 집합으로 기준축 중심으로 변환하는 것

=> Karthunen-Loeve 변환 KL 변환이라고도 부름

 

차원 수를 축소하는 이유

- 차원의 저주 문제를 개선하기 위해 줄이며, PCA로 낮은 차원에서 최적의 특징 벡터를 효과적으로 다룰 수 있음

 

주성분 분석의 주축에 따른 변화

- 주축을 어떻게 설정하느냐에 따라서 변량의 분산이 달라짐

 => 가장 유용한 성분은 가장 큰 분산값을 가질떄의 성분들

 

 

 

 

 

 

 

4. 고유치, 고유벡터 실습

4.1 균일 분포 샘플 띄우기

 균일 분포로 차원이 2인 벡터 1000개 생성 후 플로팅

clc;
clear all;


R1 = rand(1000, 2);
figure;
plot(R1(:,1), R1(:,2), "r*");

grid
axis("square");
title("uniform distributed random vectors");
xlabel('x');
ylabel("y");

 

4.2 원점 조정

- 샘플 데이터의 중심이 0이 되도록 수정

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)];
figure;
plot(Rctr(:,1), Rctr(:,2), "r*");


grid
axis("square");
title("uniform distributed random vectors의 원점을 0으로");
xlabel('x');
ylabel("y");

 

4.3 샘플 데이터를 원으로 만들기

- 반경 0.5 넘어가는 샘플들은 제거

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;

300x250

+ Recent posts