728x90

정보 이론 information theory

 

그동안 패턴 인식에 기반이 되는 확률 이론과 결정 이론에 대한 개념들을 살펴봤고,

 

이번에는 정보 이론에 대해서 알아보자

 

 

이산 확률 변수 x가 주어졌을때 이 확률 변수에는 정보가 얼마나 있는지 궁금할수 있다.

 

정보의 양은 x를 학습하는 중에 발생하는 놀람의 정도(degree of surpise, 갑작스러운 변화의 정도)로 볼수 있는데

 

예상치 못한 상황이 많이 발생할수록 그렇지 않은 경우보다 정보가 많다고 할수 있으며

 

혹은 특정한 상황이 발생하지 않는다면 정보가 없는게 된다.

 

 

정보의 양

 

그래서 정보의 양에 대한 척도는 확률 분포 p(x)에 영향을 받으며

 

정보의 양을 나타내는 h(x)는 확률 변수 p(x)가 얼마나 단조로운지, 변화가 없는지에 대한 함수라고 할수있겠다.

 

 

두 사건 x, y가 전혀 상관관계가 없는 경우 이들로부터 얻을수 있는 정보의 양은

 

각 정보의 양의 합이되며 h(x, y) = h(x) + h(y)가 된다.

 

두 사건 x, y는 독립이므로 p(x, y) = p(x) p(y)도 되겠다.

 

h(x)를 구하는 간단한 방법으로 확률 분포 p(x)에 로그를 취하면 되는데

 

아래와 같이 음의 부호를 붙임으로서 정보의 양이 양의 값이나 음의 값을 가지게 된다.

* p(x)는 0 ~ 1사이 값을 가지므로, 로그를 취할 시 음수가 되기 때문

 

 

 

 

 

 

 

 

엔트로피 entropy

 

엔트로피 = 정보의 양에 대한 기대값(정보의 불순 정도)

 

위 식을 보면 사건 x가 발생할 확률이 적을수록 정보의 양이 크다는 점을 알수 있는데, 

 

h(x)의 단위는 비트 단위이므로, 로그의 밑이 2인 로그를 사용한다.

 

한번 송신자가 수신자에게 확률 변수 값들을 보내는 경우를 생각해보자.

 

여기서 보내지는 정보의 평균 양은 확률 분포 p(x)에 대한 위 식의 기대값으로 구할수 있는데 아래와 같다.

 

 

이 양을 확률변수 x에 대한 엔트로피라 부른다.

 

 

 

 

 

 

 

 

엔트로피와 불순도

 

지금까지 정보의 정의와 엔트로피에 대해서 살펴보았고, 이 개념이 얼마나 유용한지 알아보자

 

경우 (1)

 

확률 변수 x가 8가지 경우가 존재하고, 각각 경우의 확률들은 동일하다고 생각해보자.

* p(x = x1) = 1/8, p(x = x2) = 1/8, ...

 

x의 값으로 수신자에게 정보를 보낸다고 한다면, 길이가 3비트인 메시지를 전송하면 되겠다.

 

이 확률 변수의 엔트로피는 아래와 같이 구할수 있다.

 

 

하지만 위 경우는 모든 경우의 수가 동일한 확률일 경우를 가정한 경우이고

 

경우 (2)

8가지 상태 {a, b, c, d, e, f, g, h}가 있을때 각각의 상태의 확률이 {1/2, 1/4, 1/8, 1/16, 1/64, 1/64, 1/64, 1/64}라고 할때

 

엔트로피는 아래와 같이 구할수 있다.

 

 

위의 두가지 경우 균일하지 않은 분포일수록 균일한 경우보다 엔트로피 값이 작아진다는것을 알 수 있는데,

 

이를통해 엔트로피라는 용어가 불순도의 정보를 의미한다는 것을 알수있다.

 

 

다시보면

 

경우 1은 aaabbbcccdddeeefffggg..... 모든 상태가 균일하므로 불순도가 크므로 엔트로피가 크지만

 

경우 2는 aaaaaaaaaaaaaaaaaabbbbbbbccccddefg같이 불균일하게 되면서 경우 1보다 불순도가 떨어져 엔트로피가 작다

 

 

 

 

 

 

 

 

 

엔트로피로 보는 코드 스트링 해독

 

 

상태 값들을 보내는 경우를 생각해보자 8가지의 경우가 존재하므로 3비트 수를 사용하면 좋을것 같지만,

 

경우 2는 비균일 분포를 따르고 있으므로 많이 발생하는 경우 짧은 코드를 사용하도록하면

 

전체 코드 길이를 줄일수 있는 장점이 생기게 된다.

 

{a, b, c, d, e, f, g, h}를

 

0, 10, 110, 1110, 111100, 111101, 111110, 111111라는 코드 스트링으로 나타내자

 

통신을통해 보내지는 코드의 평균 길이는

 

확률 변수의 엔트로피와 동일한 값을 가지게 된다.

 

여기서 주의해야하는건 이보다 짧은 코드 스트링을 사용해선 안되는데,

 

