여러가지 함수의 모양과 변형에 대해서 알아보자.

데이터 분석 또는 머신러닝에서 다루는 수는 크게 다음 범주에 포함된다.

이들 숫자들은, 분석하기 쉽게 하나의 형태에서 다른 형태로 변형이 가능하다.

지수 함수 (실수 -> 0보다 큰 실수)

지수함수를 보자. 실수범위의 값을 0보다 큰 값으로 변환하고, 출력값은 급격히 증가한다.

실수값을 0보다 큰수로 변환하려면? exp() 를 사용한다.

# https://blog.naver.com/skkong89/221148676115
x <- seq(-4, 4, 0.01)
y <- exp(x)

plot(x, y, type="l")
abline(h = 0, v = 0)    # x, y축 그리기

로그 함수 (0보다 큰 실수 -> 실수)

로그함수를 보자. 입력값은 0보다 큰 양수이며, 출력은 -무한대에서 무한대까지이다.

x <- seq(0.01, 4, 0.01)
y <- log(x)

plot(x, y, type="l")
abline(h = 0, v = 0)    # x, y축 그리기

그럼, 지수형태의 그래프를 선형으로 변환하려면? log를 적용한다.

  • 지수함수에 로그를 취하면, 선형 그래프가 나온다.
  • 자료의 분포 형태가 지수형태인지?
  • 로그형태인지에 따라 선형으로 변환가능하고, 이렇게 변환된 선형 그래프는 자료를 분석하기 쉽게 만들어 준다.
x <- seq(-4, 4, 0.01)
y <- log(exp(x))

plot(x, y, type="l")
abline(h = 0, v = 0)

Odds 함수 (0과 1사이의 실수 -> 0보다 큰 실수)

p / (1-p) 의 모습을 보자. 그림을 보면 지수함수 그래프와 유사하다. 확률이 1에 가까울 수록 오즈의 값의 무한대에 가깝게 된다.

# odds
# p/(1-p): 지수형태의 그래프
p <- seq(0.01, 0.99, by=0.001)
q <- 1 - p

y <- p / (1 - p)
plot(p, y, type='l')

odds에 log를 취하는 방식을 로짓변환 logit transformation 또는 로그 오즈비라고 한다.

로짓변환: f(x) = ln (p/(1-p)) = logit p

logit p를 대상으로 회귀분석을 적용한 것이 로지스틱 회귀분석 logistic regression analysis 이다.

오즈에 로그를 취한 로짓(logit) 그래프를 그려본다.

p <- seq(0, 1, 0.01)
y <- log(p / (1 - p))

plot(x = p, y = y, type="l")
abline(h = 0, v = 0)    # x, y축 그리기

Sigmoid 함수 (타입 1 -> 타입 3)

실수 범위를 0과 1사이로 변환하려면?

  • sigmoid 함수를 사용한다.
  • 함수의 입력값을 0과 1사이로 출력값으로 변환한다.
  • sigmoid 함수의 모양을 보시면 분모의 값이 가장 작을 수 있는 것이 1이고 가장 큰 값은 무한대가 된다.
  • 따라서 sigmoid 전체의 값은 0 보다 크고 1보다 작게 된다.

응용: logistic regression은 예측값이 0 또는 1이어야 한다.

\(p = y = \frac{1}{1 + e^{-x}} = \frac{e^x}{1 + e^x}\)

# sigmoid 함수
# https://blog.naver.com/skkong89/220778328246
x <- seq(-10, 10, by=0.1) # 일반적인 실수값을
y <- 1 / (1 + exp(-x)) # 0과 1사이의 값으로 변환함 (확률값으로 변환함)
#y <- exp(x) / (1 + exp(x)) # 위의 식에서 분모, 분자에 exp(x) 를 곱하면
plot(x, y, type='l')
abline(h = 0, v = 0)    # x, y축 그리기

그런데 Sigmoid 함수의 역함수는 Logit 함수가 된다. 위 Sigmoid 함수의 역함수를 그리고 그래프를 그려보자.

y <- seq(0.01, 0.99, by=0.01)
#x <- -log(1/y - 1) # Sigmoid 의 역함수
x <- -log((1-y)/y)
plot(y, x, type='l')
abline(h = 0, v = 0)    # x, y축 그리기

Entropy 함수 (타입 3 -> 타입 3)

엔트로피의 모습을 보자. p*(1-p)와 유사하다.

# 엔트로피
# 위로 볼록한 모습
# 0 <= y <= 1
# https://blog.naver.com/skkong89/220781051091
p <- seq(0, 1, 0.01)
y <- -p*log2(p) - (1-p)*log2(1-p)
plot(p, y, type='l')

Softmax 함수 (타입 1 -> 타입 3)

실수값을 확률값으로 변환하려면? softmax 를 사용한다. class 를 구분하는 뉴럴넷의 출력층 값을 0과 1사이의 확률값으로 변환한다. 보통 ML에서는 값의 배열을 받고, 출력으로 배열을 출력하는데 값의 합은 1이 된다.

# softmax
# https://blog.naver.com/skkong89/221733547819
x <- c(1, 50, 60)
y1 <- exp(x) # 지수로 변환하고
y2 <- sum(y1) # 전체 지수합의 비율로 확률을 계산함
p <- y1 / y2
p
## [1] 2.380158e-26 4.539787e-05 9.999546e-01

기타

확률은 0과 1사이의 값을 가진다. p를 어떤 이벤트가 발생할 확률, q를 발생하지 않을 확률이라고 하자.

# 0 <= p <= 1
p <- seq(0.01, 0.99, by=0.001)
q <- 1 - p

p*(1-p)의 모습을 보자. 위로 볼록한 모습이다.

# p*q = p*(1-q)
y <- p * q
plot(p, y, type='l')