Math

[AI class day10] 인공지능 수학- 추정, 검정, 엔트로피 TIL

makeitworth 2021. 5. 3. 13:48

1. 표본분포

통계적 추론

전수조사는 실질적으로 불가능하기에 표본 조사를 통해 모집단 해석을 진행하는 경우가 많다.

-> 표본 조사는 반드시 오차가 발생

-> 적절한 표본 추출 방법 필요

-> 표본과 모집단과의 관계를 이해해야 함

 

여러 표본 추출 방법

  • 단순랜덤 추출법 (random sampling) : 난수표 사용 / 랜덤넘버 생성기 사용
import random
  [random.randint(1,10)for i in range(10)]

1~10 사이에서 랜덤하게 정수 10개 뽑는 코드

 

표본 평균의 분포

표본조사를 통해 파악하고자 하는 정보: 모수 (parameter)

모수의 종류:

  • 모평균, 모분산, 모비율 등
  • 모수 추정을 위해 표본을 선택하여 표본 평균, 표본 분산 등을 계산하는 것

통계량 (statistic) : 표본 평균이나 표분 분산 같은 표본의 특성값

 

표본의 평균은 표본 선택에 따라 달라짐 -> 표본 평균은 확률 변수

-> 표본 평균이 가질 수 있는 값도 확률분포를 가짐

-> 그 분포가 무엇인지가 표본을 해석할 때 매우 중요

 

표본분포 ( sampling distribution) : 통계량의 확률 분포

표본 평균: 모평균을 알아내는데 쓰이는 통계량

표본 평균의 분포

  • $x_1, x_2, \dots, x_n$
    • 평균 : $\mu$, 분산 : $\sigma^2 $
    • 정규모집단에서 추출된 표본의 측정값
  • 표본평균
    • $\bar {x} = {1 \above 1pt n \sum_{i=1}^n x_i}$ : 표본평균
    • $\bar {X}$~$N(\mu, {\sigma^2 \above 1pt n})$ : 표본평균은 정규분포를 따른다. N이 클수록 분산이 작아진다.

평균이 0, 분산이 1인 표준 정규분포의 표본평균과 분산

import numpy as np
xbars = [np.mean(np.random.normal(size = 10))for i in range(10000)]
print("mean %f, var %f" %(np.mean(xbars), np.var(xbars)))

>> mean -0.002223, var 0.100217

 

평균, 분산을 지정해서 표본평균과 분산 구하기(평균 10 분산 3 n= 10)

xbars = [np.mean(np.random.normal(loc=10, scale=3, size=10))for i in range(10000)]
print("mean %f, var %f" %(np.mean(xbars), np.var(xbars)))

>> mean 9.976282, var 0.875775

 

히스토그램 출력 (정규분포 모양)

 

import matplotlib as plt
from matplotlib import pyplot
h = plt.pyplot.hist(xbars, range=(5,15), bins=30)

 

 

중심극한 정리

  • $x_1, x_2, \dots, x_n$
    • 평균 : $\mu$, 분산 : $\sigma^2$
    • 모집단(!=정규모집단)에서 추출된 표본의 측정값
  • 표본평균
    • $\bar {x} = {1 \above 1pt n \sum_{i=1}^n x_i}$
    • n이 충분히 큰 경우(n >= 30),
      • 근사적으로 $\bar {X}$~$N(\mu, {\sigma^2 \above 1pt n})$

ex1> uniform distibution

n=3
xbars = [np.mean(np.random.rand(n)*10)for i in range(10000)]
print("mean %f, var %f" %(np.mean(xbars), np.var(xbars)))
h=plt.pyplot.hist(xbars, range=(0,10), bins=100)

mean 5.010730, var 2.836724

표본의 갯수 n이 커질수록, 더욱 정규분포 형태를 띌 것.

 

ex2> exponential distribution

 

import numpy as np
import matplotlib as plt
n=2
xbars = [np.mean(np.random.exponential(scale=3, size=n))for i in range(10000)]
print("mean %f, var %f" %(np.mean(xbars), np.var(xbars)))
h=plt.pyplot.hist(xbars, range=(0,10), bins=100)

mean 3.003539, var 4.427474

표본의 갯수 n이 커질 수록 정규분포에 가까운 형태를 띌 것

 

2. 추정

1. 모평균의 추정

표본 평균의 특성

  • $\bar {X}$는 모평균 $\mu$의 추정에 사용되는 통계량
  • 대표본인 경우
    • 중심극한 정리에 의해 표본평균이 정규분포를 따른다고 가정함