연결된 문자열을 부분 부분으로 나눌때, 차이를 구분해야하기 때문이다.

 

11001110의 경우 110, 0, 1110으로 나누어서 보면 cad로 해독할수 있겠다.

 

 

엔트로피와 최단 코드 길이는 동일한 것으로 볼수 있는데,

 

노이즈리스 코딩 이론에 따르면 엔트로피는 확률 변수 상태들을 전송하는데 필요한 비트 수의 하한이라 할수있다.

 

 

 

 

 

 

 

다중성 multiplicity와 엔트로피

 

지금까지 정보의 평균 양으로서 엔트로피를 살펴봤는데,

 

엔트로피라는 개념은 물리학의 평형 열역학에서 소개되었으며, 이후 통계 분야의 불순도 척도로서 사용되었다.

 

이제 엔트로피를 몇개의 구간으로 나눌수 있는 N개의 동일한 객체들로서 엔트로피를 살펴보자

 

객체들을 일정 구간으로 나누는 방법의 수를 생각해보자,

 

첫번째 물체를 선택할때 N가지의 경우, 두번째 물체의 경우 (N - 1)의 경우

 

천체 N개의 물체들을 구간화하기위한 전체 경우의 수는 N!가 되겠다.

 

 

하지만 물체들을 각 구간별로 구분시키고 싶지 않다면,  i번째 구간에 n_i!가지의 정렬하는 경우가 있다고 치고

 

전체 N개의 물체를 구간별로 배정하는 방법의 수는 아래와 같이 구할수 있으며

 

이를 다중성 multiplicity라 부른다.

 

 

엔트로피는 적절한 상수로 조정된 다중성의 로그로 정의된다.

 

 

 

여기서 N이 무한대로 된다면 n_i/N은 특정 값으로 수렴이되고, Stirling의 근사를 적용하면

 

아래의 엔트로피에 관한 식을 얻게 된다.

 

 

 

이로부터 상태 x_i를 이산 확률 변수 X의 구간으로 볼수 있으며, p(X = x_i) = p_i가 되고

 

확률 변수 X의 엔트로피는 아래와 같이 정의가 되겠다.

 

 

뾰족하게 생긴 p(x_i)에 대한 분포는 작은 엔트로피(불순도가 작음=타 경우의 확률이 적음)값을 가지며,

 

반대로 높은 엔트로피의 값을 가지는 경우(불순도가 큼=타 경우가 자주발생) 확률 변수의 분포는 균일한 형태를 가지게 된다.

 

300x250
728x90

결정 이론 개요

 

지난번에

 

확률 이론이 불확실성을 수치화 해서 다루는 수학적 기반으로 사용된다고 알아봤고

 

이번에는 확률 이론에 기반한 결정 이론에 대하여 살펴보겠다.

 

결정 이론은 주어진 불확실한 상황에서 어떻게 최적의 결정을 할수 있게 만드는지에 대한 학문이라 할수있다.

 

 

입력 벡터 x와 타겟 벡터 t가 주어지고, 우리는 새로운 x가 입력될때 t를 예측해야한다고 하자

 

회귀 문제에서 t는 연속 변수이고, 분류 문제에서 타겟벡터 t는 클래스의 카테고리, 라벨같은것을 의미한다.

 

 

결합 확률 분포 p(x, t)는 이러한 변수들 사이 불확실성을 완전히 정리해주는데

 

훈련 데이터 셋으로 구한 결합 확률 분포 p(x, t)의 결정식을 구하는 것이

 

확률적 추론이며, 앞으로 다루고자 하는 내용이라 할수 있다.

 

여기서 중요한점은 t를 예측하는 과정이 너무 과적합이 아닌 일반화 될수있어야 하는데

 

이게 결정 이론의 핵심이라 할수 있겠다.

 

 

 

 

 

의학 진단으로 보는 결정 이론 : 환자의 X ray 영상으로 이 환자가 암이 있는가 없는가? 판단하기

 

결정 이론을 다루는 예시로

 

환자의 Xray 영상이 있는데, 이 영상으로 환자가 암인지 아닌지 판단하여야 한다.

 

이때 입력 벡터 X는 이미지 픽셀들로 이루어지고

 

t는 암의 존재여부 그러니까 이진 클래스로 주어지겠다.(암이면 1, 암이 아니면 0인 식으로)

 

앞으로 라벨 값을 선택하는데 확률 모델이 어떻게 유용한지 알아보겠다.

 

 

일반적인 추론 문제에서는 결합 확률 분포 p(x, t)를  다루게 되는데

 

주어진 상황을 고려하여 최적의 선택을 하는, 환자 여부를 선택하는 것이 결정이며

 

결정 이론은 주어진 확률들에 기반하여 얼마나 최적의 결정을 했는지를 알려준다.

 

 

 

아무튼 우리가 해야할 건 이미지 x가 주어졌을때 클래스에 대한 확률(사후확률)을 구하여야 한다.

 

이를 베이즈 정로로 표현 하면 다음과 같다.

 

 

여기서 우리가 해야할 일은 

 

 

