matplotlob 맛보기
🙋♀️ 검색능력이 어마어마하게 중요하다
📌 그래프 그리기
fig = plt.figure()
fig.set_size_inches(10, 10) # 싸이즈 설정
# plt.style.use("ggplot") # 스타일적용
ax = []
colors = ["b", "g", "r", "c", "m", "y", "k"]
for i in range(1, 7):
ax.append(fig.add_subplot(2, 3, i)) # 두개의 plot 생성
X_1 = np.arange(50)
Y_1 = np.random.rand(50)
c = colors[np.random.randint(1, len(colors))]
ax[i - 1].plot(X_1, Y_1, c=c)
- subplot(2,3)의 경우 행이 2 , 열이 3인 plot을 그려준다.
plt.plot(X_1, Y_1, c="b", linestyle="dashed")
plt.plot(X_2, Y_2, c="r", ls="dotted")
plt.show()
-ls를 이용하여 line style 지정 가능
plt.plot(X_1, Y_1, color="b", linestyle="dashed", label="line_1")
plt.plot(X_2, Y_2, color="r", linestyle="dotted", label="line_2")
plt.legend(shadow=True, fancybox=False, loc="upper right")
plt.title("$y = ax+b$")
plt.xlabel("$x_line$")
plt.ylabel("y_line")
plt.show()
-title을 통해 제목을 달 수 있음
-latex도 지원해줌
-legend 범례 표시 , loc를 위치 설정할 수 있음
-shadow : 범례박스에 그림자
plt.style.use("ggplot") # 스타일적용
plt.plot(X_1, Y_1, color="b", linestyle="dashed")
plt.plot(X_2, Y_2, color="r", linestyle="dotted")
plt.text(50, 70, "Line_1")
plt.annotate(
"line_2",
xy=(50, 150),
xytext=(20, 175),
arrowprops=dict(facecolor="black", shrink=0.05),
)
plt.title("$y = ax+b$")
plt.xlabel("$x_line$")
plt.ylabel("y_line")
plt.show()
- ggplot을 이용하면 예쁘게 그리드를 그릴 수 있음
- annotate 를 이용하여 그래프에 설명을 추가할 수 있음
plt.plot(X_1, Y_1, color="b", linestyle="dashed", label="line_1")
plt.plot(X_2, Y_2, color="r", linestyle="dotted", label="line_2")
plt.grid(True, lw=0.4, ls="--", c=".90")
plt.legend(shadow=True, fancybox=True, loc="lower right")
plt.xlim(-100, 200)
plt.ylim(-200, 200)
plt.savefig("test.png", c="a")
plt.show()
- xlim,ylim이용해 x,y의 범위 설정 가능
- savefig를 이용하여 특정 형식으로 사진을 저장할 수 있음
📌 그래프의 종류
- scatter 산점도
plt.scatter(data_1[:, 0], data_1[:, 1], c="b", marker="x")
plt.scatter(data_2[:, 0], data_2[:, 1], c="r", marker="o")
plt.show()
- boxplot (상자그림)
data = np.random.randn(100, 5)
plt.boxplot(data)
plt.boxplot(data, notch=True)
plt.boxplot(data, vert=True, whis=0.75)
plt.show()
📌 seaborn : 간단한 코드 + 예쁜 결과물
seaborn.pydata.org/tutorial.html
# Plot the responses for different events and regions
sns.set_style("whitegrid")
sns.lineplot(x="timepoint", y="signal", data=fmri)
- data와 컬럼들을 넣어주면 알아서 그림을 그려준다!
- 선은 하나의 x 에 대한 여러개의 y들의 평균
sns.lineplot(x="timepoint", y="signal", hue="event", data=fmri)
-hue를 사용하면 카테고리 별로 확인 가능
sns.regplot(x="total_bill", y="tip", data=tips)
- scatter plot 에 regression line도 보여줌
sns.countplot(x="smoker", hue="time", data=tips)
sns.barplot(x="day" , y="total_bill" , data=tips)
- 평균을 나타내주며, 검은 선은 변화량을 의미
sns.set(style="darkgrid")
sns.distplot(tips["total_bill"])
- 데이터 들의 분포를 보여줌
통계학 맛보기
📌 학습포인트
1. 표본분포와 표집분포의 차이
2. 가능도와 확률의 차이
3. 최대가능도 추정법을 통한 확률분포의 거리 최소화
📌 통계적 모델링
: 적절한 가정 위에서 확률분포를 추정하는 것
- 데이터를 통해서 관찰할 수 있는 정답의 분포는 확실하게 알 수 없고,
확률분포도 다양하기 때문에 "어떤 분포를 통해 모델링 하는가" 또한 중요함
- 유한한 개수의 데이터만 관찰해 모집단의 분포를 정확하게 알아낼 수 없다.
정답의 확률분포를 데이터만 가지고 정확하게 알아내는 것은 불가능 하므로, 근사적으로 확률분포를 추정할 수 밖에 없다.
-> 목적 : 정확하게 맞추겠다! 보다는 데이터와 추정방법의 불확실성을 고려해 위험을 최소화
ex ) 100개 중 제일 많이 맞추겠다 보다는 100개 중 1개도 안맞아도 되니 그 차이가 제일 적게하겠다.
* 불확실성 : 판단이나 의사 결정에 필요한 적절한 정보의 부족 으로 실제로 어떤 사실이나 지식에 대한 확실성이 100%인 경우는 정말 거의 드물다고 한다.
데이터가 특정 확률분포를 따른다고 선험적으로 가정한 후 분포를 결정하는 모수를 추정 : 모수적 방법론
특정 확률분포를 가정하지 않고, 모델의 구조 및 모수의 개수가 유연하게 바뀐다면 : 비모수 방법론
- ML, DL의 대부분이 비모수를 따름
- 비모수라고 모수가 없다는 것이 아니다. -> fix되어있지 않고, 계속 바뀌는 경우를 얘기한다.
📌 확률분포 가정하기
: 히스토그램을 보고 모양을 관찰한다.
- 기계적으로 확률분포를 가정해서는 안되며, 데이터를 생성하는 원리를 먼저 고려하는 것이 원칙!
- 모수를 추정한 후 반드시 검정을 해야한다.
- SciPy를 이용하여 확률분포 기능을 사용할 수 있다.
1. 데이터가 2개의 값 (0,1)만 가지는 경우 -> 베르누이 분포
\begin{align} X \sim \text{Bern}(x;\mu) \end{align}
\begin{align}\text{Bern}(x;\mu) = \mu^x(1-\mu)^{(1-x)}\end{align}
베르누이분포는 1이 나올 확률을 의미하는 μ라는 **모수(parameter)**를 가진다
mu = 0.6
rv = sp.stats.bernoulli(mu)
xx = [0,1]
plt.bar(xx, rv.pmf(xx))
plt.xlim(-1,2)
plt.ylim(0,1)
plt.xticks(xx , ["x=0" ,"x=1" ])
plt.show()
2. 데이터가 n개인 이산적인 값을 가지는 경우 : 카테고리 분포
- 카테고리 분포는 이항분포의 확장판으로 다중분류 문제 (multi- class classfication) 에 쓰일 수 있다.
카테고리 확률 변수는 1,0 으로만 이루어진 다차원 벡터를 출력한다. (원핫인코딩을 사용)
\begin{split}
\begin{align}
\begin{aligned}
x = 1 \;\; & \rightarrow & \;\; x = (1, 0, 0, 0, 0, 0) \\
x = 2 \;\; & \rightarrow & \;\; x = (0, 1, 0, 0, 0, 0) \\
x = 3 \;\; & \rightarrow & \;\; x = (0, 0, 1, 0, 0, 0) \\
x = 4 \;\; & \rightarrow & \;\; x = (0, 0, 0, 1, 0, 0) \\
x = 5 \;\; & \rightarrow & \;\; x = (0, 0, 0, 0, 1, 0) \\
x = 6 \;\; & \rightarrow & \;\; x = (0, 0, 0, 0, 0, 1) \\
\end{aligned}
\end{align}
\end{split}
원솟값 $x_k$ 는 베르누이 확률변수로 볼 수 있기 때문에 각각 1이 나올 확률을 나타내는 모수 $\mu_{k}$를 가진다.
\begin{align}
\mu = ( \mu_1, \cdots , \mu_K )
\end{align}
모수 벡터는 0과 1사이의 확률이고 , 합이 1이어야한다는 조건을 가지게 된다.
즉, 베르누이분포에서는 1이 나올 확률을 의미하는 모수가 1개였다면, 카테고리분포에서는 클래스의 개수만큼의 모수를 가진다.
확률질량함수는 다음과 같다.
\begin{split}
\begin{align}
\text{Cat}(x;\mu) =
\begin{cases}
\mu_1 & \text{if } x = (1, 0, 0, \cdots, 0) \\
\mu_2 & \text{if } x = (0, 1, 0, \cdots, 0) \\
\mu_3 & \text{if } x = (0, 0, 1, \cdots, 0) \\
\vdots & \vdots \\
\mu_K & \text{if } x = (0, 0, 0, \cdots, 1) \\
\end{cases}
\end{align}
\end{split}
위 식을 원핫인코딩을 사용한 덕분에 아래처럼 간략하게 표현할 수 있다.
\begin{align}
\text{Cat}(x;\mu) = \mu_1^{x_1} \mu_2^{x_2} \cdots \mu_K^{x_K} = \prod_{k=1}^K \mu_k^{x_k}
\end{align}
* 다항분포와 카테고리분포의 차이점이 뭘까 고민해봤는데, 다항분포를 반복없이 1번만 실행하면 카테고리분포다.
plt.rcParams["font.family"] = "NanumGothic" #한글깨짐 방지
mu = [0.1, 0.1, 0.1, 0.1, 0.3, 0.3]
rv = sp.stats.multinomial(1, mu) #다항분포를 1번만 하면 카테고리분포
xx = np.arange(1, 7) #클래스의 개수 : 6
xx_ohe = pd.get_dummies(xx) #원핫으로 만들기 위해 cummy
plt.bar(xx, rv.pmf(xx_ohe.values))
plt.ylabel("P(x)")
plt.xlabel("표본값")
plt.title("카테고리분포의 확률질량함수")
plt.show()
3. 데이터가 [0,1]사이에서 값을 가지는 경우 : 베타분포
감마분포, 베타분포는 모숫값을 조정하여 분포의 모양을 바꿀 수 있다.
그래서 베이지안 확률론 관점에서 사전확률로 베타분포를 가정하곤 한다.
모숫값은 분포 모양을 조절하는 조절값이라고 생각하면 된다.
a,b라는 두 모수를 가지며, 표본 공간은 0과 1 사이의 실수이다.
a,b는 베타분포의 모양을 결정하는 형상인자다.
베타분포의 확률 밀도함수를 알려면 ! 먼저 감마분포의 확률밀도함수를 알아야한다.
하지만 감마분포는 아래에서 다룰 테니까 넘어가보자.
\begin{align}
\text{Beta}(x;a,b)
& = \frac{\Gamma(a+b)}{\Gamma(a)\Gamma(b)}\, x^{a-1}(1-x)^{b-1}
\end{align}
xx = np.linspace(0, 1, 1000)
plt.subplot(121)
plt.fill_between(xx, sp.stats.beta(1.001, 1.001).pdf(xx))
# a = 1 , b = 1
#pdf: 확률밀도함수 , pmf : 확률질량함수
plt.ylim(0, 6)
plt.title("(A) a=1, b=1")
plt.subplot(122)
plt.fill_between(xx, sp.stats.beta(4, 2).pdf(xx))
# a = 4 , b = 2
plt.ylim(0, 6)
plt.title("(B) a=4, b=2, 최빈값={0}".format((4-1)/(4+2-2)))
# 최빈값 = a-1 / a+b-2
4. 데이터가 0이상의 값을 가지는 경우 : 감마분포
감마분포는 0부터 무한대의 값을 가지는 양수 값을 추정하는데 사용된다.
모수는 형상모수인 a,b 두가지다.
\begin{align}
\text{Gam}(x;a,b) = \frac{1}{\Gamma(a)} b^a x^{a-1}e^{-bx}
\end{align}
#b = 1로 고정되어있어, a값만 모수로 주면 된다.
xx = np.linspace(0, 16, 100)
plt.subplot(121)
plt.fill_between(xx, sp.stats.gamma(8).pdf(xx))
plt.ylim(0, 0.4)
plt.title("(A) a=9, b=1, 최빈값=7")
plt.subplot(122)
plt.fill_between(xx, sp.stats.gamma(2).pdf(xx))
plt.ylim(0, 0.4)
plt.title("(D) a=2, b=1, 최빈값=1")
plt.tight_layout()
plt.show()
5. 데이터가 실수공간 전체에 대해 값을 가지는 경우 : 정규분포
정규분포는 평군과 분산 두 모수로 정의되며 확률밀도함수를 아래와 같이 표현된다.
\begin{align}
\mathcal{N}(x; \mu, \sigma^2) = \dfrac{1}{\sqrt{2\pi\sigma^2}} \exp \left(-\dfrac{(x-\mu)^2}{2\sigma^2}\right)
\end{align}
plt.rcParams["font.family"] = "NanumGothic" #한글깨짐 방지
mu = 0
std =1
rv = sp.stats.norm(mu, std)
xx = np.linspace(-5,5,100)
plt.plot(xx,rv.pdf(xx))
📌 정규분포의 모수를 추정하는 통계량
- 표본평균
\[\widetilde{X}=\frac{1}{N}\sum X_{i}\]
표본평균의 기댓값 = 모집단의 평균
- 표본분산
\[S^{2} = \frac{1}{N-1}\sum (X_{i} - \widetilde{X})^{2}\]
표본분산의 기댓값 = 모집단의 표본분산
* N이 아닌 N-1로 나누는 이유 : 불편추정량 (편차, 즉 모수값과 추정량의 차이를 없애기 위함)
- 통계량의 확률분포 : 표집분포(Sampling distribution)라 부르며 , 표본평균의 표집분포는 중심극한 정리를 따른다.
- 중심극한 정리 : 모집단의 분포와 무관하게 , 표본평균의 표집분포는 N(관측치의 개수)가 커질수록 정규분포 $N(\mu, \sigma ^{2}/N)$ 를 따른다.
* 표본분포와 표집분포의 차이
표본분포 : 모집단을 대표할 수 있도록 추출된 군단의 분포
표집분포 : 여러개의 표본들의 통계량을 모아 만든 이론적인 분포
예를 들어 , 모집단이 대학생일 때 , 00대 학생 100명의 점수 분포가 표본분포가 된다.
이때 00대 학생들의 평균 , xx대 학생들의 평균 등 표본의 평균을 모아 만든 분포가 표집분포가 된다.
📌 최대가능도 추정법 (Maximum Likelihood Estimation)
이론적으로 가장 가능성이 높은 모수를 추정하는 방법
가능도 함수는 확률밀도(질량)함수와 같은 수식을 쓰지만 , 이 식을 바라보는 "관점"이 다르다.
x는 확률분포가 가지는 실수값 즉 데이터(관측값)을 , $\theta$ 는 모수를 표시하는 기호일 때, 확률밀도(질량)함수는$p(x;\theta)$로 표현한다.
이때 모수는 이미 알고있는 상수이고 , x가 변수다.
하지만 모수추정문제에서는 데이터는 충분한 상태이고 모수를 모르고 있다.
그렇기 때문에 x를 상수계수로 두고$\theta$ 를 변수로 생각한다.
이런 관점에서 확률밀도함수를 바라보는 경우, 이를 가능도함수라고 한다.
가능도는 합 = 1 이라는 확률의 기본 조건에 부합하지 않기 때문에, 확률이 아니다!
\begin{align}
{L}(\theta;x) = p(x;\theta)
\end{align}
- 최대 가능도 추정법은 주어진 표본에 대해 가능도를 가장 크게 하는 모수를 추정하는 방법이다.
\begin{align}
\hat\theta_{\text{MLE}} = \arg \max_{\theta} L(\theta; x)
\end{align}
ex ) 정규분포를 이룬다고 가정했을 때 , 분산 =1 이라는 것은 알고있지만 평균을 몰라 이를 추정해야한다고 하자 . 표본이 x = 1 하나를 가지고 있을 때 , $\mu$ 값에 대해 1이 나올 확률밀도의 값이 바로 가능도다.
-
N(x;μ=−1)N(x;μ=−1)이라는 확률분포에서 x=1이 나올 가능도(확률밀도)는 0.05이다.
-
N(x;μ=0)N(x;μ=0)이라는 확률분포에서 x=1이 나올 가능도(확률밀도)는 0.24이다.
-
N(x;μ=1)N(x;μ=1)이라는 확률분포에서 x=1이 나올 가능도(확률밀도)는 0.40이다.
가장 큰 가능도를 가진 확률분포인 $\mu$ = 1인 경우를 선택해야한다. 따라서 최대 가능도 추정법에 의한 추정값은 1 이다.
📌 복수의 표본 데이터가 있는 경우
표본데이터는 같은 확률분포에서 나온 독립적인 값들이므로 다음처럼 곱으로 표현할 수 있다.
\begin{align}
L(\theta; x_1, \ldots, x_N)
= p(x_1, \ldots, x_N; \theta)
= \prod_{i=1}^N p(x_i; \theta)
\end{align}
무슨 말인지 잘 이해가 안 간다. 가능도를 추정할 때 표본이 여러개면 곱하면 된단 얘긴가?
예제를 살펴보자.
베르누이분포를 통해 표본데이터 {1,0,1}을 얻었다고 한다.
베르누이분포의 모수는 1이 나올 확률을 나타내는 $\mu$이다.
이 때의 가능도 함수는
\begin{split}
\begin{align}
\begin{aligned}
&L(\mu; x_1=1, x_2=0, x_3=1) \\
&= p(x_1=1, x_2=0, x_3=1; \mu) \\
&= p(x=1;\mu)p(x=0;\mu)p(x=1;\mu) \\
&= \mu^1 (1-\mu)^{1-1} \cdot \mu^0 (1-\mu)^{1-0} \cdot \mu^1 (1-\mu)^{1-1} \\
&= \mu \cdot (1-\mu) \cdot \mu \\
&= -\mu^3 + \mu^2
\end{aligned}
\end{align}
\end{split}
가능도 함수를 최대화하는 $\mu$의 값은 $\hat\mu_{\text{MLE}}=\frac{2}{3}$ 가 된다.
(도함수를 0으로 만들어주는 게 2/3)
📌 로그가능도 함수
최적화시키기 위해 로그 가능도 함수를 사용한다.
\begin{align}
\hat\theta_{\text{MLE}} = \arg \max_{\theta} \log{L}(\theta; \{x_i\})
\end{align}
- 데이터의 숫자가 수억단위라면 컴퓨터의 정확도로 가능도를 계산하는 것이 불가하다.
- 데이터가 독립일 경우, 가능도의 곱을 로그 가능도의 덧셈으로 바꿀 수 있기에 연산이 훠어어어얼씬 적어진다.
- 예를 들어 미분을 하는 경우, n개의 곱이라면 연산량이 O($n^{2}$)이지만 n개의 합이라면 연산량이 O(n)이다.
- 손실함수의 경우, 경사하강법을 사용하므로 음의 로그가능도를 최적화하게 된다.
📌 최대 가능도 추정법 예제 : 정규분포
정규분포를 따르는 확률변수 X로부터 독립적인 표본 n개를 얻었을 때 최대 가능도 추정법을 이용하여 모수를 추정하면 ?
📌 최대 가능도 추정법 예제 : 카테고리분포
정규분포를 따르는 확률변수 X로부터 독립적인 표본 n개를 얻었을 때 최대 가능도 추정법을 이용하여 모수를 추정하면 ?
카테고리분포는 정규분포와 다르게 모수가 k개이고 , 스칼라값이 아닌 원-핫벡터값들로 이루어져있다.
x = [1,0,0,0,0,0]과 같은 x들이 n개 존재하는 경우를 생각해보자.
📌 딥러닝에서의 최대가능도 추정법
가중치를 모수라고 표기했을 때, 분류문제에서 소프트맥스 벡터는 카테고리 분포의 모수를 모델링합니다.
-> 5개의 클래스로 분류하는 모델의 경우 하나의 데이터를 넣어 소프트맥스 출력값이 [0,0,1,0,0]이 된다.
이 때, 카테고리분포의 모수를 모델링하게 된다.
원핫벡터로 표현한 정답레이블 y를 관찰데이터로 이용해 확률분포인 소프트맥스 벡터의 로그가능도를 최적화시킬 수 있다.
📌 확률분포의 거리를 구해보자 : 쿨백라이블러발산
쿨백 라이블러 발산을 알기 위해서는 먼저 엔트로피 , 크로스 엔트로피에 대해 공부해야한다.
- 엔트로피 : 확률분포가 가지는 정보의 확신도 혹은 정보량의 평균을 의미한다.
\begin{align}I(X) = log{\frac{1}{p(x)}}\end{align}
정보량은 "놀람"의 정도를 나타낸다고 볼 수 있다.
주로 발생하지 않는 사건(ex. 로또)에 대해선 엄청 놀라지만, 자주 발생하는 사건 (ex. 주사위, 가위바위보)에 대해서는 많이 놀라지 않는다. 즉 사건의 발생 확률이 낮을수록 놀람의 정도는 높아지고, 역수를 취해 표현해 높은 정보량을 갖고 있다고 간주한다.
log함수를 취한 데에는 이유가 있다. 단순히 MLE와 같은 편의를 위해서가 아닌 정보를 표현하는데 필요한 "최소한의 자원"을 의미한다. {\frac{1}{8}}의 확률로 발생하는 사건은 2진수로 표현하면 최소 3개의 비트가 필요하므로 log를 취해 3을 표현할 수 있기 때문이다.
즉, 엔트로피는 정보량에 대한 기댓값이며 동시에 사건을 표현하기 위해 요구되는 평균 자원이라고 할 수 있다. [참고]
엔트로피는 불확실성과도 같은 개념이다.
정보가 불확실해 예측이 어려울수록 필요한 정보의 양은 더 많아지므로 높은 정보량을 갖게 되므로 엔트로피가 커진다.
어떠한 확률변수의 불확실성을 설명하기 위해 평균을 낸 entropy를 사용하게 된다.
\begin{align}E(I(X)) = E(log\frac{1}{p(x)}) =-E(log p(x))= - \sum p(x)logp(x) \end{align}
확률밀도가 특정값에 몰려있으면 엔트로피가 작다하고, 퍼져있다면 엔트로피가 크다고 한다.
이 때 Y1의 엔트로피 = 1, Y3의 엔트로피 = 0이 된다.
- 크로스 엔트로피
두 개의 확률분포 p,q에 대해 하나의 사건 X가 갖는 정보량으로 정의된다.
실제 분포 p에 대해 알지 못할 때, 적절한 모델링을 통해 근사하는 확률분포 q를 구해 p를 예측한다.
두 확률분포 P,Q의 교차엔트로피는 H[p,q]는
\begin{align}H[p,q] = -\sum_{k=1}^K p(y_k) \log_2 q(y_k)\end{align} 와 같이 정의한다.
- MLE와 cross-entropy
cross entropy를 최소화 하는 것은 log likelihood를 최대화 하는 것과 같다.
\begin{align*} -\log{P(y\vert x; \theta)} &= -\log{\prod\limits_{i = 1}^m(\phi^{(i)})^{y^{(i)}}(1 - \phi^{(i)})^{1 - y^{(i)}}}\\ &= -\sum\limits_{i = 1}^m\log{\bigg((\phi^{(i)})^{y^{(i)}}(1 - \phi^{(i)})^{1 - y^{(i)}}\bigg)}\\ &= -\sum\limits_{i = 1}^my^{(i)}\log{(\phi^{(i)})} + (1 - y^{(i)})\log{(1 - \phi^{(i)})}\\ \end{align*}
- 쿨백 라이블러 발산
: 두 확률분포 P,Q의 분포모양이 얼마나 다른지를 숫자로 계산한 값이다. 정보량의 차이에 대한 기댓값으로 q가 p를 근사하는 확률분포라면 KL divergence는 확률분포의 근사를 통해 얼마나 많은 정보를 잃게 되는지 알려준다.
KL(p||q)로 표기한다.\begin{align} D_{KL}(p \| q) &= \sum_{i=1}^N p(x_i) (\log p(x_i) - \log q(x_i))\\\ & = \sum_{i=1}^N p(x_i) (\log \frac{p(x_i)}{q(x_i)}) \end{align}
cross entropy로부터 KL divergence를 유도할 수도 있다.
cross entropy에서 entropy를 뺀 값으로, H(p) = p에 대한 엔트로피는 어차피 상수값으로 고정된다.
결국 cross entropy를 줄이는 것은 KL-divergence를 줄이는 것과 동치가 된다.
결국 로그가능도 최대화 = CROSS-ENTROPY 최소화 = KL-DIVERGENCE 최소화모두 다 실제 확률분포 P와 예측한 확률분포 Q 사이의 차이를 최소화시켜주는 최적의 파라미터를 찾는 것과 같은 일이다. 그러면 왜 loss함수로 KL이 아닌 cross entropy를 쓸까? KL은 cross entropy와 entropy로 이루어져있다. entropy는 어차피 p에 대한 값으로 상수이기때문에 미분하면 사라져버린다. 그래서 loss로 cross entropy를 쓰나 KL을 쓰나 똑같기때문에 그냥 cross를 쓰는 거 같다.
쿨백 라이블러 발산은 아래 3가지 성질을 만족한다.
1.KL(p||q) $\geq$ 0
2. p(x) = q(x) 일 때만, KL(p||q) = 0
3. KL(p||q) $\neq$ KL(q||p)
1번은 젠슨부등식을 이용해서 풀 수 있다.
KL은 p,q에 대한 크로스엔트로피 - p에 대한 엔트로피다.
KL이 0보다 크다면 p,q에 대한 크로스 엔트로피는 p에 대한 엔트로피보다 크거나 같다.
언제 같을까 ? 그건 2번에서 ㅎㅅㅎ
2번은 KL식이 0이 되기위해서는 시그마 내의 $log\frac{q(x)}{p(x)}$가 0이 되어야한다. 그러려먼 q = p밖에 없다.
3번은 KL-DIVERGENCE는 어떤 정보량의 차이지, "거리"를 의미하지 않는다.
Further question
1. 확률과 가능도의 차이는 무엇일까?
확률은 주어진 확률 분포안에서 특정한 관측값이 얼마만큼 나올 수 있는가 에 대한 값이다.
가능도는 관측값들이 주어졌을 때, 확률분포를 가정한 후 특정 모수가 나올 수 있는 가능성에 대한 값이다.
둘은 같은 확률밀도(질량)함수를 사용하지만 관점에서 차이가 난다.
확률은 관측값 x를 변수로 바라보고 모수 $\theta$ 는 상수로 간주한다.
가능도는 관측값 x를 상수로 바라고 모수 $\theta$를 변수로 간주한다.
예를 들어, 동전을 던지는 문제에서 앞면이 나올 확률은 모수일 것이다.
앞면이 나올 확률이 1/2일 때, 10번 던져 앞면이 4번 나올 확률은?
-> 모수가 주어졌을 때, 특정한 관측값이 몇 번 나올까?에 대한 얘기
앞면이 4번 , 뒷면이 6번 나왔을 때 , 앞면이 나올 가능성은 얼마일까?
-> 관측값 (앞면 4번 , 뒷면 6번)이 주어졌을 때, 모수(앞면이 나올 가능성)에 대한 얘기
2. 확률 대신 가능도를 사용하는 이유
현실에서는 확률분포가 정확하게 주어져있는 경우보다는 관측치(데이터)들이 주어지는 경우가 많다.
이런 상황에서 주어진 데이터를 관찰해 확률분포를 가정한 후 , 모수를 추정하는 가능도가 더 이점이 있다고 생각한다.
3. 다음의 code snippet은 어떤 확률분포를 나타내는 것일까요? 해당 확률분포에서 변수 theta가 의미할 수 있는 것은 무엇이 있을까요?
import numpy as np
import matplotlib.pyplot as plt
theta = np.arange(0, 1, 0.001)
p = theta ** 3 * (1 - theta) ** 7
plt.plot(theta, p)
plt.show()
베르누이분포를 나타내며 theta는 1이 나올 확률을 의미한다고 생각한다.
동전문제와 같이 앞면이 3번 , 뒷면이 7번 나왔을 때, 동전을 던져 앞면이 나올 확률이 얼마일 때, 가장 가능성이 높은지를 추정하는 거 같다
그래프를 보면 theta가 0.3일 때, 0.0020을 넘어 최댓값인 걸 확인할 수 있다.
MLE = 0.3이다!
피어세션
sen1 = list(input())
sen2 = list(input())
m = len(sen1)
n = len(sen2)
dp = [[0 for _ in range(n+1)] for _ in range(m+1)]
# sen1 단어 하나하나를 sen2와 비교해야 됨 행=sen1 , 열 sen2
for i , word1 in enumerate(sen1) :
for j , word2 in enumerate(sen2):
if word1 == word2 : dp[i+1][j+1] = dp[i][j]+1
else : dp[i+1][j+1] = max(dp[i][j+1] , dp[i+1][j])
print(dp[m][n])
c , n = map(int,input().split())
arr = []
for _ in range(n): arr.append(list(map(int,input().split())))
#arr[0] = cost , arr[1] = customer
dp = [1000000] * 1101
dp[0] = 0
arr.sort(key = lambda x : x[1])
for i in arr :
cost = i[0]
customer = i[1]
for j in range(1,1101):
if customer <= j : dp[j] = min(dp[j] , dp[j-customer] + cost)
nmin = 1000000
for i in range(c, 1101):
nmin = min(nmin , dp[i])
print(nmin)
'Naver Ai Boostcamp' 카테고리의 다른 글
[DAY 12] 최적화 (1) | 2021.02.02 |
---|---|
[DAY 11] 딥러닝 기초 (0) | 2021.02.02 |
[DAY 9] Pandas II / 확률론 (0) | 2021.01.29 |
[DAY 8] Pandas I / 딥러닝 학습방법 이해하기 (0) | 2021.01.27 |
[DAY 7] 경사하강법 (0) | 2021.01.26 |