본문 바로가기

보안/프로그램

PARI / GP 를 사용한 빅데이터 연산 : Logistic Regression을 사용한 악성코드 분석




1. Linear Regression 란?


하나 이상의 독립변수로부터 종속변수의 값을 선형으로 모델링하는 것. 로지스틱회귀분석은 분석하고자 하는 대상들이 두 집단 혹은 그 이상의 집단(다변수 데이터)으로 나누어진 경우에 개별 관측치들이 어느 집단으로 분류될 수 있는가를 분석하고 이를 예측하는 모형을 개발하는데사용되는 대표적인 통계 알고리즘 이다.


ex) X축, y축 평면이 있을 때 우리가 찾고 싶은 직선은 어느 어느 한 직선을 정했을 때 그 직선과 각 점 간의 거리의 합이 가장 짧은 직선의 방정식이다. 




2. matrix 란?


유명한 영화 중에 matrix 란 영화가 있다. 이 영화 제목 matrix 의 뜻은 자궁이란 뜻과 행렬이란 뜻이 존재한다. 영화의 내용을 보면 가상세계에 들어가 목숨을 걸고 싸우는 내용인데 내용처럼 matrix는 숫자로 된 디지털 세계(행렬)와 가상세계를 품고 있는 자궁같은 폐쇄된 공간을 의미한다.

지금까지 많은 수학식이 증명을 위해 행렬을 사용해왔다. 




3. PARI/GP를 사용한 행렬 연산 예제


1) 2X2 행렬을 만들어본다.


 M = matrix(행, 열, 행에 대한 변수, 열에 대한 변수, 엔트리에 들어갈 함수)


위와 같은 패턴으로 행렬을 생성하면 된다.


만약 다음과 같이 행렬을 만들면


 M = matrix(2,2, i, j, i+j)


아래와 같은 결과를 볼 수 있다.




2) 랜덤한 값을 이용한 1000X1000 행렬 만들기


우선 행렬을 만들기 전에 메모리를 크게 늘려주어야 한다.


 allocatemem(10^9)




다음 1)에서 설명했던 방식으로 배열을 생성한다.


 M = matrix(1000,1000, i, j, random(10^10))




3) 역행렬 구하기


2X2 행렬을 만들고 역행렬을 구해본다.


우선 1)와 2)를 참고하여 랜덤한 값으로 2X2 행렬을 만든다.




역행렬을 만드는 방법은 다음과 같다.


 M^-1




분수가 매우 지저분해보이므로 분수를 소수로 바꾸어준다.


 1.0 * M^-1




소수점이 너무 길게 출력되므로 소수점이하 4자리만 출력되도록 설정해준다.


 \p 4




4. PARI/GP 행렬의 판별식과 대각선의 합


통계 프로그램 중에는 대표적으로 R 과 같은 프로그램이 있지만 여기서는 간단하게 PARI/GP 를 가지고 악성코드를 분석해볼 것이다. 


행렬의 곱셈의 규칙은 다음과 같다.



여기서 주의 점은 이 연산의 역은 성립하지 않는다는 것이다.

하지만 특이하게도 판별식은 AXB와 BXA와 동일하다.


중학교 때 배운 것이라 잊어먹을 수도 있지만

2X2 행렬의 판별식은 1/ad-bc이다 따라서 ad-bc가 0이 아니면 역행렬이 존재한다. 이처럼 판별식이 0이 아니면 이 행렬은 역행렬을 가지고 있음을 의미한다. 이때 이 판별식을 구하는 식이 matdet() 이다.



또 특이한 점은 왼쪽 위부터 오른쪽 아래까지의 대선의 합은 MXN 이나 NXM이나 동일하다는 점이다. 이때 함수 trace 를 사용해 행렬의 대각선의 합을 구할 수 있다.





대각선의 중심을 바꾸고 싶을 경우 ~(물결표시)를 이용하면 된다. 이를 transpose라 한다.




5. Logistic Regression 를사용해 악성코드 판별하기


결정을 할  때는 여러 요인을 보고 결정을 한다.

구매를 해야할때도..

병을 판별할 때도 의사는 암 환자인지 결정을 해주어야한다.

마케팅 또한 마찬가지.. 


여기서 판별을 하기 위해선 수집된 데이터가 필요한데 이때 수집된 데이터를 표현한 행렬을 predictor 이라 한다.

많으면 많을 수록 좋다 

지금은 16*16이지만 더 큰 수가 될 수도 있고 그럴 땐 빅데이터라 표현한다.

결과는 벡터 또는 행렬로 표현된다.


아래의 예는 스마트폰 구입시에 대한 의사결정이다.



이제 이런 악성코드를 엄청 많이 가지고 통계를 내어 악성코드임을 판단해본다.

악성코드 개수(10만개) * 판별방법(250) 개

라 가정해보면 판별방법을 뽑는게 매우 어렵고 중요하다. 

가중치를 주어야 하는데 주관적일 수 도 있고 객관적으로 값을 매겨야하기 때문이다.

예를 들어 0 1 또는 5까지 또는 소수만 줄 수 도 있다.





무수한 확률 분포 중 여기서는 logit 을 사용한다. 달라보이나 결국 정규분포랑 같다.




악성코드는 다음과 같은 방법으로 구할 수 있다





6. PARI/GP에서 Logistic Regression 를사용해 악성코드 판별하기


1) 시작하기전에 소수점크기와 메모리크기를 설정해준다.


 \p 4


 allocatemem(10^9)




2) 악성코드 개수와 결정인자의 수는 다음과 같다.


 - 수집한 악성코드는 n : 1000

 - 결정인자 m : 200




3) 원래 각 인자에 대한 점수가 있는데 이것은 랜덤한 값으로 준다. 


인자마다 가중치가 다 다른데 균등하게 0~5점까지 준다고 가정한다.


 X=matrix(n,m,i,j,random(5)*1.0); /* predictor */





4) 악성코드 이다 아니다 여부 또한 랜덤하게 정한다.


 y=matrix(n,1,i,j,random(2)*1.0); /* response = "1" or "0" */




5) 베타 = 계수를 구해준다.


 beta=((X~*X)^-1)*X~*y;





6) V = 새롭게 들어온 악성코드를 결정인자에 맞추어 값을 매긴다. 


 V=matrix(1,m,i,j,random(2)*1.0); /* trial */





7) 알파 = 계수와 측정한 값을 곱한 값을 구한다


 alpha=V*beta;





8) 확률을 구한다


 p=exp(alpha)/(1+exp(alpha)); /* logistic function */





9) 전체 평균을 구해본다


 y_bar=sum(i=1,n,y[i,]/n);





10) 전체 평균보다 크면 악성코드이다.


 if(p[1,1]>=y_bar[1], print("Malicious code!"))



 if(p[1,1]<y_bar[1], print("Good code!"))