x ray 정보가 주어졌을때 오분류 하는 경우를 최소화 시켜야 한다.

 

 

 

 

오분류 최소화 하기

 

아무튼 우리가 해여할 일은 x가 주어졌을 때 가능한 클래스 들중 하나를 선택하는 결정규칙 decision rule이 필요하다.

 

결정 규칙은 입력 공간을 결정 영역 R_k로 분할시키는데, 각 결정영역에는 클래스 C_k가 주어진다.

 

결정 영역 decision region 사이의 경계를 결정 경계 decision boundary, 결정 표면 decision surface라 부른다.

 

최적의 결정 규칙을 찾기위해 암 여부 판단 문제로 한번 보자

 

실수가 일어날 확률을 아래와 같이 정리할수 있다.

 

 

이제 우리가 할일은 오류 확률을 최소화 하는 결정 규칙을 구하면 되는데

 

실수를 최소화 시킨다는 말은

 

올바르게 분류하는 사후확률을 구한다는 말이기도 하다.

 

K개 클래스로 일반화 해서 본다면 x가 주어질때, 각각의 p(x, C_k)가 가장 커지는 결정 영역을 구하면 된다.

 

 

 

P(x, C_k)는 확률의 곱 법칙에 따라 x가 주어질때 C_k에 대한 사후확률과 p(x)로 분해할수 있고

 

결국에는 가장 큰 사후확률을 찾는 문재가 된다.

 

 

암을 판별하는 이진 분류 문제를 그림으로 표현하면

 

정분류율읠  최대화 하는 결정 경계는 아래와 같이 x0라 할수 있다.

 

 

 

 

 

 

 

기대 손실 최소화하기

 

실제로 사용하기 위해선, 오분류율을 줄이는 단순한 문제보다 복잡한 문제들을 다루어야 한다.

 

다시 암 진단 문제를 다시 생각해보자

 

암이 없는 환자를 암이 있다고 오판하는 경우(1)보다

 

암이 있는데 없다고 판단하는 경우(2)가 위험이 매우 크다.

 

 

(1)에 의한 손실보다는 (2)에 의한 손실을 줄이는게 더 나으므로

 

이를 수식화 하기 위한 개념으로 손실 함수 loss function, 비용함수 cost function가 있으며

 

이 손실 함수는 결정에 따른 손실, 손해의 척도로 사용된다.

 

 

 

입력 x가 주어졌을때, 실제 클래스가 C_k이지만 C_j로 잘못 분류한 경우가 있다 하고,

 

이때 손실을 L_kj라고 표기하고 여기서 k와 j는 나중에 나올 손실 행렬의 원소로 보자.

 

 

 

아래의 그림은 암 판별 문제의 손실 행렬을 보여주고 있는데,

 

건강한 사람이 암으로 판단된경우 손실은 1이고, 반대로 암 환자가 정상으로 판별한 경우 손실은 1000이다.

 

 

최적해 optimal solution은 손실 함수를 최소화 시켜서 구할수 있지만

 

손실 함수는 우리가 실제로는 알수 없는 진짜 클래스에 의존하는게 문제다.

 

 

입력 벡터 x가 주어질때 실제 클래스에 대한 불확실성은 결합 확률 분포 p(x, C_k)로 나타낼수 있으니

 

이 분포에 대한 평균 손실을 최소화 하는 방향을 사용하여야 한다.

 

다시 정리하면, 기대 손실(위의 식)을 최소화하는 결정 영역 R_j들을 구하여야 한다.

 

적분항 내부 결합 확률 분포는 확률 곱의 법칙에 따라

 

아래와 같이 분해할수 있고,

 

p(x)는 제거하면

 

기대 손실을 최소화 하는 결정 규칙은 새 입력 x가 j에 속하는 경우 아래의 식과 같다.

 

 

 

 

암 판별 문제의 기대 손실은 정리해보면 아래와 같다.

 

손실 행렬에 의해 암인데 정상으로 판단되는 부분에 큰 가중치를 주고,

 

정상인데 암으로 판단하는 경우 적은 가중치를 줌으로서

 

암을 정상으로 판단하는 경우를 크게 줄일수 있는 방향으로 결정 영역을 찾게 된다.

 

 

 

 

 

회귀 문제와 비용함수

 

지금까지 분류 문제를 다루기 위해 결정 이론을 살펴보았고

 

이제 회귀 문제에 적용해보자

 

앞에서 입력 x가 주어질때 추정자 y(x)로 t를 추정해 왔었다

 

이를 비용 함수로 나타내면 L(t, y(x))가 되는데,

 

이를 기대 손실로 나타내면 아래와 같다.

 

 

 

 

회귀 문제에서 비용 함수는 일반적으로 손실의 제곱을 많이 사용하는데

 

그러면 기대 손실을 아래와 같이 고칠수 있겠다.

 

 

이제 할일은 기대 손실 E(L)을 최소화 하는 y(x)를 구하면 되겠다.

 

기대 손실 E(L)을 y(x)에 대해 편미분할수 있는데

 

 

