데이터 분석 또는 머신러닝에서 다루는 수는 크게 다음 범주에 포함된다.
이들 숫자들은, 분석하기 쉽게 하나의 형태에서 다른 형태로 변형이 가능하다.
지수함수를 보자. 실수범위의 값을 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보다 큰 양수이며, 출력은 -무한대에서 무한대까지이다.
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)
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축 그리기
실수 범위를 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축 그리기
엔트로피의 모습을 보자. 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 를 사용한다. 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')