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;

'인공지능' 카테고리의 다른 글
인공지능 - 1. 개요 ~ 탐색 (0) | 2020.10.15 |
---|---|
패턴인식 - 9. 선형 판별 분석 (0) | 2020.08.06 |
패턴인식 - 7. 비모수 밀도 추정 (0) | 2020.08.04 |
패턴인식 - 6. 가우시안 혼합 모델 (0) | 2020.08.04 |
패턴인식 - 5. 데이터 마이닝 (0) | 2020.08.04 |