확률의 하브 곱 법칙으로 y(x)에 대한 해를 구할수 있다.

 

이 식은 x가 주어질때 t의 기대값으로 회귀 함수라 한다.

 

 

300x250
728x90

지난번에 커브피팅하는 방법을 오차 최소화 함으로써 구해보았는데

 

이번에는 확률론적인 관점에서 보자

 

입력 벡터 x, 계수 벡터 w, 그리고 정밀도 파라미터 beta가 주어질때,

 

타겟 벡터 t에 대한 확률이 가우시안 분포를 따른다면 아래와 같이 정리할수 있다.

 

위 식에서 beta는 정밀도 계수인데

 

베타의 역수가 정규분포의 분산이 된다.

 

정밀도가 1에 가까우면 정규분포의 분산이 줄어들고

 

정밀도가 0에 가까우면 정규분포의 분산이 커지게 된다.

 

 

 

이제 훈련 데이터 x, t가 주어질떄 최대가능도법으로 다항 계수 벡터 w와 정밀도 베타를 구해보자

 

우선 가능도 함수를 정의하고,

 

이 가능도 함수를 음의 로그변환을 시켜주면 아래와 같다.

 

 

이전에 했던방법대로

 

훈련 데이터 x, t가 주어질때 오차를 최소화 하는 다항 계수 벡터와 베타를 구할수 있는데

 

베타 최대 가능도 추정량은 경우 다음과 같이 정리할수 있다.

 

 

 

이제 다항 계수 벡터 w와 정밀도 beta의 최대 가능도 추정량을 구하였으므로

 

새로운 데이터 x가 주어질때 다항 회귀 값인 t를 추정하는 확률 모델(가능도 함수)를 구할수 있는데

 

이 모델은 단순이 첨추정할뿐만이 아니라 확률 분포를 알려주는 예측 분포 predictive distribution라고 부르겠다.

 

 

 

베이지안 방법을 하기 위해서

 

다항 회귀 계수에 대한 사전 확률 분포를 정의하면 

 

아래와 같은데, 여기서 알파값은 이 분포의 정밀도로 직접 조절하는 값 하이퍼 파라미터라 부른다.

 

베이즈 정리를 이용해서 w에 대한 사후확률 분포는 

 

아래와 같이 가능도 확률 모델과 사전 확률 분포의 곱으로 정의하여 구하며,

 

학습 데이터 x, t와 하이퍼 파라미터 알파 베타가 주어졌을때

 

가장 가능성 있는 w에 대한 사후확률 분포를 구하는것을 사후확률 최대화 방법 MAP라 부른다.

 

 

300x250
728x90

x가 열린 구간 (a, b)에 속하는 경우에 대한 확률

 

확률 p(x)이 전체 구간에 대한 합

 

누적 확률 분포 함수 P(z)

 

두 확률 변수 x, y의 합. 베이즈 정리를 이용한

 

확률 분포 함수 p(x)를 따르는 일련의 함수 값 f가 주어질때 기대값

 

조건부 확률의 기대값

 

일련의 함수 f에 대한 확률 분포 

두 확률 변수와 두 벡터에 대한 공분산

 

 

 

 

베이즈 정리

 

관측 데이터 벡터 D와 확률 분포의 모수 W 사전 확률 분포 P(W)가 주어질때

 

아래의 관계를 가짐

 

사후 확률 = 가능도 x 사전 확률

 

 

 

빈도론적 관점과 베이지안적 관점

 

빈도론적 관점과 베이지안 관점에서 가능도 함수 p(D|w)는 매우 중요한데,

 

빈도론자는 추정기 estimator의 파라미터인 w는 변하지 않으며 오차를 데이터 셋의 분포라 보고,

 

베이지안은 주어진 데이터에 대한 모수의 불확실성을 w에 대한 확률분포로 나타낼수 있다고 한다.

 

 

 

최대 가능도 방법 maximum likelihood method

 

가장 널리 사용되는 빈도주의적 점 추정 방법으로 최대 가능도 방법이 있는데

 

가능도 함수 p(D|w)를 최대화 하는 계수벡터 w를 구하는 것이다.

 

이미 관측된 데이터 셋 D이 있으니 다양한 계수 벡터 w 중에서

 

최대 가능도 함수 argmax[p(D|w)] = w를 찾게 된다.

 

ref : throwexception.tistory.com/956

 

 

코인던지기로 보는 베이지안과 빈도론자의 차이

 

베이지안의 장점은 사전확률을 활용한다는 점인데

 

다음 실험을 통해 살펴보면

 

3개의 동전을 던지는 실험을 했을때, 세 동전다 앞면이 나왔다.

* D = [1, 1, 1]

 

이 경우, 빈도주의적 방법인 최대 가능도 추정법을 이용하면 앞으로의 추정확률은 1이 된다.

 

하지만 실제로는 계속 1이 나올리가 없으며,

 

베이지안의 관점에서는 기존의 실험에서 계속 1이 나왔으므로(사전 확률),

 

이후 1이 나올 확률(사후 확률)은 크게 줄어든다.

 

 

 

 

 

