markdown 수식 넣기

mathjax

Markdown에서는 $x^2$처럼 수식을 사용할 수 있는 mathjax 플러그인이 내장되어있다.

블럭 지정

수식을 사용하기 위해 아래와 같이 식 앞 뒤로 $문자를 넣어줘야한다.

1
$math$

$math$

아래 처럼 $ 문자를 2개 넣는 경우도 있는데,

1
$$math$$

이 경우엔 text 사이에 수식을 삽입하는게 아닌 따로 표현하는 경우에 주로 사용된다.

첨자

수학에서 행의 i번째 속성을 가리키거나 x의 n 제곱을 표현할 때 첨자를 주로 사용한다.

1
$x_i^n$

$x_i^n$

  • 아래첨자: _
  • 위첨자: ^

중괄호

x의 12제곱을 표현하기 위해 단순히 $x^12$만 입력하게 된다면

$x^12$처럼 문자 1개만 위첨자로 처리된다.
이를 해결해주는 문법이 중괄호( { } )다.

1
$x^{12}$

$x^{12}$

단, 중괄호를 mathjax에서 하나의 문자열로 처리하기 위해 사용되므로 중괄호를 사용하는 식에서는 escape(\)로 문법 인식이 아닌 문자 인식으로 바꿔줘야한다.

1
$x_5 = [[\{(x_1)+x_2\}+x_3]+x_4]$

Hexo: 중괄호를 표현하기 위해선 \를 중첩 사용한다.
hexo 수식 사용하기

1
$x_5 = [[\\{(x_1)+x_2\\}+x_3]+x_4]$

$x_5 = [[\{(x_1)+x_2\}+x_3]+x_4]$

행렬 형식

2속성만 넣을 경우

1
$$v{x \choose 0}$$

기본 형식 array행렬 & 괄호 크기 변경