점추정

표본평균이 점 추정값(추정량)이 됨(모평균의 점 추정값은 표본평균이다.)

import numpy as np
sample = [9,4,0,8,1,3,7,8,4,2]
print(np.mean(sample))

4.6

--> 점추정만 가지고는 확률적인 근거를 제공하기 부족하기 때문에, 구간추정이라는 것을 이용한다.

 

구간추정

  • 모평균 $\mu$의 $100(1 - \alpha)%$ 신뢰구간(confidence interval) : 표본 뽑기를 그걸 100번을 반복하면 alpha 만큼 분포 그래프 산 안에 모평균이 존재할 것이다
  • ($\mu$의 추정량) \pm $z_{a/2} (추정량의 표준편차)$
  • 정규분포에서 $\sigma$를 알 때, 신뢰구간
  •  

그러나 실용적이지 못함 : 보통은 정규분포가 아니거나 정규분포인지 아닌지 모르거나, 표준편차가 알려져 있지 않기 때문

 

 

    • 표본의 크기가 클 때 중심극한 정리 사용
      • ($\mu$의 추정량) \pm $z_{a/2} (추정량의 표준편차)

$s$ : 표본표준편차 모양은 거의 비슷한데 시그마가 s로 바뀜.

 

 

ex>

어떤 학교의 고1남학생의 평균키를 추정하기 위해 36명을 표본으로 추출하여 그 표본평균과 표본표준편차를 계산하여 그 결과가 아래와 같다.

$\bar {x} = 173.6, s = 3.6$

평균키에 대한 95% 신뢰 구간을 구하시오.

 

95%의 신뢰도이므로 양 귀퉁이가 5%에 해당하게 된다.

 $\alpha = 0.05$

 $z_{a/2} =  $z_{0.0025} = 1.96$ 

 

문제에서 주어진 표본평균과 표본표준편차도 대입하면 (172.4, 174.8)의 구간이 나온다.

 

# 구간추정
w = [10.7, 11.7, 9.8, 11.4, 10.8, 9.9, 10.1, 8.8, 12.2, 11.0, 11.3, 11.1, 10.3, 10.0, 9.9, 11.1, 11.7, 11.5, 9.1
    , 10.3, 8.6, 12.1, 10.0, 13.0, 9.2, 9.8, 9.3, 9.4, 9.6, 9.2]
xbar = np.mean(w)
sd = np.std(w, ddof = 1)
print("mean %.2f, standard deviation %.2f"%(xbar,sd))
import scipy.stats
alpha = 0.05
zalpha = scipy.stats.norm.ppf(1-alpha/2)
print("zalpha:", zalpha)

mean 10.43, standard deviation 1.11

zalpha: 1.959963984540054

2. 모비율의 추정

점추정

  • 확률변수 X :
    • n개의 표본에서 특정 속성을 갖는 표본의 개수
  • 모비율 $p$의 점추정량
    • $\hat{p} = {X \above 1pt n}$ 점추정보다는 구간추정을 더 많이 사용한다.

 

구간추정

  • n이 충분히 클 때($n \hat{p}$ > 5, $n(1 - \hat{p})$ > 5일 때를 의미)
    • $X$ ~ $N(np, np(1-p))$ : 확률변수 X가 정규분포를 따른다.
  • 확률변수 X의 표준화
    • 근사적으로 표준정규분포 $N(0,1)$를 따름

 

  • 모비율 $p$의 $100(1 - \alpha)%$ 신뢰구간(confidence interval), 이 구간 안에 $p$가 있을 확률이 $1 - \alpha$

ex>

대학교 1학년생의 흡연율을 조사하기 위해 150명을 랜덤하게 선택하여 흡연 여부를 조사하엿다.

이중 48명이 흡연을 하고 있었다.

흡연율p에 대한 95% 신뢰구간을 구하시오.

 

 $\alpha = 0.05$

 $z_{a/2} =  $z_{0.0025} = 1.96$ 

$\hat{p} = 0.32$

 

(0.32 - 1.96*0.038, 0.32+1.96*0.038) = (0.245, 0.395)

# 모비율 구간 추정
x = 48
n = 150
phat = x/n
alpha = 0.05
zalpha = scipy.stats.norm.ppf(1-alpha/2)
sd = np.sqrt(phat*(1-phat)/n)

print("phat %.3f, zalpha: %.3f, standard deviation: %.3f" %(phat, zalpha, sd))
ci = [phat - zalpha *sd, phat+ zalpha*sd]
print(ci)