베이지안 관점의 한계

 

사전 확률을 믿음도로 구하기 보다는 수학적으로 편한것으로 고르거나

 

사전 확률을 잘못 구한 경우 좋지 못한 결과를 얻으며

 

이론 자체는 18세기에 나왔지만 가능한 전체 모수 공간을 주변화해서 다루기는 힘들어

 

실제 응용할 수가 없었다.

 

하지만 마르코브 체인 몬테카를로 방법같은 샘플링 방법들이 나오고,

 

컴퓨터의 계산 속도와 매모리 공간이 커짐에 따라 베이지안 기법이 사용할수 있게 되었음.

 

 

 

 

 

 

 

가우시안 분포 Guassian distribution

 

정규 분포라고도 부르며, 정규 분포를 따르는 확률 변수 x에 대한 확률 밀도 함수는

 

기대값과 2차 모멘트를 이용하여 분산을 구할 수 있음

 

 

D 차원 가우시안 분포는 아래와 같이 정리하며

 

|시그마|는 분산 행렬의 결정식

 

 

 

 

 

 

 

최대 가능도 법으로 가우시안 분포의 모수 추정하기

 

다음과 같이 관측 벡터 x가 주어질때

 

가능도 함수는 아래와 같으며

가능도 함수를 최대화 하는 모수를 찾아야 한다.

최대 가능도 함수를 음의 로그 변환을 수행한 후

각 모수에 대해 미분하여 가장 가능성이 높은 모수들을 구하자

 

 

 

 

최대 가능도법의 한계

 

방금 단변수 가우시안 분포에 대해 최대 가능도 법으로 모수를 추정하였지만

 

이 방법에는 분산을 저평가 한다는 문제점이 있습니다.

 

추정 평균과 추정 분산의 기대값은 아래와 같은데,

 

추정 평균의 기대값은 모평균을 동일하지만

 

추정 분산의 기대값은 (N - 1)/N * 모 분산으로 실제 분산보다 작아지는 현상이 발생합니다. 

 

위 결과는 표본 분산으로부터 계산해서 얻을 수 있습니다.

* 표본 분산의 기대값은 모분산이므로.

 

 

주어진 정규분포로 부터 취득한 3개의 샘플 데이터로 추정한 평균과 분산인데

 

3가지 결과 다 모분산보다 추정 분산이 작게 나올수 밖에 없습니다.

 

 

 

300x250
728x90

데이터로 부터 패턴을 찾는 것은 오랫동안 연구되어온 문제인데,

 

대표적인 예시로 숫자 이미지로부터 이미지에 나온 수가 몇인지 분류하는 것이 있다.

 

입력 데이터로부터 분류를 하거나 회귀를 하는 패턴 인식 모델은

 

훈련 데이터 셋과 타겟 벡터로 훈련하여

 

새로운 입력 데이터를 분류 할 수 있게 된다.

 

 

 

 

 

커브 피팅 curve fitting(polynomial regression)을 하는 경우를 예로 들어보자

 

아래와 같이 입력 벡터 x와 타겟 벡터 t, 다항 계수 벡터 w가 있으며,

 

y는 입력 벡터 x와 다항 계수 벡터 w의 선형 결합으로 구한다.

 

이때 M은 다항식의 차수이며, M이 1인경우 선형 모델이라 부른다.

 

훈련 입력 벡터 x와 훈련 타겟 벡터 t를 이용하여 최적의 다항 계수 벡터를 구하면

 

새로운 입력 x_hat이 주어질때 이에 대한 예측 결과인 t_hat을 구할 수 있게 된다.

 

 

 

 

 

최적의 다항 계수 벡터 w를 구하는 방법은

 

오차 함수를 활용하면 된다.

 

오차 함수는 오차(실제 값과 타겟 값의 차이) 제곱 합으로 나타내며

 

 

 

이 오차 제곱합을 최소화 시키는 다항 계수 벡터 w*가 다항 회귀식의 최적 계수가 된다.

 

다항식의 차수에 따라 다항 회귀식은 다음과 같이 다양한 형태를 띌 수 있다.

 

차수가 0, 1인 경우 주어진 다항식을 잘 적합하지 못하고 있으나

 

차수가 3일때는 실제 다항식과 가장 유사한 형태를 띈다.

 

하지만 차수가 과하게 커진 경우 주어진 데이터에만 맞춰전 과적합 문제가 발생하게 된다.

 

 

 

 

 

과적합 over fitting 문제를 피하는 방법으로

 

규제 적용 regularization 이 있는데

 

비용함수에 패널티항을 추가하면 된다.

 

 

규제항의 람다는 얼마나 다항식 계수 벡터의 노름(벡터의 크기)에 가중치를 줄것인가를 의미하는데

 

람다가 작으면 제곱합 오차가 크게 반영이되고,

 

람다가 크다면 제곱합 오차가 상대적으로 적게 반영이 된다.

 

그런데 패널티가 부여된 비용함수를 최소화 시키는 W*를 찾아야 하므로 

 

