[Python NumPy] 범용 함수(universal function) : (1-3) 지수함수(exponential function), 로그함수(logarithmic function)
Python 분석과 프로그래밍/Python 데이터 전처리 2017. 3. 12. 01:34이전 포스팅에서는
- 범용함수(universal function, ufuncs)의 정의 및 유형
(1) 1개의 배열에 대한 ufuncs (Unary universal functions) 중에서
- (1-1) 올림 및 내림 범용 함수 (rounding ufuncs)
- (1-2) 합(sums), 곱(products), 차분(difference), 기울기(gradient) 범용함수
들에 대해서 알아보았습니다.
이번 포스팅에서는 Unary ufuncs 중에서
- (1-3) 지수함수(exponential function), 로그함수 (logarithmic function)
에 대해서 알아보겠습니다.
고등학교 때 지수함수, 로그함수에 대해서 배웠을 텐데요, 기억이 가물가물 하신분들을 위해서 간단히 지수함수, 로그함수에 대해서 먼저 복기를 해본 후에 Python NumPy 의 지수함수, 로그함수 사용법으로 넘어가겠습니다.
지수함수(exponential function)는 아래 왼쪽의 그래프처럼 인 형태의 함수를 말합니다. 아래 [그림1] 왼쪽의 지수함수 예시 그래프는 지수함수의 그래프로서, (x=0, y=1), (x=1, y=2) 지점을 지나고 있습니다.
로그함수(logarithmic function)는 지수함수의 역함수(inverse function) 입니다. 즉, 아래 [그림1] 그래프의 예를 들자면원래 지수함수였던 의 역함수는 함수인데요, 이를 표기하기 편하도록 라고 하자고 약속을 한 것입니다. (밑이 '2'인 로그함수)
[그림1] 지수함수와 로그함수의 관계 및 그래프 예시
특히, 자연상수 e 를 밑으로 하는 로그함수를 자연로그(natural logarithm) 하며, 처럼 쓰기 보다는 보통 자연상수 e를 생략하고 그냥 혹은 로 쓰곤 합니다. 아래 [그림2] 그래프를 참고하세요.
(참고로, 자연상수 e 는 2.71828182846... 의 값을 가지는 무리수이며, 수학자의 이름을 따서 '오일러의 수(Euler's number)' 또는 '네이피어의 수(Napier's number)'라고도 함)
[그림2] 밑(base)이 자연상수 e 인 지수함수와 자연로그 함수 그래프
간단한 복기는 여기까지 하고요, 이제 Python NumPy의 지수함수, 로그함수에 대해 알아보겠습니다.
별것 없구요, 간단합니다. ^^'
(1-3-1) 지수함수 (exponential function) : np.exp() |
NumPy의 np.exp() 함수는 밑(base)이 자연상수 e 인 지수함수 로 변환해줍니다.
In [1]: import numpy as np In [2]: x = np.array([0.00001, 1, 2, 4, 10, 100]) In [3]: x Out[3]: array([ 1.00000000e-05, 1.00000000e+00, 2.00000000e+00, In [4]: np.exp(x) Out[4]: array([ 1.00001000e+00, 2.71828183e+00, 7.38905610e+00,
|
(1-3-2) 로그함수 (logarithmic function) : np.log(x), np.log10(x), np.log2(x), log1p(z) |
지수함수의 역함수인 로그함수는 밑이 자연상수 e, 혹은 10, 또는 2 이냐에 따라서 np.log(x), np.log10(x), np.log2(x) 를 구분해서 사용합니다.
# natural logarithm (base e)
In [5]: np.log(x) Out[5]: array([-11.51292546, 0. , 0.69314718, 1.38629436,
# log base 10 In [6]: np.log10(x) Out[6]: array([-5. , 0. , 0.30103 , 0.60205999, 1. , 2. ])
# log base 2 In [7]: np.log2(x) Out[7]: array([-16.60964047, 0. , 1. , 2. ,
|
로그함수의 경우 위의 [그림2]의 하단에 있는 자연로그 함수 그래프를 보면 알겠지만, x=0 인 경우 y가 -무한대(-infinite)의 값을 가집니다. 아래의 Out[9]번에 보면 NumPy 에 '0'이 포함된 배열을 np.log() 함수에 대입하면 'RuntimeWarning: divide by zero encountered in log' 라는 경고메시지가 뜨고, -inf 가 포함된 배열을 반환하게 됩니다. 이럴 때 사용하는 방법이 'x+1'을 해줘서 '0' -> '1' 로 바꿔주는 겁니다. np.log1p() 함수가 바로 이 역할을 해주는 함수입니다. 그러면 y값이 '-inf' -> '0'으로 바뀌게 되죠.
In [8]: z = np.array([0, 1.71828]) In [9]: np.log(z) C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\start_ipython_kernel.py:1: RuntimeWarning: divide by zero encountered in log # -*- coding: utf-8 -*- Out[9]: array([ -inf, 0.54132379])
# log(1+z) = np.log1p(z) In [10]: np.log1p(z) Out[10]: array([ 0. , 0.99999933])
|
물론 np.log1p() 함수를 안쓰고 그냥 np.log() 함수를 써서 아래처럼 np.log(1+z) 라고 해도 똑같은 결과를 얻을 수 있습니다.
In [11]: np.log(1+z) Out[11]: array([ 0. , 0.99999933])
|
그럼, 지수함수, 로그함수는 어디에 써먹는 건가 궁금할 것 같습니다.
한가지 예를 들자면 오른쪽으로 심하게 skewed된 멱함수(power law function) 분포를 띠는 데이터를 정규분포(normal distribution) 로 변환할 때 로그 변환 (log transformation)을 사용하곤 합니다.
자세한 내용은 오른쪽 포스팅 참고하세요. ☞ http://rfriend.tistory.com/53
여기서 끝내기 조금 아쉬우니 지수함수와 로그함수의 성질(properties of exponential and logarithmic function)도 복기해보겠습니다. 논문 읽다보면 지수함수와 로그함수의 성질을 알아야지 이해가 되는 공식 전개가 가끔씩 나오니 기억해두면 좋겠지요?! 증명은 생략합니다. ^^'
다음번 포스팅에서는 Unary ufuncs 의 네번째로 삼각함수(trigonometric functions)를 알아보겠습니다.
많은 도움 되었기를 바랍니다.