phat 0.320, zalpha: 1.960, standard deviation: 0.038

[0.24534963990338954, 0.3946503600966105]

 

참고 : angeloyeo.github.io/2021/01/05/confidence_interval.html


3. 검정

1. 통계적 가설검정

 

가설검정의 예

 

어떤 고등학교의 1학년 학생들의 평균키가 170.5cm으로 알려져 있었다. 올해 새로 들어온 1학년 학생들 중 30명을 랜덤하게 선택하여 키를 잰 후 평균을 계산했더니 171.3cm이었다.

올해 신입생은 평균키가 170.5cm보다 더 크다고 할 수 있는가?

 

 

이러한 주장을 검증하는 것이 가설 검정

--> 표본평균 $\bar {X}$가 $\mu_0$보다 얼마나 커야 모평균 $\mu$가 $\mu_0$보다 크다고 할 수 있을 것인가?

 

(표본평균은 표본의 선택에 의해 달라짐)

 

귀무가설 $H_0 : \mu = \mu_0$

대립가설 $H_1 : \mu > \mu_0$

 

--> 귀무가설을 기각하기 위해서는 $\bar {X}$(표본평균)가 큰 값이 나와야...

--> 귀무가설이 참이라고 가정할 때, 랜덤하게 선택한 표본에서 지금의 $\bar {X}$가 나올 확률을 계산

--> 이 확률이 낮다면 귀무가설이 참이 아니라고 판단

 

낮은 확률의 기준점은 어떻게 정할 것인가?

--> 유의수준 $\alpha$ 도입

--> $P(\bar {X} \geq k) \leq \alpha$가 되는 k를 찾는다

--> 검정통계량 : 표준정규확률 변수로 변환

--> $\bar {X}$를 $Z$로 변환한 후 $Z$값이 $z_a$보다 큰지를 검토

--> 크다면 귀무가설 기각/ 아니면 귀무가설 채택

 

검정의 단계

  • $H_0$, $H_1$ 설정
  • 유의수준 $\alpha$ 설정
  • 검정통계량 계산
  • 기각역(검정통계량의 범위) 또는 임계값 계산
  • 주어진 데이터로부터 유의성 판정

2. 모평균의 검정

대립가설

 

: 문제에서 검정하고자 하는 것이 무엇인지 잘 파악해야함

  • 대립가설 $H_1$채택을 위한 통계적 증거 확보 필요
  • 증거가 없으면 귀무가설 $H_0$ 채택
  • $H_1 : \mu > \mu_0$ : 모평균이 $\mu_0$보다 크다
    • ex> 어떤 농장에서 생산되는 계란의 평균 무게는 10.5그램으로 알려져 있다. 새로운 사료를 도입한 후에 생산된 계란 30개의 표본 평균을 계산했더니 11.4그램이 나왔다. 새로운 사료가 평균적으로 더 무거운 계란을 생산한다고 할 수 있는가?
    • $H_0 : \mu = 10.5$
    • $H_1 : \mu > 10.5$

 

  • $H_1 : \mu < \mu_0$
    • ex> 어떤 농장에서 생산되는 계란의 평균 무게는 10.5그램으로 알려져 있다. 새로운 사료를 도입한 후에 생산된 계란 30개의 표본 평균을 계산했더니 9.4그램이 나왔다. 새로운 사료가 평균적으로 더 가벼운 계란을 생산한다고 할 수 있는가?
    • $H_0 : \mu = 10.5$
    • $H_1 : \mu &lt; 10.5$
  • $H_1 : \mu != \mu_0$ (양측 검정)
    • ex> 어떤 농장에서 자신들이 생산하는 계란의 평균 무게가 10.5그램이라고 홍보하고 있다. 이에 생산된 계란 30개의 표본 평균을 계산했더니 9.4그램이 나왔다. 이 농장의 광고가 맞다고 할 수 있는가?
    • $H_0 : \mu = 10.5$
    • $H_1 : \mu != 10.5$

검정통계량

n>= 30 이사잉면 중심극한 정리 사용 (s: 표본표준편차)

모집단이 정규모집단이고 모표준편차 $\sigma$가 주어진 경우

 

 

기각역

기각역은 대립가설이 무엇인가에 따라서 범위가 달라진다.

 

  • $H_0 : \mu = 10.5$
  • 유의수준 : $\alpha$
  • 기각역
    • $H_1 : \mu > 10.5$ -> $Z > z_a$
    • $H_1 : \mu < 10.5$ -> $Z < z_a$
    • $H_1 : \mu != 10.5$ -> $|Z| > z_{a/2}$