람다가 클 수록 계수 벡터의 가중이 커지니 가능한 작은 W*을 찾고,

 

람다가 작은 경우 계수 벡터의 가중이 작으니 보다 큰 W*를 찾게 된다.

 

이 L2 규제의 가중치 값인 람다를 조정함으로서 모델 복잡도에 의한 과적합 문제를 완화 시킬수 있게 된다.

 

 

 

 

 

 

300x250
728x90

이미지 히스토그램

 

명암값을 x축, 명암의 빈도수를 y축으로 하는 히스토그램을 말한다

 

 

대충 아래와 같이 4 x 4 영상이 주어질때

 

 

위 영상의 히스토그램은 아래와 같이 구할수 있다.

 

 

정규화 히스토그램 normalized histogram의 경우

 

모든 픽셀의 명암 값의 합이 1이 되도록 하는 히스토그램으로

 

위 히스토그램의 값을 전체 크기(y * x) 만큼 나누어 주면 된다.

 

 

 

 

 

히스토그램 활용 용도

 

- 영상 특성 파악

 

- 평활화로 품질 개선

 

- 역투영을 통한 얼굴 검출방법

* 색상만을 활용하여 검출하는 방법으로 그다지 좋지 못함.

 

 

 

 

 

 

 

히스토그램으로 영상 특성 파악하기

 

첫번째 영상의 경우

 

밝은 부분과 어두운 부분으로 이분화 할수 있어 히스토그램 상에 봉우리가 2개가 나타남.

 

두번째 영상은 

 

시장에서 다양한 밝기 값들이 존재하다보니 고르게 분포된 양상을 보임

 

마지막 영상은

 

달 부분이 밝으나 매우 적고, 대부분 어두운 값이 차지하여 50 부근으로 가장 큰 빈도수를 가지고 있음.

 

import cv2
import matplotlib.pyplot as plt

dark_night = cv2.imread("./res/dark_night.jpg")
market = cv2.imread("./res/conventional_market.jpg")
moon = cv2.imread("./res/moon.jpg")

imgs = [dark_night, market, moon]

figure, axs = plt.subplots(figsize=(16, 16), nrows=3, ncols=3)
width, height = 400, 400

for i in range(3):
    resize = cv2.resize(imgs[i], dsize=(width, height))
    rgb = cv2.cvtColor(resize, cv2.COLOR_BGR2RGB)
    gray = cv2.cvtColor(resize, cv2.COLOR_RGB2GRAY)
    hist = cv2.calcHist(gray,[0],None,[256],[0,256])

    axs[i, 0].imshow(rgb)
    axs[i, 1].imshow(gray, cmap="gray")
    axs[i, 2].plot(hist)

plt.tight_layout()

 

 

 

 

 

 

히스토그램 평활화 histogram equalization를 통한 품질 개선 

 

위의 첫번째 그림과 같이

 

히스토그램 상에 명암 값이 한 쪽으로 치우쳐 진 경우

 

비슷한 명암을 가진 물체끼리 구분하기 어려운데

 

치우쳐진 명암 분포를 고르게 해주는 방법입니다.

 

 

 

 

아래와 같이 어두운 영상의 경우

 

잘 안보이는 부분이 많지만

 

히스토그램 평활화를 통해 개선 시킬수 있습니다.

 

 

 

 

 

 

 

위 이미지의 히스토그램을 보면

 

명암 분포가 낮은 곳 위주로 분포하고 있지만

 

 

 

히스토그램 평활화를 수행하여

 

명암 분포가 고르게 분포해지면

 

어두운 영역이 밝아져 선형하게 알아볼수 있게 됩니다.

 

 