1
2
3
4
5
6
7
$$
X\Bigg\{
\begin{array}{c}
x_{1}\\
x_{2}
\end{array}
$$

P-matrix

1
2
3
4
5
6
7
8
9
10
11
$$
L=
\begin{pmatrix}
b_1 & b_2 & b_3 & \cdots & b_{n-1}& b_n\\
s_1 & 0 & 0 & \cdots & 0 & 0\\
0 & s_2 & 0 & \cdots & 0 & 0\\
0 & 0 & s_3 & \cdots & 0 & 0\\
\vdots&\vdots&\vdots& \ddots & \vdots &\vdots\\
0 & 0 & 0 & \cdots & s_{n-1}& 0\\
\end{pmatrix}
$$

B-matrix

1
2
3
4
5
\begin{bmatrix}
2 & 1 &-1\\
1 & 0 & 5\\
-1 & 3 &-2
\end{bmatrix}

행렬에 세로 줄 넣기

1
2
3
4
5
6
7
8
9
$$
\left[
\begin{array}{ccc|c}
2 & 1 &-1 & 3\\
1 & 0 & 5 & 1\\
-1 & 3 &-2 & 0
\end{array}
\right]
$$

V-matrix

1
2
3
4
5
6
7
$$
\begin{vmatrix}
a & b\\
c & d
\end{vmatrix}
=ad-bc
$$

연립 방정식

1
2
3
4
5
6
7
$$
\begin{cases}
v_1 = 3i+2k\\
v_2 = 2j+k\\
v_3 = i+j+k
\end{cases}
$$

특수문자

수식에서 사용되는 곱셈 나눗셈부터 pi ohm과 같은 특수문자를 삽입하기 위해선 중괄호 경우처럼 \를 사용해야한다.

1
2
3
4
5
$$
(\hat i\cdot\hat i)\div n \\
= \frac{\vert\hat i\vert\times\vert\hat i\vert cos\theta}{n}\\
= \frac{\vert\hat i\vert^2\times 1}{n} = \frac 1n
$$

특수문자는 굉장히 다양하므로 삽입하고자 하는 문자를 LaTex(혹은 Mathjax) 검색어에 붙여 검색하자.

Hexo blog markdown 수식 표현 mathjax

분명 MarkDown math tutorial대로 수식을 작성하고 Ipython notebook에서도 정상적으로 출력되는걸 확인했지만,
Hexo post는 아래처럼 읽어내지를 못한다.
으아악 아니야!

Hexo plugin 설치

다른 블로그 모듈을 사용하는 방법도 있지만, Hexo를 설치했으니 그대로 사용하기 위해 우선 구글링으로 해결해본다.
검색 결과 hexo에서 사용하는 랜더링 모듈에 수식표현 문법이 포함되어 있지 않아서 발생하는 문제였다.

기본 renderer 교체

Hexo의 기본 renderer인 marked를 제거하고 mathjax를 지원하는 kramed로 교체한다.

1
2
$ npm uninstall hexo-renderer-marked --save
$ npm install hexo-renderer-kramed --save

설치가 완료되면 ..\node_modules\hexo-renderer-kramed\lib\renderer.js에서 formatText 함수의 반환값을 변경해준다.

1
2
3
4
5
6
// Change inline math rule
function formatText(text) {
// Fit kramed's rule: $$ + \1 + $$
return text;
// return text.replace(/`\$(.*?)\$`/g, '$$$$$1$$$$'); // (: default)
}

mathjax 설치

kramed 랜더러에 설정값을 넣어줄 mathjax 랜더러를 설치한다.

1
$ npm install hexo-renderer-mathjax --save

마찬가지로 ..\node_modules\hexo-renderer-mathjax\mathjax.html에서 스크립트 source url을 교체한다.

1
2
3
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML"></script>
<!-- <script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> --> <!--: default -->

Mathjax 활성

이제 사용하고 있는 _config.theme.yml에서 mathjax를 활성화 시켜주면된다.

1
2
3
mathjax:
enable: true
# mathjax: false # : default

markdown 문법을 사용할 예정이라 문법 추가 설정은 하지 않는다.

예제

오…

외부링크

평가지표 RMSE와 MAE, MSE

DATA

Row(행)가 $n$개 있는 dataframe에서;
실측 값에 대한 dataframe의 column(열)을 $Y$로 봤을 때,

$Y$는 다음과 같은 원소의 집합이 된다.

모델링 결과 등 $Y$에 대한 추정값의 집합이 $\hat{Y}$다.

평가 지표

실측값$Y$와 추정값$\hat Y$가 있으니 두 값의 차이인 오차(error: $\Delta y_i = y_i-\hat{y_i}$)가 발생한다.
$\Delta y_i$를 여러 방식으로 가공해서 측정값의 신뢰도를 보여주는게 평가 지표다.

다양한 평가지표 중 RMSE에 관해 공부할 것이며, MSE, MAE는 RMSE와 매우 유사한 형태를 가진다.

MAE(Mean Absolute Error): 평균 절대 오차

$\Delta y_i$의 절대값을 모두 더한 값의 평균이다.

MSE(Mean Squared Error): 평균 제곱 오차

$\Delta y_i$의 제곱을 모두 더한 값의 평균이다.

RMSE(Root Mean Square Error): 평균 제곱근 오차

$\Delta y_i$의 제곱을 모두 더한 값의 평균에 Root를 씌운 형태로 $\sqrt{MSE}=RMSE$다.

특징

위 세 지표는 모두 오차 그 자체인 $y_i-\hat{y_i}$를 포함해 값이 낮을수록 좋은 추정모델임을 의미한다.
단, 실측값과 추정값의 차에 지나치게 의존하는 경향을 보여 $3-1=2$와 $100-102=2$ 모두 동일한 평가로 보여진다.

위 세 지표는 오차 자체에 의존하는 만큼 직관적인 지표가 나와 대중에게 설명하기 좋다.
MAE로 예를 들자면, 600과 620의 차는 20이므로 20의 예측 오류가 발생했다고 설명할 수 있다.

MSE의 경우 오차 제곱하기 때문에 $\vert error\vert<1$일 경우 error값은 작아지고 반대의 경우 커지는 왜곡이 발생한다.
RMSE에서는 MSE에 Root를 씌웠기 때문에 MSE만큼의 왜곡은 발생하지 않는다.

python

간단한 예시로 아래의 $Y_1$과 $Y_2$ python 예제가 있다.

MAE

1
2
3
4
5
6
7
8
9
10
import numpy as np

def mean_absolute_error(y_true, y_pred):

error = 0
for yt, yp in zip(y_true, y_pred):
error = error + np.abs(yt-yp)

mae = error / len(y_true)
return mae

MSE

1
2
3
4
5
6
7
8
9
10
import numpy as np

def mean_squared_error(y_true, y_pred):

error = 0
for yt, yp in zip(y_true, y_pred):
error = error + (yt - yp) ** 2

mse = error / len(y_true)
return mse

RMSE

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

def root_rmse_squared_error(y_true, y_pred):
error = 0

for yt, yp in zip(y_true, y_pred):
error = error + (yt - yp) ** 2

mse = error / len(y_true)
rmse = np.round(np.sqrt(mse), 3)
return rmse
1
2
3
4
5
y1_true = [400, 300, 800]
y1_pred = [380, 320, 777]

y2_true = [400, 300, 800, 900]
y2_pred = [380, 320, 777, 600]
1
2
3
print("MAE:", mean_absolute_error(y1_true, y1_pred))
print("MSE:", mean_squared_error(y1_true, y1_pred))
print("RMSE:", root_rmse_squared_error(y1_true, y1_pred))
MAE: 21.0
MSE: 443.0
RMSE: 21.048
1
2
3
print("MAE:", mean_absolute_error(y2_true, y2_pred))
print("MSE:", mean_squared_error(y2_true, y2_pred))
print("RMSE:", root_rmse_squared_error(y2_true, y2_pred))
MAE: 90.75
MSE: 22832.25
RMSE: 151.103

오차값이 20~30 사이에서 놀다가 $\Delta y=300$인 이상값이 하나 들어가면서 지표가 지나치게 커짐을 확인할 수 있다.
마찬가지로 MSE와 RMSE의 왜곡 차이도 확연히 드러난다.