기각역은 정규분포 그래프를 그렸을 때, 양 극단의  $z_a$ 값 이상/ 이하의 부분에 해당되는지 보는 것

--> 기각역에 해당되면 귀무가설이 탈락됨

# 가설검정
w = [10.7, 11.7, 9.8, 11.4, 10.8, 9.9, 10.1, 8.8, 12.2, 11.0, 11.3, 11.1, 10.3, 10.0, 9.9, 11.1, 11.7, 11.5, 9.1
    , 10.3, 8.6, 12.1, 10.0, 13.0, 9.2, 9.8, 9.3, 9.4, 9.6, 9.2]
mu = 10.5
xbar = np.mean(w)
sd = np.std(w, ddof=1)
print("평균 %.2f, 표준편차: %.2f" %(xbar,sd))
z = (xbar-mu)/(sd/np.sqrt(len(w)))
print("검정통계량: ", z)
alpha = 0.05
cri = scipy.stats.norm.ppf(1-alpha/2)
print("임계값: ", cri)
#귀무가설 기각 안됨

평균 10.43, 표준편차: 1.11

검정통계량: -0.34544881283443796

임계값: 1.959963984540054

 

 

w = [x-0.5 for x in w] # 평균을 바꾸기 위해 모든 원소에 -0.5함
mu = 10.5
xbar = np.mean(w)
sd = np.std(w, ddof=1)
print("평균 %.2f, 표준편차: %.2f" %(xbar,sd))
z = (xbar-mu)/(sd/np.sqrt(len(w)))
print("검정통계량: ", z)
alpha = 0.05
cri = scipy.stats.norm.ppf(1-alpha/2)
print("임계값: ", cri)
# 귀무가설 기각

평균 9.93, 표준편차: 1.11

검정통계량: -2.8129403330804132

임계값: 1.959963984540054

 

참고: angeloyeo.github.io/2020/03/25/hypothesis.html

4. 교차엔트로피

1. 엔트로피

자기 정보(self-information) : i(A)

 

A : 사건

 

$i(A) = log_b({1 \above 1pt P(A)}) = -log_bP(A)$

 

- 확률이 높은 사건보다 확률이 낮은 사건이 더 많은 정보를 담고 있다.

   예) 도둑이 들었는데 개가 짖는 경우보다 도둑이 들었는데 개가 안 짖는 경우가 더 많은 정보를 포함함

- 두개의 사건이 동시에 일어났을 때의 자기 정보는 A의 자기정보와 B의 자기 정보를 합친 것과 같다.

--> 이 전제를 만족하기 위해서 로그를 가져옴

 

정보의 단위

  • b=2 : bits
  • b=e : nats
  • b=10 : hartleys

특성

  • $i(AB) = log_b({1 \above 1pt P(A)P(B)}) = log_b({1 \above 1pt P(A)}) + log_b({1 \above 1pt P(B)}) = i(A) + i(B)$
  • $P(H) = {1 \above 1pt 8}$, $P(T) = {7 \above 1pt 8}$H는 head의 약자, T는 tail의 약자
    자기 정보의 평균
  • ->$i(H) = 3$비트, $i(T) = 0.193$비트

엔트로피(entropy)

  • 자기 정보의 평균
    • $H(X) = \sum_j P(A_j)i(A_j) = - \sum_j P(A_j) log_2 P(A_j)$
  • 특성
    • $0 \leq H(X) \leq log_2K$,
    • $K$ : 사건의 수 확률($P(A_j)$)가 $1/K$일 때(균등한 값을 가질 때) 엔트로피가 가장 큰 값을 가진다.

  • 엔트로피의 활용
    • 평균비트수를 표현
    • 데이터 압축에 사용
      • 4가지 정보를 압축하는데 필요한 비트수: 일반적으로 2비트
      • i(X)를 활용하는 경우 : 평균비트수 1*1/2 + 2*1/4 + 3*1/8 + 3*1/8 = 14/8 = 7/4 비트
X P(X) i(X) code
A 1/2 1 0
B 1/4 2 10
C 1/8 3 110
D 1/8 4 111

 

2. 교차 엔트로피