joker = cv2.imread("./res/joker.jpg")
resize = cv2.resize(joker, dsize=(width, height))
rgb = cv2.cvtColor(resize, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(resize, cv2.COLOR_RGB2GRAY)
hist = cv2.calcHist(gray,[0],None,[256],[0,256])
equ = cv2.equalizeHist(gray)
equ_hist = cv2.calcHist(equ,[0],None,[256],[0,256])



figure, axs = plt.subplots(figsize=(16,16),ncols=2, nrows=2)
axs[0, 0].imshow(gray, cmap="gray")
axs[0, 1].plot(hist)
axs[1, 0].imshow(equ, cmap="gray")
axs[1, 1].plot(equ_hist)
plt.tight_layout()

 

 

 

300x250
728x90

눈과 카메라의 영상 취득 원리 비교

 

눈을 통한 영상 취득

1. 눈으로 빛이 들어옴

2. 수정체에 빛이 굴절됨

3. 망막에 상이 맺힘

 

카메라의 영상 취득

1. 카메라로 빛이 들어옴

2. 렌즈를 통해 빛이 굴절됨

3. 필름에 상이 맺힘

- 이 필름 역활을 하는 센서로 대표적으로 CCD 센서와 CMOS 센서가 있음

 

 

 

 

 

핀홀 카메라로 보는 이미지 영상 취득 과정

 

영상 취득 과정을 설명하기 위해 일반적으로 가장 간단한 핀홀 카메라 모델의 예시로 설명하는 경우가 많음.

 

핀홀 카메라는 아래의 그림과 같이 핀홀을 통해 사물이 필름 상에 반대로 상이 맺히는 카메라를 말함.

 

여기서 필름이 보이는 평면 공간이 이미지 평면이 됨.

 

1. 필름, 이미지 센서, 이미지 평면 위에 상이 맺힘

 

 

https://ksimek.github.io/pinhole_camera_diagram/

 

 

 

2. 이미지 평면에 맺힌 상을 일정 구간 간격으로 샘플링 하고,

 

 

3. 연속적이던 상을 이산적인 값으로 양자화 시킴

 

4. 디지털화 된 영상은 다음과 같은 이차원 형태가 되며, 각 픽셀의 값은 밝기를 의미함

 

http://assets.runemadsen.com/classes/programming-design-systems/pixels/index.html

 

 

 

아날로그 신호를 디지털 신호로 변화

- 위의 아날로그 이미지가 디지털화되는 과정을 아래의 그림을 참고

 

https://ddka.tistory.com/entry/%EC%95%84%EB%82%A0%EB%A1%9C%EA%B7%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EB%94%94%EC%A7%80%ED%84%B8-%EC%8B%A0%ED%98%B8%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0

 

 

 

 

핀홀 카메라로 보는 카메라 파라미터

 

모든 카메라는 고유의 특성을 나타내는 파라미터 값을 가지고 있음.

 

아무리 똑같은 제품이라 해도 아주 정밀하게 보면 렌즈와 센서 사이 거리와 같은 것들이 전부 동일하지 않기 때문.

 

대표적으로

 

카메라들은 렌즈와 이미지 센서 사이의 거리(초점거리 focal length)

 

이미지 센서의 틀어진 정도(주점 principal point)

 

이미지 센서가 기울어진 정도(비대칭 계수 skew coefficient) 등이 있음.

 

이들을 카메라 내부 파라미터 intrinsic parameter라 부르고

 

내부 파라미터 외에 외부 세계 좌표계 world coordinate와 카메라 좌표계 camera coordinate 사이의 관계를 설명하는

 

외부 파라미터 external parameter가 있는데 이에 대한 내용은 나중에

 

다크 프로그래머 님의 블로그 상에 카메라 파라미터에 대해 자세하게 설명이 되어있다.

ref : darkpgmr.tistory.com/32

 

 

 

기본 핀홀 카메라 모델에서 보면

ksimek.github.io/pinhole_camera_diagram/

핀홀(광학 중심)으로부터 이미지 평면 까지의 거리가

 

초점 거리 focal length라 부른다.

핀홀을 통하는 직선과, 이미지 평면을 수직으로 만나는 점을

 

주점 principal point라 부르는데,

 

기본 카메라 모델에서

 

주점의 오프셋은 (0,0)으로 생각한다.

 

하지만 실제 카메라에서

 

이미지 센서, 이미지 평면은 조금 y, x 방향으로 틀어져 있기 때문에

 

(0, 0)이 아닌 오프셋 값을 가지고 있다.

 

 

이와 같은 카메라 파라미터를 구하여 카메라 왜곡을 보정하는 작업을

 

카메라 캘리브레이션이라 부른다.

 

 

 

 

3차원 공간에서 보면

 

외부 공간에서 점 Pw는 

 

광학 중심 Optical center를 지나

 

이미지 평면 I의 P에 맺히게 된다.

 

 

 

핀홀 카메라 관련 용어 정리

 

https://gamedev.net/forums/topic/692041-focal-point-question-computer-graphic/5355956/

 

 

 

 

300x250
728x90

얼마 전까지

 

컴퓨터 비전 알고리즘 구현위주로 하고 있었지만

 

이미 구현된 알고리즘을 연습 삼아서 직접 해보는 것은 괜찬았지만

 

어디까지 구현할것인가 범위를 생각하지 않고

 

생각 나는 알고리즘들을 구현하는 것은 너무 많은 시간이 걸렸고

 

넘파이나 사이파이와 같은 라이브러리에 노하우가 부족한 상태에서는 너무 힘든 일이었다.

 

 

그래서 컴퓨터 비전을 다시 정리해볼까 싶었지만

 

이전에 정리한 내용이 있는데 굳이 똑같은 내용을 정리하는건 시간낭비안것 같아

 

대신 이번에는

 

기존의 컴퓨터 비전 이론과 opencv를 이용한 활용, 그리고 패턴 인식 기법에 대한 내용들을 같이 정리해보고자한다.

 

 

내가 복습 하고 싶은 부분들은 복습하고, 넘어가고자 하는 부분은 넘어가고

 

구현할 부분들은 구현, 패턴 인식 관련 내용들 추가해보자

 

 

 

300x250
728x90

선형 판별 분석 LDA : Linear Discriminant Analysis

- PCA와 마찬가지로 차원 축소 기법

- 클래스간 분산을 최대화, 클래스 내부 분산을 최소화 하는 선형 결정식을 찾음

 

- 클래스 별 중심점과 공분산이 주어질떄 클래스간 분산과 클래스내 분산을 구할수 있음

- 클래스내 분산 행렬과 클래스간 분산 행렬로부터 고유 값과 고유벡터를 추출할수 있음.

- 고유 값은 비중, 고유 벡터는 클래스 내 분산을 최소, 클래스간 분산을 최대로 하는 선형 판별식의 계수

 

 

 

 

붓꽃 데이터에 선형 판별 분석 적용하기

 

PCA는 반응 변수가 필요없는 비지도 학습이지만

 

LDA는 반응 변수 종속 변수가 필요한 지도 학습 알고리즘

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

iris = load_iris()
iris_scaled = StandardScaler().fit_transform(iris.data)
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(X=iris.data, y=iris.target)
iris_lda = lda.transform(iris_scaled)
print(iris_lda.shape)

 

 

선형 판별 분석을 통해

 

차원수, 독립변수를 2개로 줄였음에도

 

클래스 간 분산이 최대, 클래스 내 분산이 최소가 되도록 변환 된 것을 볼수 있음

 

lda_cols = ["lda_1", "lda_2"]
df = pd.DataFrame(data=iris_lda, columns=lda_cols)
df["target"] = iris.target

markers=["^", "s", "o"]

for i, marker in enumerate(markers):
    x_data = df[df["target"]==i]["lda_1"]
    y_data = df[df["target"]==i]["lda_2"]
    plt.scatter(x_data, y_data, marker=marker, label=iris.target_names[i])

plt.legend(loc="upper right")
plt.xlabel("lda_1")
plt.ylabel("lda_2")
plt.show()

 

 

 

300x250
728x90

uci에서 제공하는 신용 카드 데이터에 PCA를 적용하여 연체 여부를 판단해보자

 

archive.ics.uci.edu/ml/datasets/default+of+credit+card+clients

 

 

이 데이터의 반응 변수로 연체 여부인데 1이면 연체, 0이면 연체 아님

 

 

데이터를 로드하긴 했는데

 

실제 컬럼 이름이 ID 행으로 빠져나와 있다.

 

ID 행의 컬럼 이름들을 다시 컬럼으로 바꿔주자

 

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

#df = pd.read_csv("./res/credit-card-fraud-detection/creditcard.csv")
df = pd.read_excel("./credit_card.xls", sheet_name="Data")
df.head()

 

 

 

0번째 행들의 값으로 컬럼 명을 바꾸고,

 

인덱스 ID 행을 제거

 

 

cols = df.iloc[0,:].values
df.columns = cols
df.drop(index="ID", axis=0, inplace=True)
df.head()

 

 

 

다음달 연체 여부는 이름을

 

default로 줄여주고, pay0은 pay1로 바꾸자

 

df.rename(columns={"PAY_0":"PAY_1", "default payment next month":"default"}, inplace=True)
df.head()

 

PCA 에 앞서

 

상관 계수 행렬로 히트맵을 그리려고하는데

 

corr()이 반환이 안된다.

y = df["default"]
X = df.drop(columns="default", axis=1, inplace=False)

corr = X.corr()
sns.heatmap(corr, annot=True)

 

 

데이터 타입을 보니 다 문자열 처리가 된듯하다

 

가능한 데이터는 수로 바꾸어줘야겟다

 

 

 

float으로 바꿔주고

 

 

 

 

 

히트맵을 살펴보면

 

BILL_AMT1 ~ 6까지는 모두 상관관계가 0.8 이상으로 강한 선형적 관계를 보인다.

 

다중공선성 문제를 해결하기 위해

 

차원 축소를 해주자.

 

y = df["default"]
X = df.drop(columns="default", axis=1, inplace=False)

corr = X.corr()

plt.figure(figsize=(14,14))
sns.heatmap(corr, annot=True)

 

 

BILL_AMT1 ~ 6 6개 속성들을 추출하여

 

표준화 후 주성분 2개로 주성분 분석을 한 결과

 

2개의 주성분 요소 만으로도 95%정도의 설명력을 가짐

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

cols_bill = ["BILL_AMT" + str(i) for i in range(1, 7)]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X[cols_bill])
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(pca.explained_variance_ratio_)

 

 

원본 데이터셋과 PCA 적용 데이터셋의 랜덤 포레스트 성능을 비교해보자

 

기존 데이터셋의 경우 81% 였으나 pca를 통해 6개의 주성분 만으로 79%의 성능을 보임

 

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score

rf = RandomForestRegressor()
scores = cross_val_score(rf, X, y, cv=5, scoring="accuracy", n_jobs=-1)
print("normal dataset : {0:.3f}".format(np.mean(scores)))
rf = RandomForestRegressor()
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
pca = PCA(n_components=6)
X_pca = pca.fit_transform(X_scaled)
scores = cross_val_score(rf, X_pca, y, scoring="accuracy", cv=5, n_jobs=-1)
print("pca dataset : {0:.3f}".format(np.mean(scores)))

 

 

300x250

+ Recent posts