본문 바로가기

데이터 사이언스 공부

00. np.log와 np.log1p의 차이

np.log와 np.log1p는 둘 다 자연 로그(자연 상수 e를 밑으로 하는 로그)를 계산하는 함수이다.

 

하지만 이 두 함수는 방식과 주로 사용되는 상황이 다르다.

 

각각에 대해 알아보도록 하자.

 


 

1. np.log와 np.log1p의 차이

  • np.log(x): 이 함수는 주어진 값 x에 대해 자연 로그를 계산한다. 즉, ln⁡(x)를 구한다. 여기서 x는 양의 실수여야 한다. (x>0)
  • np.log1p(x): 이 함수는 1+x에 대한 자연 로그를 계산한다. 즉, ln⁡(1+x)을 구한다. 이 함수는 x가 매우 작은 값일 때 더 정확한 결과를 제공합니다. x가 작을수록 ln⁡(1+x)ln⁡(x)의 값은 거의 같지만, 작은 값에 대해 계산 시 np.log1p가 언더플로우나 부동소수점 오류를 방지할 수 있습니다.
import numpy as np
np.log(2)  # 2의 자연 로그 계산

import numpy as np
np.log1p(0.0000001)  # 1 + 0.0000001의 자연 로그 계산

 

 

2. 언더플로우 (Underflow)란?

언더플로우(Underflow)는 계산에서 매우 작은 수가 컴퓨터의 숫자 표현 범위보다 작을 때 발생하는 문제이다.

 

컴퓨터에서 숫자는 제한된 비트 수로 표현되기 때문에, 너무 작은 값은 표현할 수 없거나 0으로 처리된다.

 

예를 들어, 매우 작은 실수 (예: 10^{-308})를 처리할 때 이 값은 컴퓨터에서 0으로 인식될 수 있다.

 

이로 인해 계산에 오차가 발생하거나 예상치 못한 결과를 초래할 수 있다.

 

또한 자연 로그 함수는 ln(x)를 계산할 때 x가 매우 작은 값일 경우 ln(x) 값이 매우 큰 음수로 도출된다.

 

그러나 컴퓨터에서는 이 값이 너무 작아 0으로 표현되면 계산이 잘못될 수 있다.

 

np.log1p는 작은 값에 대해 더 정확한 계산을 제공하므로 언더플로우로 인한 오류를 줄이는 데 효과적이다.

 

 


 

 

 

또한 로그를 그냥 사용할 경우 NaN 문제가 발생할 수 있다.

 

그 이유는 로그 함수의 정의와 관련이 있다. 특히 자연 로그 함수 (np.log)는 입력값이 특정 조건을 만족하지 않으면 유효한 결과를 반환하지 않거나 계산이 불가능한 경우가 생긴다.

 

 

3. 로그 함수에서 발생할 수 있는 문제

로그 함수는 정의에 의해 양수인 값에 대해서만 계산이 가능합니다.

  • 로그 계산에서의 제한:
    • ln⁡(x)에서 x ≤ 0 이면 계산할 수 없다. 즉, x = 0이거나 음수인 경우 로그값을 계산할 수 없다.
    • 예를 들어, np.log(0)은 -inf (음의 무한대)를 반환하고, np.log(-1)은 NaN을 반환한다.

이 문제를 피하려면 입력값이 1보다 작은 수일 때 주의해야 한다. 예를 들어, ln⁡(1+x)에서 x가 매우 작은 값일 때, 계산 결과가 잘못될 가능성이 있다. 또한 0에 가까운 값에 대한 계산에서 부동소수점 오차가 발생할 수 있다.

 

4. np.log1p(x)의 사용 이유

다시 한 번 언급하자면, np.log1p(x)는 ln(1 + x)를 계산하는 함수이다.

 

이는 로그 값이 0에 가까운 작은 값에 대해 정확하게 계산을 할 수 있도록 돕는 함수로, np.log와 비교할 때 다음과 같은 장점을 가진다:

  • 입력값이 작은 경우 안정성: ln⁡(1+x)가 매우 작을 때에도 부동소수점 오차 없이 정확하게 계산이 가능하므로, 작은 값을 처리할 때 안전하다. 예를 들어, ln⁡(1+0.0000001) 와 같은 계산에서 np.log1p는 매우 정확한 값을 제공한다.
  • 로그 계산에서 NaN이나 무한대 문제 방지: 만약 입력값이 0이나 그보다 작은 값을 포함할 경우, np.log1p는 x가 매우 작거나 0에 가까운 값이어도 NaN이나 무한대 문제가 발생하지 않도록 처리한다.

 

# 이 경우 np.log(0)은 -inf를 반환한다. 
# 만약 이 값이 계산의 일부로 사용되면 의도한 결과를 얻을 수 없다.
import numpy as np 
x = 0 
log_value = np.log(x) # 0에 대한 로그는 -inf 
print(log_value)


# np.log1p(0)은 0을 반환한다.
# x가 0이거나 매우 작은 값일 때 부동소수점 오차를 최소화한다.
x = 0
log1p_value = np.log1p(x) # ln(1 + 0) = 0
print(log1p_value)


# 이 경우 np.log(-1)은 NaN을 반환한다. 
# np.log1p(x)는 음수에 대해서 안전하지 않을 수 있지만, 주로 x가 -1보다 큰 작은 값일 경우 더 정확한 결과를 반환한다.
x = -1 
log_value = np.log(x) # 음수에 대한 로그는 NaN 
print(log_value)

 

 

 

따라서, NaN 문제나 무한대와 같은 문제를 방지하고 정확한 로그 계산을 하려면 np.log1p를 사용하는 것이 더 안전하고 신뢰할 수 있다.