교차 엔트로피의 정의

  • 집합 S상에서 확률분포 P에 대한 확률분포 Q의 교차 엔트로피
  • 확률분포 P에서 $i(A_j)$의 평균
    • $H(P, Q) = \sum_j P(A_j)i(A_j) = - \sum_j P(A_j) log_2 Q(A_j) = - \sum_{x \in X} P(X) log_2 Q(x)$
    • 이 값은 정확한 확률분포 P를 사용했을 때의 비트수보다 크게 됨
      • $H(P, Q) = - \sum_{x \in X} P(X) log_2 Q(x) \geq - \sum_{x \in X} P(X) log_2 P(x) = H(P)$
  • 이 값은 P와 Q가 얼마나 비슷한지를 표현
    • 같으면 $H(P, Q) = H(P)$
    • 다르면 $H(P, Q) > H(P)$

ex> Q(X)를 가정하고 코드 부여

H(P, Q)

평균비트수 ; 3*1/2 + 3*1/4 + 2*1/8 + 1*1/8 = 21/8 비트

-> 1.5배나 더 많은 비트 사용필요

X P(X) i(X) Q(X) i(X) code
A 1/2 1 1/8 3 000
B 1/4 2 1/8 3 001
C 1/8 3 1/4 2 01
D 1/8 3 1/2 1 1

 

손실함수

  • 분류 문제에서의 손실함수
    • 분류문제란?
      • 주어진 대상이 A인지 아닌지를 판단
      • 주어진 대상이 A, B, C, …중 어느 것인지를 판단
    • 기계학습에서는 주어진 대상이 각 그룹에 속할 확률을 제공
      • 예)
        • [0.8 0.2] : A 일 확률이 0.8, 아닐 확률이 0.2 라는 뜻
        • 이 값이 정답인 [1.0, 0.0]과 얼마나 다른지 측정 필요
        • -> 이것을 측정하는 것이 손실함수
    • 원하는답 P, 제시된 답 Q가 있을 때 P와 Q가 얼마나 다른지에 대한 척도 필요 -> 제곱합을 많이 사용함

  • 제곱합을 사용할 경우
    • $\sum (p_i - q_i)^2$
      • $(1.0 - 0.8)^2 + (0.0 - 0.2)^2$
    • 확률이 다를수록 큰 값을 가짐
    • 학습 속도 느림
  • 교차 엔트로피 $H(P, Q)$를 사용할 경우
    • 확률이 다를수록 큰 값을 가짐
    • 학습 속도 빠름
    • --> 분류 문제에서 주로 교차 엔트로피 사용

  • 참고 : 분류 문제에서의 원하는 답
  • $P = [p_1, p_2, …, p_n]$
    • $p_i$중 하나만 1이고 나머지는 다 0임
      • 엔트로피는 0, 즉 $H(P) = 0$
    • $p_k = 1.0$이라고 하면, $q_k$의 값이 최대한 커지는 방향으로 학습 진행

  • S = {A, B}
    • 실제상황
      • P = [1, 0]
        • P(A) = 1, P(B) = 0
    • 예측 Q(X)
      • [0.8, 0.2] : Q(A) = 0.8, Q(B) = 0.2
        • $H(P, Q) = - \sum_{x \in X} P(x) log_2 Q(x) = -1 * log_2 0.8 = 0.3219$
      • [0.5, 0.5]: Q(A) = 0.5 Q(B) = 0.5
        • $H(P, Q) = - \sum_{x \in X} P(x) log_2 Q(x) = -1 * log_2 0.5 = 1$
      • [0.2, 0.8] : Q(A) = 0.8, Q(B) = 0.2
        • $H(P, Q) = - \sum_{x \in X} P(x) log_2 Q(x) = -1 * log_2 0.2 = 2.32$

 

  • 내가 원하는 값과 다른 값이 나오면 교차엔트로피 값이 커진다.(확률이 다를수록 큰 값을 가짐)
  • --> 이 값이 0에 가까운 값이 되도록 학습이 진행될 것 (손실함수는 학습의 방향을 제공해줌)

 

#교차 엔트로피
import numpy as np
def crossentropy(P,Q):
  return sum([-P[i]*np.log2(Q[i]) for i in range(len(P))])
P = [1, 0]
Q = [0.8, 0.2]
print(crossentropy(P,Q))

Q = [0.5, 0.5]
print(crossentropy(P,Q))

Q = [0.2, 0.8]
print(crossentropy(P,Q))

0.3219280948873623

1.0

2.321928094887362

import numpy as np
def crossentropy(P,Q):
  return sum([-P[i]*np.log2(Q[i]) for i in range(len(P))])
P = [1, 0, 0, 0]
Q = [0.7, 0.1, 0.1, 0.1]
print(crossentropy(P,Q))

0.5145731728297583

 

 

 

 

참고:  angeloyeo.github.io/2020/10/26/information_entropy.html