diff --git a/docs/blog/posts/2022-01-02-customize_minimal_mistakes.md b/docs/blog/posts/2022-01-02-customize_minimal_mistakes.md index 9847b117..74a67695 100644 --- a/docs/blog/posts/2022-01-02-customize_minimal_mistakes.md +++ b/docs/blog/posts/2022-01-02-customize_minimal_mistakes.md @@ -26,8 +26,8 @@ Minimal Mistakes 테마 커스터마이징 방법 ### 1-1. 스킨 수정 스킨을 수정하고 싶을 때는 -1. `/assets/css/main.scss`에 입력해서 오버라이드 하거나 -2. `/_sass/minimal-mistakes/skins`에서 각 스킨들을 직접 건드리면 된다. +1. `/assets/css/main.scss`에 입력해서 오버라이드 하거나 +1. `/_sass/minimal-mistakes/skins`에서 각 스킨들을 직접 건드리면 된다. 나는 default 스킨만 조금 수정하고 다른 스킨들은 건드리기 싫어서 `/_sass/minimal-mistakes/skins/_default.scss`에 아래와 같은 내용을 추가해줬다. @@ -66,7 +66,7 @@ $navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; ### 1-2. 줄간격 조정 Minimal Mistakes는 기본 줄간격이 너무 좁아 가독성이 떨어진다. 줄간격을 조정하려면 `/_sass/_page.scss`를 수정해주면 된다. -나는 아래와 같이 `.page__content`의 `p`에 `line-height`를 추가해서 문단 스타일을 수정했다. +나는 아래와 같이 `.page__content`의 `p`에 `line-height`를 추가해서 문단 스타일을 수정했다. ```scss title="_page.scss" .page__content { @@ -225,7 +225,7 @@ GitHub Pages에 수학식을 출력하는 방법은 여러 가지가 있는데, ``` -`/_layouts/default.html`의 `
` 부분에 아래 내용 추가 +`/_layouts/default.html`의 `` 부분에 아래 내용 추가 ```html title="default.html" @@ -236,17 +236,17 @@ GitHub Pages에 수학식을 출력하는 방법은 여러 가지가 있는데, ``` -수식을 사용할 포스트의 `YFM`을 아래와 같이 설정 +수식을 사용할 포스트의 `YFM`을 아래와 같이 설정 ```yaml mathjax: true ``` -글 작성 시 수식 입력 방법은 [여기](2022-01-04-blog_markdown.md/#수식-입력)에서 확인할 수 있다. +글 작성 시 수식 입력 방법은 [여기](./2022-01-04-blog_markdown.md/#수식-입력)에서 확인할 수 있다. ## 4. favicon 설정 -`/assets/images/logo.ico` 폴더에 favicon 파일들 저장 후 `/_includes/head/custom.html`에 아래 내용 추가 +`/assets/images/logo.ico` 폴더에 favicon 파일들 저장 후 `/_includes/head/custom.html`에 아래 내용 추가 ```html title="custom.html" @@ -339,7 +339,7 @@ gem 'tzinfo' gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw] ``` -Minimal Mistakes의 [Configuration](https://mmistakes.github.io/minimal-mistakes/docs/configuration/) 문서에 따르면 default는 os에 설정된 local timezone으로 설정되어 있기 때문에 어지간해서는 굳이 설정할 필요는 없다. +Minimal Mistakes의 [Configuration](https://mmistakes.github.io/minimal-mistakes/docs/configuration/) 문서에 따르면 default는 os에 설정된 local timezone으로 설정되어 있기 때문에 어지간해서는 굳이 설정할 필요는 없다. --- ## Reference diff --git a/docs/blog/posts/2022-01-03-googling_stuff_online.md b/docs/blog/posts/2022-01-03-googling_stuff_online.md index f35093e8..3e1934c4 100644 --- a/docs/blog/posts/2022-01-03-googling_stuff_online.md +++ b/docs/blog/posts/2022-01-03-googling_stuff_online.md @@ -19,7 +19,7 @@ tags: 언젠가부터 아래와 같은 meme이 웹 상에 떠돌아다닌다. -![googling_stuff_online_does_not_make_you_a_doctor](img/googling_stuff_online_does_not_make_you_a_doctor.jpg){ loading=lazy } +![googling_stuff_online_does_not_make_you_a_doctor](./img/googling_stuff_online_does_not_make_you_a_doctor.jpg){ loading=lazy } 구글링이 의사를 만들어주지는 않지만, 프로그래머는 만들어준다는 의미인데 나에게 너무 잘 맞는 말로 느껴진다. diff --git a/docs/blog/posts/2022-01-04-blog_markdown.md b/docs/blog/posts/2022-01-04-blog_markdown.md index fbda9636..b6c08ef6 100644 --- a/docs/blog/posts/2022-01-04-blog_markdown.md +++ b/docs/blog/posts/2022-01-04-blog_markdown.md @@ -40,10 +40,10 @@ GitHub Pages 작성에 유용한 마크다운 팁 정리 이미지를 삽입하려면 이미지를 어딘가에 업로드 하고 링크를 걸면 된다. ``` -![yagongman_Dijkstra](img/yagongman_Dijkstra.png) +![yagongman_Dijkstra](./img/yagongman_Dijkstra.png) ``` -![yagongman_Dijkstra](img/yagongman_Dijkstra.png){ loading=lazy } +![yagongman_Dijkstra](./img/yagongman_Dijkstra.png){ loading=lazy } ### 동영상 삽입 diff --git a/docs/blog/posts/2022-01-06-about_PEP.md b/docs/blog/posts/2022-01-06-about_PEP.md index b758dde6..7b6459a3 100644 --- a/docs/blog/posts/2022-01-06-about_PEP.md +++ b/docs/blog/posts/2022-01-06-about_PEP.md @@ -60,7 +60,7 @@ Namespaces are one honking great idea -- let's do more of those! 시적이기도 한 내용이 나오는데, 아마도 이런 철학이 python만의 pythonic한 문화를 만드는데 기반이 되지 않았을까 한다. -![python_pep](img/python_pep.png){ loading=lazy } +![python_pep](./img/python_pep.png){ loading=lazy } ## 2. PEP 8 - Style Guide for Python Code diff --git a/docs/blog/posts/2022-01-08-count_runtime.md b/docs/blog/posts/2022-01-08-count_runtime.md index d1b2f572..f753b9a7 100644 --- a/docs/blog/posts/2022-01-08-count_runtime.md +++ b/docs/blog/posts/2022-01-08-count_runtime.md @@ -50,7 +50,7 @@ print(time_end - time_start) ## 3. 💡with 사용 -아래와 같이 `with` 문법을 통해 특정 구간의 실행 시간을 간편하게 측정할 수 있다. 자세한 내용은 [with 문법 심화 활용 포스팅](2023-11-25-understanding_with.md) 참고 +아래와 같이 `with` 문법을 통해 특정 구간의 실행 시간을 간편하게 측정할 수 있다. 자세한 내용은 [with 문법 심화 활용 포스팅](./2023-11-25-understanding_with.md) 참고 ```python import contextlib diff --git a/docs/blog/posts/2022-01-08-csv_encoding.md b/docs/blog/posts/2022-01-08-csv_encoding.md index f3228c9b..15848301 100644 --- a/docs/blog/posts/2022-01-08-csv_encoding.md +++ b/docs/blog/posts/2022-01-08-csv_encoding.md @@ -21,7 +21,7 @@ pandas로 csv 인코딩 바꾸기 인터넷에서 가져온 csv 파일의 경우 아래와 같이 인코딩 문제로 다 깨져서 나오는 경우가 많다. -![scrap_result_2021](img/scrap_result_2021.png){ loading=lazy } +![scrap_result_2021](./img/scrap_result_2021.png){ loading=lazy } 이럴 때는 메모장으로 열어서 인코딩을 `ANSI`나 `UTF-8(BOM)`으로 변경하여 저장하면 되기는 하는데, pandas를 사용해서 바꿔주려면 아래와 같이 `encoding` 파라미터를 `'utf-8-sig'`로 지정해주면 된다. @@ -34,7 +34,7 @@ df.to_csv('FILE_NAME.csv', encoding='utf-8-sig') 결과물은 아래와 같다. -![scrap_result_2021_encoded.png](img/scrap_result_2021_encoded.png){ loading=lazy } +![scrap_result_2021_encoded.png](./img/scrap_result_2021_encoded.png){ loading=lazy } --- ## Reference diff --git a/docs/blog/posts/2022-01-08-handling_os.md b/docs/blog/posts/2022-01-08-handling_os.md index 807b678c..445a94e3 100644 --- a/docs/blog/posts/2022-01-08-handling_os.md +++ b/docs/blog/posts/2022-01-08-handling_os.md @@ -46,7 +46,7 @@ C:\projects ## 3. system() -각종 system 명령어를 실행한다. 자주 쓰는 system 명령어는 [여기](2022-01-13-manual_cmd.md)서 확인할 수 있다. +각종 system 명령어를 실행한다. 자주 쓰는 system 명령어는 [여기](./2022-01-13-manual_cmd.md)서 확인할 수 있다. 예시로 코드를 중간에 잠시 일시 정지 시키고 싶을 때는 아래와 같이 하면 된다. ```python diff --git a/docs/blog/posts/2022-01-19-linear_regression.md b/docs/blog/posts/2022-01-19-linear_regression.md index 47bd7b3e..7726b5fa 100644 --- a/docs/blog/posts/2022-01-19-linear_regression.md +++ b/docs/blog/posts/2022-01-19-linear_regression.md @@ -148,4 +148,4 @@ axes.legend() plt.show() ``` -![simple_linear_regression](img/simple_linear_regression.png){ loading=lazy } \ No newline at end of file +![simple_linear_regression](./img/simple_linear_regression.png){ loading=lazy } \ No newline at end of file diff --git a/docs/blog/posts/2022-01-21-pd_pivot_table.md b/docs/blog/posts/2022-01-21-pd_pivot_table.md index 9e72bea8..19fdfe76 100644 --- a/docs/blog/posts/2022-01-21-pd_pivot_table.md +++ b/docs/blog/posts/2022-01-21-pd_pivot_table.md @@ -167,7 +167,7 @@ yes no 6540 3968.000000 2175 15 ## 2. pandas.DataFrame.groupby -`groupby`는 `pivot_table`과 비슷한 기능을 하는 `DataFrame`의 메서드로 SQL의 [GROUP BY](2022-08-13-sql_where_groupby.md/#3-group-by) 명령어와 유사하게 작동한다. `pandas.DataFrame.groupby`의 주요 파라미터는 아래와 같다. +`groupby`는 `pivot_table`과 비슷한 기능을 하는 `DataFrame`의 메서드로 SQL의 [GROUP BY](./2022-08-13-sql_where_groupby.md/#3-group-by) 명령어와 유사하게 작동한다. `pandas.DataFrame.groupby`의 주요 파라미터는 아래와 같다. - `by`: 요약될 칼럼 - `axis`: 0 or 'index', 1 or 'columns' diff --git a/docs/blog/posts/2022-01-23-regression_statsmodels.md b/docs/blog/posts/2022-01-23-regression_statsmodels.md index a03543d1..bf0c7b25 100644 --- a/docs/blog/posts/2022-01-23-regression_statsmodels.md +++ b/docs/blog/posts/2022-01-23-regression_statsmodels.md @@ -227,7 +227,7 @@ res = smf.ols(formula='Lottery ~ np.log(Literacy)', data=df).fit() - BIC: AIC와 유사하나 패널티를 부여하여 AIC보다 모델 평가 성능이 더 좋으며, 수치가 낮을수록 좋음 - **coef: 변수의 coefficient(계수)**, 각 독립변수가 종속변수의 변화에 미치는 영향의 정도 -- std err: 계수의 [표준오차](2023-02-15-sampling_distribution.md/#1-3-표본분포)(표본 통계량의 표준편차), 값이 작을수록 좋음 +- std err: 계수의 [표준오차](./2023-02-15-sampling_distribution.md/#1-3-표본분포)(표본 통계량의 표준편차), 값이 작을수록 좋음 - t: 독립변수와 종속변수간에 선형관계(관련성)가 존재하는 정도, 값이 클수록 상관도가 큼 - t 값이 크다 = 표준편차가 작다 = 독립-종속변수 간 상관도 높음 - t 값이 작다 = 표준편차가 크다 = 독립-종속변수 간 상관도 낮음 diff --git a/docs/blog/posts/2022-01-24-regression_assumption.md b/docs/blog/posts/2022-01-24-regression_assumption.md index b02b5d00..58f7a69f 100644 --- a/docs/blog/posts/2022-01-24-regression_assumption.md +++ b/docs/blog/posts/2022-01-24-regression_assumption.md @@ -65,7 +65,7 @@ sns.pairplot( plt.show() ``` -![iris_pairplot](img/iris_pairplot.png){ loading=lazy } +![iris_pairplot](./img/iris_pairplot.png){ loading=lazy } 만약 Sepal_Length를 예측하려고 하는 종속변수라고 한다면, 위 그래프를 보았을 때 Sepal_Length와 대략적인 선형관계를 이루고 있는 변수는 Petal_Length와 Petal_Width이고, 선형성을 만족하지 않는 것은 Sepal_Width인 것으로 보인다. @@ -128,7 +128,7 @@ sns.pairplot( plt.show() ``` -![iris_pairplot](img/iris_pairplot_2.png){ loading=lazy } +![iris_pairplot](./img/iris_pairplot_2.png){ loading=lazy } Petal_Length와 Petal_Width의 영향도를 제거한 Rest_Sepal_Width를 Sepal_Width와 비교해보면 선형성이 아주 약간 생긴 것을 확인할 수 있다. @@ -220,7 +220,7 @@ ax = sns.heatmap( plt.show() ``` -![iris_corr](img/iris_corr.png){ loading=lazy } +![iris_corr](./img/iris_corr.png){ loading=lazy } Petal_Length와 Petal_Width의 상관성이 0.96으로 매우 높게 나오는데, 독립변수 간의 상관성이 있을 경우 다중공선성(Multicollinearity)이 있다고 표현되며, 분산팽창요인(VIF, Variance Inflation Factors)을 통해 다중공선성을 계산할 수 있다. VIF를 계산하는 공식은 아래와 같고, ${R^{2}_{i}}$은 $i$ 번째 독립변수에 대해 다른 독립변수들로 회귀분석을 시행한 선형 모델의 $R^{2}$라는 뜻이다. diff --git a/docs/blog/posts/2022-04-01-iqr_method.md b/docs/blog/posts/2022-04-01-iqr_method.md index ab7d53bb..fa4f90f7 100644 --- a/docs/blog/posts/2022-04-01-iqr_method.md +++ b/docs/blog/posts/2022-04-01-iqr_method.md @@ -53,7 +53,7 @@ scikit-learn 패키지의 경우 **outlier detection**와 **novelty detection** 앞서 소개한 네 가지 이상점 처리 방법 중에 가장 편하게 많이 사용되는 방식은 $IQR$ 방식의 이상점 탐지 및 제거로, 기본 원리는 아래 그림과 같다. -![IQR](img/iqr.jpg){ loading=lazy } +![IQR](./img/iqr.jpg){ loading=lazy } ^[출처: Interquartile Range (IQR): What it is and How to Find it](https://www.statisticshowto.com/probability-and-statistics/interquartile-range/)^ $IQR$이란 **InterQuartile Range(사분위수 범위)**의 약자로, 데이터를 순서대로 나열했을 때 25% 지점(1분위수)에 있는 데이터와 75% 지점(3분위수)에 있는 데이터의 차이를 말하며, 위 그림에서 볼 수 있듯이, $IQR$ 방식에서 정상 데이터로 분류될 범위를 계산하는 방식은 아래와 같다. @@ -70,7 +70,7 @@ $$ ### 2-1. IQR 방식에서 IQR의 계수로 1.5를 사용하는 이유 -![Normal Distribution](img/Normal-Distribution-curve.jpg){ loading=lazy } +![Normal Distribution](./img/Normal-Distribution-curve.jpg){ loading=lazy } ^[출처: 9 Real Life Examples Of Normal Distribution](https://studiousguy.com/real-life-examples-normal-distribution/)^ 통계학 기본을 공부 했다면 위 그림과 같은 표준 정규분포 그래프를 본 적이 있을 텐데, 약 $\pm 2 \sigma$에서 95%, 약 $\pm 3 \sigma$에서 99% 수준으로 표준 정규분포에 들어가게 되고, 분야에 따라 다르지만 일반적으로 $\pm 3 \sigma$를 의미 있는 데이터로 본다. ([표준정규분포표 보러가기](https://en.wikipedia.org/wiki/Standard_normal_table#Cumulative(less_than_Z))) @@ -134,7 +134,7 @@ $$ 좀 더 정확한 계산값을 사용하고 싶을 때는 $1.7$을 계수로 사용하면 정상 데이터의 범위가 $\pm 2.97 \sigma$이 되어 $\pm 3 \sigma$에 좀 더 가까운 결과가 나오게 된다. !!! note - 실제 데이터의 분포에 상관없이 표준 정규분포를 가정하고 IQR 방식을 사용할 수 있는 이유는 [중심극한정리](2023-02-15-sampling_distribution.md/#2-2-중심극한정리)[^1]가 이론적 배경이라고 한다. 중심극한정리는 모집단이 어떤 분포를 가지고 있던지 간에 (모집단 분포가 어떤 모양이던 상관없이) 일단 표본의 크기가 충분히 크다면 표본평균들의 분포가 모집단의 모수를 기반으로한 정규분포를 이룬다는 정리이다. + 실제 데이터의 분포에 상관없이 표준 정규분포를 가정하고 IQR 방식을 사용할 수 있는 이유는 [중심극한정리](./2023-02-15-sampling_distribution.md/#2-2-중심극한정리)[^1]가 이론적 배경이라고 한다. 중심극한정리는 모집단이 어떤 분포를 가지고 있던지 간에 (모집단 분포가 어떤 모양이던 상관없이) 일단 표본의 크기가 충분히 크다면 표본평균들의 분포가 모집단의 모수를 기반으로한 정규분포를 이룬다는 정리이다. [^1]: [위키피디아 - 중심 극한 정리](https://ko.wikipedia.org/wiki/%EC%A4%91%EC%8B%AC_%EA%B7%B9%ED%95%9C_%EC%A0%95%EB%A6%AC) diff --git a/docs/blog/posts/2022-05-01-linear_algebra_vector_scalar.md b/docs/blog/posts/2022-05-01-linear_algebra_vector_scalar.md index ab898c2e..ec832da3 100644 --- a/docs/blog/posts/2022-05-01-linear_algebra_vector_scalar.md +++ b/docs/blog/posts/2022-05-01-linear_algebra_vector_scalar.md @@ -56,7 +56,7 @@ $$ 두 벡터의 합 $\textbf{u} + \textbf{v}$는 $\textbf{u}$의 종점에 $\textbf{v}$의 시점을 일치시켰을 때, $\textbf{u}$의 시점을 시점으로, $\textbf{v}$의 종점을 종점으로 하는 벡터를 뜻하고, 두 백터의 차 $\textbf{u} - \textbf{v}$는 $\textbf{u}$의 시점에 $\textbf{v}$의 시점을 일치시켰을 때, $\textbf{v}$의 종점을 시점으로, $\textbf{u}$의 종점을 종점으로 하는 벡터를 뜻한다. -![Vector_Addition](img/Vector_Addition.png){ loading=lazy width="50%" } +![Vector_Addition](./img/Vector_Addition.png){ loading=lazy width="50%" } ^[출처: wikimedia - Vector_Addition.png](https://commons.wikimedia.org/wiki/File:Vector_Addition.png)^ 벡터의 덧셈과 뺄셈은 동일 위치의 각 원소를 더하고 빼는 것으로, 교환 법칙이 성립하며 두 벡터의 크기가 동일할 때(벡터를 구성하는 스칼라의 개수가 동일할 때)만 연산이 가능하다. Python으로 구현하면 아래와 같다. diff --git a/docs/blog/posts/2022-05-19-linear_algebra_various_matrix.md b/docs/blog/posts/2022-05-19-linear_algebra_various_matrix.md index 6e066806..d4cc27ba 100644 --- a/docs/blog/posts/2022-05-19-linear_algebra_various_matrix.md +++ b/docs/blog/posts/2022-05-19-linear_algebra_various_matrix.md @@ -440,7 +440,7 @@ $$ ## 8. 하우스홀더 행렬 -**하우스홀더 행렬(householder matrix)**은 모든 열이 [정규 직교(orthonormal)](2022-06-06-linear_algebra_orthogonal_qr_decomposition.md/#1-직교-공간)하는 정사각 행렬로, 아래와 같은 수식을 따르는 행렬 $H$를 말한다. +**하우스홀더 행렬(householder matrix)**은 모든 열이 [정규 직교(orthonormal)](./2022-06-06-linear_algebra_orthogonal_qr_decomposition.md/#1-직교-공간)하는 정사각 행렬로, 아래와 같은 수식을 따르는 행렬 $H$를 말한다. $$ \textbf{v} = \begin{bmatrix} @@ -452,7 +452,7 @@ v_{n} \to H = I - 2\frac{\textbf{vv}^{T}}{\textbf{v}^{T}\textbf{v}} $$ -${\textbf{vv}^{T}}$은 [벡터의 외적](2022-06-09-linear_algebra_various_products.md/#1-외적), ${\textbf{v}^{T}\textbf{v}}$은 [벡터의 내적](2022-06-05-linear_algebra_inner_product_norm.md/#1-내적)을 뜻하기 때문에 하우스홀더 행렬 공식을 Python으로 구현하기 위해서는 벡터의 내적과 외적의 함수를 먼저 구현해야 한다. +${\textbf{vv}^{T}}$은 [벡터의 외적](./2022-06-09-linear_algebra_various_products.md/#1-외적), ${\textbf{v}^{T}\textbf{v}}$은 [벡터의 내적](./2022-06-05-linear_algebra_inner_product_norm.md/#1-내적)을 뜻하기 때문에 하우스홀더 행렬 공식을 Python으로 구현하기 위해서는 벡터의 내적과 외적의 함수를 먼저 구현해야 한다. === "Python" diff --git a/docs/blog/posts/2022-05-22-linear_algebra_linear_system.md b/docs/blog/posts/2022-05-22-linear_algebra_linear_system.md index 081c066b..b3864b39 100644 --- a/docs/blog/posts/2022-05-22-linear_algebra_linear_system.md +++ b/docs/blog/posts/2022-05-22-linear_algebra_linear_system.md @@ -19,7 +19,7 @@ tags: ## 1. 선형 방정식 -**선형 방정식(linear equation)**이란 아래와 같이 변수인 $x_{n}$과 상수인 $\beta_{n}$이 [선형 결합](2022-05-29-linear_algebra_basis_dimension.md/#3-선형-결합과-선형-독립)되어 **선형(linear)**으로 표현 되는 1차 방정식을 말한다. +**선형 방정식(linear equation)**이란 아래와 같이 변수인 $x_{n}$과 상수인 $\beta_{n}$이 [선형 결합](./2022-05-29-linear_algebra_basis_dimension.md/#3-선형-결합과-선형-독립)되어 **선형(linear)**으로 표현 되는 1차 방정식을 말한다. $$ \beta_{0} + \beta_{1}x_{1} + \beta_{2}x_{2} + \cdots + \beta_{n}x_{n} = y @@ -182,9 +182,9 @@ $$ ### 가우스-조르단 소거법 -주어진 선형 시스템을 [기본 행 연산](2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)을 통해 기약 행사다리꼴 행렬의 형태로 만들어 방정식의 해를 구하는 방법을 **가우스-조르단 소거법(Gauss Jordan elimination)**이라고 한다. +주어진 선형 시스템을 [기본 행 연산](./2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)을 통해 기약 행사다리꼴 행렬의 형태로 만들어 방정식의 해를 구하는 방법을 **가우스-조르단 소거법(Gauss Jordan elimination)**이라고 한다. -[Wolfram](https://mathworld.wolfram.com/Gauss-JordanElimination.html)에 따르면 가우스-조르단 소거법은 [역행렬](2022-05-28-linear_algebra_inverse_matrix.md)을 구하기 위한 방법이지만 응용해서 선형 시스템을 해를 구할 때도 사용할 수 있다. 아무튼 Python으로 구현하면 아래와 같다. +[Wolfram](https://mathworld.wolfram.com/Gauss-JordanElimination.html)에 따르면 가우스-조르단 소거법은 [역행렬](./2022-05-28-linear_algebra_inverse_matrix.md)을 구하기 위한 방법이지만 응용해서 선형 시스템을 해를 구할 때도 사용할 수 있다. 아무튼 Python으로 구현하면 아래와 같다. === "Python" diff --git a/docs/blog/posts/2022-05-23-linear_algebra_determinant.md b/docs/blog/posts/2022-05-23-linear_algebra_determinant.md index b8fcc66b..1108760c 100644 --- a/docs/blog/posts/2022-05-23-linear_algebra_determinant.md +++ b/docs/blog/posts/2022-05-23-linear_algebra_determinant.md @@ -106,13 +106,13 @@ $$ ### 특이한 행렬의 행렬식 -[삼각 행렬](2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬), [대각 행렬](2022-05-19-linear_algebra_various_matrix.md/#3-대각-행렬)의 행렬식은 주 대각 원소의 곱과 같다. +[삼각 행렬](./2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬), [대각 행렬](./2022-05-19-linear_algebra_various_matrix.md/#3-대각-행렬)의 행렬식은 주 대각 원소의 곱과 같다. $$ \det(A) = a_{11} a_{22} \cdots a_{nn} $$ -[전치 행렬](2022-05-19-linear_algebra_various_matrix.md/#1-전치-행렬)의 행렬식: 행렬 $A$가 정사각 행렬일 경우 행렬 $A$와 그 전치 행렬 $A^{T}$의 행렬식은 동일하다. +[전치 행렬](./2022-05-19-linear_algebra_various_matrix.md/#1-전치-행렬)의 행렬식: 행렬 $A$가 정사각 행렬일 경우 행렬 $A$와 그 전치 행렬 $A^{T}$의 행렬식은 동일하다. $$ \det(A) = \det(A)^{T} @@ -122,7 +122,7 @@ $$ ### 행렬의 기본 행 연산과 행렬식 -[기본 행 연산](2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)에 의한 행렬식의 변경은 아래와 같다. +[기본 행 연산](./2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)에 의한 행렬식의 변경은 아래와 같다. - 한 행에 영이 아닌 상수를 모두 곱한다. diff --git a/docs/blog/posts/2022-05-28-linear_algebra_inverse_matrix.md b/docs/blog/posts/2022-05-28-linear_algebra_inverse_matrix.md index fb9099ec..669bc901 100644 --- a/docs/blog/posts/2022-05-28-linear_algebra_inverse_matrix.md +++ b/docs/blog/posts/2022-05-28-linear_algebra_inverse_matrix.md @@ -51,7 +51,7 @@ $$ ### n * n 행렬의 역행렬 -n * n 행렬의 역행렬을 구하는 방법은 행렬식에서 다룬 [수반 행렬](2022-05-23-linear_algebra_determinant.md/#수반-행렬)을 사용해야 한다. 구하는 방법은 아래와 같다. +n * n 행렬의 역행렬을 구하는 방법은 행렬식에서 다룬 [수반 행렬](./2022-05-23-linear_algebra_determinant.md/#수반-행렬)을 사용해야 한다. 구하는 방법은 아래와 같다. $$ A^{-1} = \frac{\text{adj}(A)}{\det(A)} @@ -59,7 +59,7 @@ $$ ## 2. 역행렬 계산 -역행렬을 구하는 방법은 다양하지만, 앞서 다뤘던 [가우스-조르단 소거법(Gauss Jordan elimination)](2022-05-22-linear_algebra_linear_system.md/#가우스-조르단-소거법)을 사용하는 것이 가장 간편하다. 절차는 아래와 같다. +역행렬을 구하는 방법은 다양하지만, 앞서 다뤘던 [가우스-조르단 소거법(Gauss Jordan elimination)](./2022-05-22-linear_algebra_linear_system.md/#가우스-조르단-소거법)을 사용하는 것이 가장 간편하다. 절차는 아래와 같다. - 행렬 $A$의 오른쪽에 같은 크기를 갖는 단위 행렬 $I$를 첨가해 아래와 같이 첨가 행렬 $[A \vert I]$를 만든다. @@ -71,7 +71,7 @@ $$ \end{array} \right] $$ -- 이 행렬을 [기본 행 연산](2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)을 통해 아래와 같이 $[I \vert B]$를 만든다. +- 이 행렬을 [기본 행 연산](./2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)을 통해 아래와 같이 $[I \vert B]$를 만든다. $$ [I|B] = \left[ \begin{array}{ccc|ccc} diff --git a/docs/blog/posts/2022-05-29-linear_algebra_basis_dimension.md b/docs/blog/posts/2022-05-29-linear_algebra_basis_dimension.md index ec8aba20..6fcfb47a 100644 --- a/docs/blog/posts/2022-05-29-linear_algebra_basis_dimension.md +++ b/docs/blog/posts/2022-05-29-linear_algebra_basis_dimension.md @@ -75,7 +75,7 @@ $$ \end{gathered} $$ -위 표기에서 $\text{sgn}$은 부호 함수를 뜻하며, $\Vert \textbf{u} \Vert$는 [노름(norm)](2022-06-05-linear_algebra_inner_product_norm.md/#2-norm)을 뜻한다. +위 표기에서 $\text{sgn}$은 부호 함수를 뜻하며, $\Vert \textbf{u} \Vert$는 [노름(norm)](./2022-06-05-linear_algebra_inner_product_norm.md/#2-norm)을 뜻한다. !!! info 참고로 **^** 기호를 수학에서 **Hat(모자)** 기호라고 부르는데, 상황에 따라 단위 벡터, 추정량 등 의미가 달라진다. 자세한 내용은 [위키피디아](https://en.wikipedia.org/wiki/Hat_operator)를 참고하자. diff --git a/docs/blog/posts/2022-05-30-list_comprehension.md b/docs/blog/posts/2022-05-30-list_comprehension.md index 64b18c7a..491c046d 100644 --- a/docs/blog/posts/2022-05-30-list_comprehension.md +++ b/docs/blog/posts/2022-05-30-list_comprehension.md @@ -38,7 +38,7 @@ print(b) [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] ``` -[선형대수](../../pages/tags.md/#linear-algebra)를 공부하면서 list comprehension을 많이 사용했는데, 자세한 내용은 [여기](2022-05-19-linear_algebra_various_matrix.md), [여기](2022-05-22-linear_algebra_linear_system.md), [여기](2022-06-06-linear_algebra_orthogonal_qr_decomposition.md)를 참고하자. +[선형대수](../../pages/tags.md/#linear-algebra)를 공부하면서 list comprehension을 많이 사용했는데, 자세한 내용은 [여기](./2022-05-19-linear_algebra_various_matrix.md), [여기](./2022-05-22-linear_algebra_linear_system.md), [여기](./2022-06-06-linear_algebra_orthogonal_qr_decomposition.md)를 참고하자. ## for + if diff --git a/docs/blog/posts/2022-06-05-linear_algebra_inner_product_norm.md b/docs/blog/posts/2022-06-05-linear_algebra_inner_product_norm.md index b70873eb..29c2e475 100644 --- a/docs/blog/posts/2022-06-05-linear_algebra_inner_product_norm.md +++ b/docs/blog/posts/2022-06-05-linear_algebra_inner_product_norm.md @@ -21,7 +21,7 @@ tags: ### 내적의 개념 -[벡터 공간](2022-05-29-linear_algebra_basis_dimension.md/#1-벡터-공간)의 설명에서 언급했듯이 **내적(inner product)**이 주어진 벡터 공간을 **내적 공간(inner product space)**이라고 부르는데, 벡터의 **내적(inner product)**은 벡터를 방향이 일치하는 만큼만 곱한다는 뜻으로 아래와 같이 표기한다. +[벡터 공간](./2022-05-29-linear_algebra_basis_dimension.md/#1-벡터-공간)의 설명에서 언급했듯이 **내적(inner product)**이 주어진 벡터 공간을 **내적 공간(inner product space)**이라고 부르는데, 벡터의 **내적(inner product)**은 벡터를 방향이 일치하는 만큼만 곱한다는 뜻으로 아래와 같이 표기한다. $$ \textbf{u} @@ -42,7 +42,7 @@ $$ \langle \textbf{u}, \textbf{v} \rangle = \textbf{u} \cdot \textbf{v} = \textbf{u}^{T} \textbf{v} = \sum_{i=1}^{n}u_{i}v_{i} = \vert \textbf{u} \vert \vert \textbf{v} \vert \cos \theta $$ -벡터의 내적을 Python으로 구현하면 아래와 같다. [하우스홀더 행렬](2022-05-19-linear_algebra_various_matrix.md/#8-하우스홀더-행렬) 공식에서 이미 구현한 바 있다. +벡터의 내적을 Python으로 구현하면 아래와 같다. [하우스홀더 행렬](./2022-05-19-linear_algebra_various_matrix.md/#8-하우스홀더-행렬) 공식에서 이미 구현한 바 있다. === "Python" diff --git a/docs/blog/posts/2022-06-06-linear_algebra_orthogonal_qr_decomposition.md b/docs/blog/posts/2022-06-06-linear_algebra_orthogonal_qr_decomposition.md index 89c40d6f..63c91961 100644 --- a/docs/blog/posts/2022-06-06-linear_algebra_orthogonal_qr_decomposition.md +++ b/docs/blog/posts/2022-06-06-linear_algebra_orthogonal_qr_decomposition.md @@ -21,7 +21,7 @@ tags: ### 직교, 정규 직교 벡터, 정규 직교 공간, 정규화 -**직교(orthogonal)**란 두 직선 또는 두 평면이 직각을 이루며 만나는 것을 의미한다. 직교하는 두 벡터의 길이가 각 1([단위 벡터](2022-05-29-linear_algebra_basis_dimension.md/#단위-벡터))이면 **정규 직교(orthonomal)**한다고 말하고, 정규 직교 하는 벡터들을 **정규 직교 벡터(orthonormal vector)**, 정규 직교 벡터가 만드는 공간을 **정규 직교 공간(orthonormal space)**이라고 한다. 직교 벡터를 정규 직교 벡터로 **정규화(normalization)** 하는 방법은 아래와 같다. +**직교(orthogonal)**란 두 직선 또는 두 평면이 직각을 이루며 만나는 것을 의미한다. 직교하는 두 벡터의 길이가 각 1([단위 벡터](./2022-05-29-linear_algebra_basis_dimension.md/#단위-벡터))이면 **정규 직교(orthonomal)**한다고 말하고, 정규 직교 하는 벡터들을 **정규 직교 벡터(orthonormal vector)**, 정규 직교 벡터가 만드는 공간을 **정규 직교 공간(orthonormal space)**이라고 한다. 직교 벡터를 정규 직교 벡터로 **정규화(normalization)** 하는 방법은 아래와 같다. $$ \textbf{v}_{n} = \frac{\textbf{u}_{n}}{\Vert \textbf{u}_{n} \Vert} @@ -170,7 +170,7 @@ $$ ## 3. 그람-슈미트 과정 -**그람-슈미트 과정(Gram-Schmidt Process)**은 [기저(basis) 벡터](2022-05-29-linear_algebra_basis_dimension.md/#기저-벡터) $\{ \textbf{s}_{1}, \textbf{s}_{2}, \cdots, \textbf{s}_{n} \}$를 [직교 기저(orthogonal basis) 벡터](#직교-정규-직교-벡터-정규-직교-공간-정규화) $\{ \textbf{u}_{1}, \textbf{u}_{2}, \cdots, \textbf{u}_{n} \}$로 변환하는 과정을 의미한다. 그람-슈미트 과정은 다음과 같은 단계로 진행 된다. +**그람-슈미트 과정(Gram-Schmidt Process)**은 [기저(basis) 벡터](./2022-05-29-linear_algebra_basis_dimension.md/#기저-벡터) $\{ \textbf{s}_{1}, \textbf{s}_{2}, \cdots, \textbf{s}_{n} \}$를 [직교 기저(orthogonal basis) 벡터](#직교-정규-직교-벡터-정규-직교-공간-정규화) $\{ \textbf{u}_{1}, \textbf{u}_{2}, \cdots, \textbf{u}_{n} \}$로 변환하는 과정을 의미한다. 그람-슈미트 과정은 다음과 같은 단계로 진행 된다. - 1) 기존 기저 벡터 $\textbf{s}_{1}$을 통해 새로운 직교 기저 벡터 $\textbf{u}_{1}$을 정의한다. @@ -196,7 +196,7 @@ $$ 이 과정을 그림으로 표현하면 아래와 같다. -![Gram-Schmidt_orthonormalization_process](img/Gram-Schmidt_orthonormalization_process.gif){ loading=lazy } +![Gram-Schmidt_orthonormalization_process](./img/Gram-Schmidt_orthonormalization_process.gif){ loading=lazy } ^[출처: 위키피디아 그람-슈미트 과정](https://ko.wikipedia.org/wiki/%EA%B7%B8%EB%9E%8C-%EC%8A%88%EB%AF%B8%ED%8A%B8_%EA%B3%BC%EC%A0%95)([영문](https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process))^ 앞서 구현한 함수들을 바탕으로 Python으로 구현하면 아래와 같다. @@ -301,9 +301,9 @@ $$ ### 하우스홀더 행렬을 이용한 QR분해 -[하우스홀더 행렬](2022-05-19-linear_algebra_various_matrix.md/#8-하우스홀더-행렬)을 사용해서 구하는 방법도 있다. 그람-슈미트 방법과는 달리 부동소수점 연산에서도 오차가 누적되지 않기 때문에 더 많이 활용된다고 한다. 하우스홀더 행렬을 사용한 QR분해 방법은 다음과 같다. +[하우스홀더 행렬](./2022-05-19-linear_algebra_various_matrix.md/#8-하우스홀더-행렬)을 사용해서 구하는 방법도 있다. 그람-슈미트 방법과는 달리 부동소수점 연산에서도 오차가 누적되지 않기 때문에 더 많이 활용된다고 한다. 하우스홀더 행렬을 사용한 QR분해 방법은 다음과 같다. -- 1) 주어진 행렬 $A$를 통해 $\textbf{v}_{1}$를 구한다. 아래 식에서 $sign$은 벡터의 첫 스칼라의 부호로, 0 이상이면 $+$, 0 미만이면 $-$가 된다. $\textbf{e}_{1}$은 [기저 벡터](2022-05-29-linear_algebra_basis_dimension.md/#기저-벡터)를 말한다. +- 1) 주어진 행렬 $A$를 통해 $\textbf{v}_{1}$를 구한다. 아래 식에서 $sign$은 벡터의 첫 스칼라의 부호로, 0 이상이면 $+$, 0 미만이면 $-$가 된다. $\textbf{e}_{1}$은 [기저 벡터](./2022-05-29-linear_algebra_basis_dimension.md/#기저-벡터)를 말한다. $$ A_{1} = A = \begin{bmatrix} @@ -333,7 +333,7 @@ a_{41}\end{bmatrix}, \quad \end{align*} $$ -- 2) 위에서 구한 $\textbf{v}_{1}$를 통해서 [하우스홀더 행렬](2022-05-19-linear_algebra_various_matrix.md/#8-하우스홀더-행렬)을 구한다. +- 2) 위에서 구한 $\textbf{v}_{1}$를 통해서 [하우스홀더 행렬](./2022-05-19-linear_algebra_various_matrix.md/#8-하우스홀더-행렬)을 구한다. $$ \begin{align*} @@ -496,7 +496,7 @@ Python으로 구현하면 아래와 같다. q, r = linalg.qr(s) ``` -??? note "중간의 3중첩 [list comprehension](2022-05-30-list_comprehension.md) 풀이" +??? note "중간의 3중첩 [list comprehension](./2022-05-30-list_comprehension.md) 풀이" ```python h_list = [] diff --git a/docs/blog/posts/2022-06-09-linear_algebra_various_products.md b/docs/blog/posts/2022-06-09-linear_algebra_various_products.md index 1c167a67..665df178 100644 --- a/docs/blog/posts/2022-06-09-linear_algebra_various_products.md +++ b/docs/blog/posts/2022-06-09-linear_algebra_various_products.md @@ -25,7 +25,7 @@ $$ \textbf{u} \otimes \textbf{v} = \textbf{u} \textbf{v}^{T} $$ -Python으로 구현하면 아래와 같다. [하우스홀더 행렬](2022-05-19-linear_algebra_various_matrix.md/#8-하우스홀더-행렬) 공식에서 이미 구현한 바 있다. +Python으로 구현하면 아래와 같다. [하우스홀더 행렬](./2022-05-19-linear_algebra_various_matrix.md/#8-하우스홀더-행렬) 공식에서 이미 구현한 바 있다. === "Python" @@ -61,7 +61,7 @@ $$ ## 2. 벡터 곱 -**벡터 곱(vector product)**은 **크로스 곱(cross product)** 또는 **가위 곱**이라고 부르기도 하는데, **3차원 공간의 벡터들 간에서만 적용할 수 있는 연산**으로, 다음과 같이 [기저 벡터](2022-05-29-linear_algebra_basis_dimension.md/#기저-벡터)를 사용해 구할 수 있다. +**벡터 곱(vector product)**은 **크로스 곱(cross product)** 또는 **가위 곱**이라고 부르기도 하는데, **3차원 공간의 벡터들 간에서만 적용할 수 있는 연산**으로, 다음과 같이 [기저 벡터](./2022-05-29-linear_algebra_basis_dimension.md/#기저-벡터)를 사용해 구할 수 있다. $$ \textbf{i} = \begin{bmatrix} @@ -106,7 +106,7 @@ v_{1} & v_{2} \\ \end{align*} $$ -벡터 곱 $\textbf{u} \times \textbf{v}$의 방향은 벡터 $\textbf{u}$와 $\textbf{v}$에 수직이고, 크기는 $\textbf{u}$와 $\textbf{v}$ 두 벡터가 이루는 정사각형의 넓이, 즉 벡터 $\textbf{u}$와 벡터 $\textbf{v}$의 벡터 곱의 [노름(norm)](2022-06-05-linear_algebra_inner_product_norm.md/#2-노름norm)과 같다. 이를 수식으로 나타내면 다음과 같다. +벡터 곱 $\textbf{u} \times \textbf{v}$의 방향은 벡터 $\textbf{u}$와 $\textbf{v}$에 수직이고, 크기는 $\textbf{u}$와 $\textbf{v}$ 두 벡터가 이루는 정사각형의 넓이, 즉 벡터 $\textbf{u}$와 벡터 $\textbf{v}$의 벡터 곱의 [노름(norm)](./2022-06-05-linear_algebra_inner_product_norm.md/#2-노름norm)과 같다. 이를 수식으로 나타내면 다음과 같다. $$ \Vert \textbf{u} \times \textbf{v} \Vert = \Vert \textbf{u} \Vert \Vert \textbf{v} \Vert \vert \sin \theta \vert @@ -129,7 +129,7 @@ res = np.cross(a, b) ### 스칼라 삼중 곱 -스칼라 삼중 곱은 아래와 같이 [행렬식](2022-05-23-linear_algebra_determinant.md)을 통해 계산한다. +스칼라 삼중 곱은 아래와 같이 [행렬식](./2022-05-23-linear_algebra_determinant.md)을 통해 계산한다. $$ \textbf{u} \cdot (\textbf{v} \times \textbf{w}) diff --git a/docs/blog/posts/2022-06-12-linear_algebra_orthogonal_matrix.md b/docs/blog/posts/2022-06-12-linear_algebra_orthogonal_matrix.md index f5dc3b3c..e8a6e284 100644 --- a/docs/blog/posts/2022-06-12-linear_algebra_orthogonal_matrix.md +++ b/docs/blog/posts/2022-06-12-linear_algebra_orthogonal_matrix.md @@ -19,7 +19,7 @@ tags: ## 1. 직교 행렬 -**직교 행렬(orthogonal matrix)**이란 어떤 행렬의 행 벡터와 열 벡터가 [정규 직교(orthonomal) 기저](2022-06-06-linear_algebra_orthogonal_qr_decomposition.md/#직교-정규-직교-벡터-정규-직교-공간-정규화)를 이루는 행렬을 의미한다. 직교 행렬은 자기 자신의 [전치 행렬](2022-05-19-linear_algebra_various_matrix.md/#1-전치-행렬)과 곱했을 때 [단위 행렬](2022-05-19-linear_algebra_various_matrix.md/#4-단위-행렬)이 되는 성질이 있기 때문에 이를 통해 주어진 행렬이 직교 행렬인지 확인할 수 있다. +**직교 행렬(orthogonal matrix)**이란 어떤 행렬의 행 벡터와 열 벡터가 [정규 직교(orthonomal) 기저](./2022-06-06-linear_algebra_orthogonal_qr_decomposition.md/#직교-정규-직교-벡터-정규-직교-공간-정규화)를 이루는 행렬을 의미한다. 직교 행렬은 자기 자신의 [전치 행렬](./2022-05-19-linear_algebra_various_matrix.md/#1-전치-행렬)과 곱했을 때 [단위 행렬](./2022-05-19-linear_algebra_various_matrix.md/#4-단위-행렬)이 되는 성질이 있기 때문에 이를 통해 주어진 행렬이 직교 행렬인지 확인할 수 있다. - 행렬 $A$가 직교 행렬일 때, @@ -86,7 +86,7 @@ $$ - 행렬 $A$가 가역 행렬이라는 말은 $P^{-1}AP$가 가역 행렬이라는 말과 같다. -- 행렬 $A$와 $P^{-1}AP$의 [랭크(rank)와 널리티(nullity)](2022-05-29-linear_algebra_basis_dimension.md/#7-랭크와-널리티)는 동일하다. +- 행렬 $A$와 $P^{-1}AP$의 [랭크(rank)와 널리티(nullity)](./2022-05-29-linear_algebra_basis_dimension.md/#7-랭크와-널리티)는 동일하다. $$ \begin{align*} diff --git a/docs/blog/posts/2022-06-13-linear_algebra_orthogonal_diagonalization.md b/docs/blog/posts/2022-06-13-linear_algebra_orthogonal_diagonalization.md index 85de62d9..4b40bbb0 100644 --- a/docs/blog/posts/2022-06-13-linear_algebra_orthogonal_diagonalization.md +++ b/docs/blog/posts/2022-06-13-linear_algebra_orthogonal_diagonalization.md @@ -21,11 +21,11 @@ tags: ### 대각화 -행렬을 [대각 행렬(diagonal matrix)](2022-05-19-linear_algebra_various_matrix.md/#3-대각-행렬)로 만드는 것을 **대각화(diagonalization)**라고 하며, $n \times n$ 행렬 $A$가 대각화 가능하려면 $n$개의 서로 다른 고유값을 가져야 한다. +행렬을 [대각 행렬(diagonal matrix)](./2022-05-19-linear_algebra_various_matrix.md/#3-대각-행렬)로 만드는 것을 **대각화(diagonalization)**라고 하며, $n \times n$ 행렬 $A$가 대각화 가능하려면 $n$개의 서로 다른 고유값을 가져야 한다. ### 직교 대각화 -[직교 닮음](2022-06-12-linear_algebra_orthogonal_matrix.md/#2-닮음)인 행렬이 대각 행렬일 때, 즉 아래 식 처럼 행렬 $A$가 행렬 $P$에 의해 대각화 될 때 직교 행렬 $P$가 행렬 $A$를 **직교 대각화(orthogonal diagonalization)**한다고 말한다. +[직교 닮음](./2022-06-12-linear_algebra_orthogonal_matrix.md/#2-닮음)인 행렬이 대각 행렬일 때, 즉 아래 식 처럼 행렬 $A$가 행렬 $P$에 의해 대각화 될 때 직교 행렬 $P$가 행렬 $A$를 **직교 대각화(orthogonal diagonalization)**한다고 말한다. $$ D = P^{-1}AP = P^{T}AP @@ -38,7 +38,7 @@ $n \times n$ 행렬 $A$가 직교 대각화가 가능하려면 다음 조건을 ## 2. 고유값 분해 -**고유값 분해(eigenvalue decomposition)**는 직교 대각화의 한 종류로, 아래와 같이 정사각 행렬을 [고유값과 고유 벡터](2022-06-11-linear_algebra_eigenvalue_eigenvector.md)의 곱으로 분해하는 것을 의미한다. +**고유값 분해(eigenvalue decomposition)**는 직교 대각화의 한 종류로, 아래와 같이 정사각 행렬을 [고유값과 고유 벡터](./2022-06-11-linear_algebra_eigenvalue_eigenvector.md)의 곱으로 분해하는 것을 의미한다. $$ \begin{align*} @@ -62,7 +62,7 @@ $$ 위 식에서 $\lambda_{1}, \lambda_{2}, \lambda_{3}$는 행렬 $A$의 고유값이고, $\textbf{u}_{1}, \textbf{u}_{2}, \textbf{u}_{3}$는 각 고유값에 해당하는 고유 벡터다. -고유벡터 구하는 함수를 Python으로 구현하면 아래와 같다. 앞서 [고유값과 고유벡터 계산](2022-06-11-linear_algebra_eigenvalue_eigenvector.md/#qr분해를-통한-고유값과-고유벡터-계산)에서 이미 구현한 바 있다. +고유벡터 구하는 함수를 Python으로 구현하면 아래와 같다. 앞서 [고유값과 고유벡터 계산](./2022-06-11-linear_algebra_eigenvalue_eigenvector.md/#qr분해를-통한-고유값과-고유벡터-계산)에서 이미 구현한 바 있다. === "Python" diff --git a/docs/blog/posts/2022-06-19-linear_algebra_lu_decomposition.md b/docs/blog/posts/2022-06-19-linear_algebra_lu_decomposition.md index d328616e..a39404cd 100644 --- a/docs/blog/posts/2022-06-19-linear_algebra_lu_decomposition.md +++ b/docs/blog/posts/2022-06-19-linear_algebra_lu_decomposition.md @@ -19,7 +19,7 @@ tags: ## 1. 기본 행렬 -**기본 행렬(elementary matrix)**은 단위 행렬에 [기본 행 연산](2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)을 한 번 실행하여 얻어진 행렬을 말하며, 일반적으로 $E$로 표기한다. 기본 행렬은 아래와 같이 일반적인 행렬에 비해 역행렬을 아주 쉽게 구할 수 있다. +**기본 행렬(elementary matrix)**은 단위 행렬에 [기본 행 연산](./2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)을 한 번 실행하여 얻어진 행렬을 말하며, 일반적으로 $E$로 표기한다. 기본 행렬은 아래와 같이 일반적인 행렬에 비해 역행렬을 아주 쉽게 구할 수 있다. - 기본 행렬이 대각 행렬인 경우, 1이 아닌 원소의 역수를 대입하면 된다. @@ -55,7 +55,7 @@ $$ ### LU 분해의 기본 개념 -**LU 분해(LU decomposition, LU factorization)**는 행렬 $A$를 아래와 같이 [하 삼각 행렬](2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬) $L$과 [상 삼각 행렬](2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬) $U$로 분해하는 것을 말하며, [가우스-조르단 소거법](2022-05-22-linear_algebra_linear_system.md/#가우스-조르단-소거법)을 사용해 선형 시스템의 해를 구하는 것보다 컴퓨팅 리소스를 효율적으로 사용할 수 있다고 한다. +**LU 분해(LU decomposition, LU factorization)**는 행렬 $A$를 아래와 같이 [하 삼각 행렬](./2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬) $L$과 [상 삼각 행렬](./2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬) $U$로 분해하는 것을 말하며, [가우스-조르단 소거법](./2022-05-22-linear_algebra_linear_system.md/#가우스-조르단-소거법)을 사용해 선형 시스템의 해를 구하는 것보다 컴퓨팅 리소스를 효율적으로 사용할 수 있다고 한다. $$ \begin{align*} @@ -82,9 +82,9 @@ $$ LU 분해 방법은 아래와 같다. -- 1) 위 정리에서 $a_{11} \neq 0$ 이어야 하기 때문에, [피벗팅](2022-05-22-linear_algebra_linear_system.md/#피벗)을 해준다. +- 1) 위 정리에서 $a_{11} \neq 0$ 이어야 하기 때문에, [피벗팅](./2022-05-22-linear_algebra_linear_system.md/#피벗)을 해준다. -- 2) 주어진 행렬 $A$를 [기본 행 연산](2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)을 통해 [상 삼각 행렬](2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬) $U$로 변환한다. +- 2) 주어진 행렬 $A$를 [기본 행 연산](./2022-05-01-linear_algebra_vector_scalar.md/#기본-행-연산)을 통해 [상 삼각 행렬](./2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬) $U$로 변환한다. $$ E_{n}E_{n-1} \cdots E_{2}E_{1}A = U @@ -157,7 +157,7 @@ $$ p, l, u = linalg.lu(a) ``` -위 함수들을 실제로 사용해보면 LU 분해의 결과가 조금 다른 것을 알 수 있는데, LU 분해는 그 자체로 의미가 있기 보다는 [하 삼각 행렬과 상 삼각 행렬](2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬)로 분해한 후의 활용이 중요하기 때문에 $A = LU$의 검산만 맞으면 결과는 상관 없다. +위 함수들을 실제로 사용해보면 LU 분해의 결과가 조금 다른 것을 알 수 있는데, LU 분해는 그 자체로 의미가 있기 보다는 [하 삼각 행렬과 상 삼각 행렬](./2022-05-19-linear_algebra_various_matrix.md/#6-삼각-행렬)로 분해한 후의 활용이 중요하기 때문에 $A = LU$의 검산만 맞으면 결과는 상관 없다. ## 3. LU 분해를 통한 선형 시스템의 풀이 diff --git a/docs/blog/posts/2022-06-25-data_structure_types.md b/docs/blog/posts/2022-06-25-data_structure_types.md index 595d15ea..dd5a1cf7 100644 --- a/docs/blog/posts/2022-06-25-data_structure_types.md +++ b/docs/blog/posts/2022-06-25-data_structure_types.md @@ -11,7 +11,7 @@ tags: - data structure --- -자료구조의 기본 개념, Array, Stack, Queue, Linked List, Graph, Tree +자료구조의 기본 개념, Array, Stack, Queue, Linked List, Hast Table, Graph, Tree @@ -25,19 +25,22 @@ tags: ## 기본적인 자료구조 -다양한 자료구조가 있지만, 그 중에서도 다음의 자료구조들이 가장 기본적이라고 한다. +다양한 자료구조가 있지만, 그 중 대표적인 자료구조들은 다음과 같다. -- [배열(Array)](2022-06-26-data_structure_array.md) +- [배열(Array)](./2022-06-26-data_structure_array.md) - 가장 기본적인 자료형으로, 자료를 원소로 취급해 나열한 자료구조 - 생성 시 원소들에게 부여되는 index를 통해 원소들에게 접근 가능 -- [스택(Stack)](2022-07-02-data_structure_stack.md) +- [스택(Stack)](./2022-07-02-data_structure_stack.md) - 순서가 보존되는 선형 데이터 구조 유형 - LIFO(Last In First Out) 메커니즘에 따라 데이터를 처리 -- [큐(Queue)](2022-07-03-data_structure_queue_deque.md) +- [큐(Queue)](./2022-07-03-data_structure_queue_deque.md) - 순서가 보존되는 선형 데이터 구조 유형 - FIFO(First In First Out) 메커니즘에 따라 데이터를 처리 -- [연결 리스트(Linked List)](2022-07-08-data_structure_linked_list.md) +- [연결 리스트(Linked List)](./2022-07-08-data_structure_linked_list.md) - 노드(node, 데이터 묶음)를 저장할 때 그 다음 순서의 자료가 있는 위치를 데이터에 포함시키는 방식으로 자료를 저장하는 자료구조 +- [해시 테이블(Hash Table)](./2024-07-29-data_structure_hash_table.md) + - 데이터를 Key - Value 쌍으로 묶어 저장하는 데이터 구조 + - Key를 통해 데이터에 접근할 수 있기 때문에 접근 속도가 매우 빠름 - 그래프(Graph) - 정점(vertex) 사이에 변(edge)이 있는 자료구조 - 일방통행을 나타내는 Directed graph와 양방향 통행을 나타내는 Undirected graph가 있음 diff --git a/docs/blog/posts/2022-07-08-data_structure_linked_list.md b/docs/blog/posts/2022-07-08-data_structure_linked_list.md index d7ba8aea..d44d448f 100644 --- a/docs/blog/posts/2022-07-08-data_structure_linked_list.md +++ b/docs/blog/posts/2022-07-08-data_structure_linked_list.md @@ -27,7 +27,7 @@ tags: - **tail node**: 연결 리스트의 마지막 노드 - 장점 - - 최대 크기가 정해진 [배열](2022-06-26-data_structure_array.md)에 비해 최대 크기를 변화시키기 쉽다 + - 최대 크기가 정해진 [배열](./2022-06-26-data_structure_array.md)에 비해 최대 크기를 변화시키기 쉽다 - 데이터가 삭제되면 해당 데이터에 대한 메모리 예약도 없어지기 때문에 메모리 낭비가 적다 - 단점 - index가 없이 반드시 순차 접근을 해야하기 때문에 처리속도가 비교적 느리다 diff --git a/docs/blog/posts/2022-07-09-about_ai.md b/docs/blog/posts/2022-07-09-about_ai.md index f983e1ae..003d08a8 100644 --- a/docs/blog/posts/2022-07-09-about_ai.md +++ b/docs/blog/posts/2022-07-09-about_ai.md @@ -23,7 +23,7 @@ AI를 이해하기 위한 기초 배경 지식 정리 ## 강인공지능과 약인공지능 -![strong_and_week_ai](img/about_ai.png){ loading=lazy } +![strong_and_week_ai](./img/about_ai.png){ loading=lazy } - **강인공지능(strong AI, general AI)**은 인간을 완벽하게 모방한 AI로 자아를 갖고 있고 다양한 분야에서 활용 가능한 AI를 말하는데, 쉽게 말해서 울트론이나 터미네이터와 같이 영화에서 종종 등장하는 사람과도 같은 AI를 말한다. - 반면 **약인공지능(weak AI, narrow AI)**은 유용한 도구로써 설계된 인공지능으로, 특정 분야에서만 활용 가능한 AI를 말한다. 현재 실제로 구현되고 사용되는 AI들은 전부 약인공지능에 속한다. @@ -32,7 +32,7 @@ AI를 이해하기 위한 기초 배경 지식 정리 위에서 말한 AI의 정의 중 **학습을 통해 데이터의 패턴을 발견하는 것**을 **기계학습(Machine Learning)**이라고 부르는데, 관련 용어들과의 포함 관계는 아래 그림과 같다. -![ai_ml_dl_vdiagram](img/ai_ml_dl_vdiagram.png){ loading=lazy width=300 } +![ai_ml_dl_vdiagram](./img/ai_ml_dl_vdiagram.png){ loading=lazy width=300 } - **인공지능(Artificial Intelligence)**은 단어 그대로 인간이 만들어낸 지능을 의미하는 일반적인 단어로, 가장 광범위하고 모호한 뜻을 가진다. - **기계 학습(Machine Learning)**은 입력된 데이터를 통해 스스로 모델을 도출하는(스스로 규칙을 형성시키는) 컴퓨터 알고리즘을 말한다. @@ -71,10 +71,10 @@ AI를 이해하기 위한 기초 배경 지식 정리 ## 참고 자료 -![AI_Venn_diagram](img/AI_Venn_diagram.png){ loading=lazy width=500 } -![AI_map_02](img/AI_map_02.png){ loading=lazy width=500 } -![AI_map_03](img/AI_map_03.png){ loading=lazy width=500 } +![AI_Venn_diagram](./img/AI_Venn_diagram.png){ loading=lazy width=500 } +![AI_map_02](./img/AI_map_02.png){ loading=lazy width=500 } +![AI_map_03](./img/AI_map_03.png){ loading=lazy width=500 } ## 각 분류별 주요 알고리즘 -![AI_map_01](img/AI_map_01.png){ loading=lazy width=500 } \ No newline at end of file +![AI_map_01](./img/AI_map_01.png){ loading=lazy width=500 } \ No newline at end of file diff --git a/docs/blog/posts/2022-07-11-data_scalers.md b/docs/blog/posts/2022-07-11-data_scalers.md index c4fbcd86..eabd9f72 100644 --- a/docs/blog/posts/2022-07-11-data_scalers.md +++ b/docs/blog/posts/2022-07-11-data_scalers.md @@ -85,7 +85,7 @@ def plotting(df: pd.DataFrame, title: str): plotting(df=df, title='Raw data') ``` -![plot_rawdata](img/plot_Raw_data.png){ loading=lazy } +![plot_rawdata](./img/plot_Raw_data.png){ loading=lazy } ## StandardScaler @@ -120,7 +120,7 @@ max 3.418111e+00 1.561643e+00 plotting(df=df_standard_scaled, title='StandardScaled data') ``` -![plot_rawdata](img/plot_StandardScaled.png){ loading=lazy } +![plot_rawdata](./img/plot_StandardScaled.png){ loading=lazy } ## MinMaxScaler @@ -153,7 +153,7 @@ max 1.000000 1.000000 plotting(df=df_minmax_scaled, title='MinMaxScaled data') ``` -![plot_rawdata](img/plot_MinMaxScaled.png){ loading=lazy } +![plot_rawdata](./img/plot_MinMaxScaled.png){ loading=lazy } ## MaxAbsScaler @@ -186,11 +186,11 @@ max 1.000000 1.000000 plotting(df=df_maxabs_scaled, title='MaxAbsScaled data') ``` -![plot_rawdata](img/plot_MaxAbsScaled.png){ loading=lazy } +![plot_rawdata](./img/plot_MaxAbsScaled.png){ loading=lazy } ## 💡RobustScaler -중앙값과 [IQR](2022-04-01-iqr_method.md)을 사용하기 때문에 이상점의 영향을 덜 받는다는 장점이 있다. Python으로 구현하면 아래와 같다. +중앙값과 [IQR](./2022-04-01-iqr_method.md)을 사용하기 때문에 이상점의 영향을 덜 받는다는 장점이 있다. Python으로 구현하면 아래와 같다. ```python from sklearn.preprocessing import RobustScaler @@ -219,7 +219,7 @@ max 1.471466e+01 2.682501 plotting(df=df_robust_scaled, title='RobustScaled data') ``` -![plot_rawdata](img/plot_RobustScaled.png){ loading=lazy } +![plot_rawdata](./img/plot_RobustScaled.png){ loading=lazy } ## 결과 비교 @@ -254,7 +254,7 @@ plt.savefig(fname='plot_Scaled', bbox_inches='tight') plt.show() ``` -![plot_rawdata](img/plot_Scaled.png){ loading=lazy } +![plot_rawdata](./img/plot_Scaled.png){ loading=lazy } 변화된 분포를 원본 데이터와 비교해보면, Robust Scaling이 가장 이상점의 영향을 적게 받아 변환된 결과를 보여주고, 다음으로는 Standard Scaling이 비교적 이상점의 영향을 적게 받는 결과를 보여준다. diff --git a/docs/blog/posts/2022-07-15-correlation_coef.md b/docs/blog/posts/2022-07-15-correlation_coef.md index eaefe29c..39e1491f 100644 --- a/docs/blog/posts/2022-07-15-correlation_coef.md +++ b/docs/blog/posts/2022-07-15-correlation_coef.md @@ -24,7 +24,7 @@ Python으로 상관계수 계산 기능 구현하기 상관계수는 **-1에서 1 사이의 값**을 지니며, 부호는 상관관계의 방향, 수치는 상관의 정도를 나타낸다. 데이터 분석에 있어서 요구되는 상관계수의 수치는 분석 대상에 따라 달라지는데, 대체로 사회과학에서는 수치가 조금 낮아도 강력한 상관관계로 해석하며 오히려 너무 높은 상관관계는 데이터 조작을 의심하게 되지만, 반대로 공학계통에서는 높은 상관관계를 요구한다. !!! tip - 상관계수는 **데이터가 추세선을 중심으로 분포한 정도**만 알려줄 뿐 추세선의 기울기는 알려주지 않는다. 추세선의 기울기를 분석하는 방법은 [회귀분석](2022-01-23-regression_statsmodels.md)이다. + 상관계수는 **데이터가 추세선을 중심으로 분포한 정도**만 알려줄 뿐 추세선의 기울기는 알려주지 않는다. 추세선의 기울기를 분석하는 방법은 [회귀분석](./2022-01-23-regression_statsmodels.md)이다. ## 수치형 변수의 상관계수 @@ -108,7 +108,7 @@ plt.savefig(fname='plot_corr', bbox_inches='tight') plt.show() ``` -![plot_corr.png](img/plot_corr.png){ loading=lazy } +![plot_corr.png](./img/plot_corr.png){ loading=lazy } !!! warning 참고로 특정 분포의 데이터들은 명백하게 상관관계가 있음에도 불구하고 피어슨 상관관계가 0으로 계산되는데, 이 때는 구간을 나누어서 확인해야 한다. 자세한 내용은 [여기](https://datascienceschool.net/02%20mathematics/07.05%20%EA%B3%B5%EB%B6%84%EC%82%B0%EA%B3%BC%20%EC%83%81%EA%B4%80%EA%B3%84%EC%88%98.html#id8)를 참고하자. diff --git a/docs/blog/posts/2022-07-24-ann_terms.md b/docs/blog/posts/2022-07-24-ann_terms.md index 2c2161bc..6db7867a 100644 --- a/docs/blog/posts/2022-07-24-ann_terms.md +++ b/docs/blog/posts/2022-07-24-ann_terms.md @@ -20,13 +20,13 @@ tags: **인공신경망(Artificial Neural Network)**은 소프트웨어로 인간 뇌의 뉴런 구조를 본따 만든 구조의 알고리즘을 말한다. 아래 그림과 같은 구조를 갖는 **퍼셉트론(Perceptron)**을 기초로 한다. 세부적으로는 전체적인 알고리즘의 구조 및 구성 요소들의 변화에 따라 각각 다른 알고리즘으로 구별된다. -![perceptron](img/perceptron.png){ loading=lazy } +![perceptron](./img/perceptron.png){ loading=lazy } ## node/layer 아래 그림과 같이 모든 노드가 loop가 없이 완전히 연결된 기본 구조의 인공신경망을 **다층 퍼셉트론(Multi-Layer Perceptron, MLP)**이라고 부르며, 가중치가 적용되어 활성화 되거나 비활성화 되는 각각의 **퍼셉트론(Perceptron)** 지점을 **노드(Node)**, 노드가 구성하는 층을 **Layer**라고 부른다. -![multi-layer_perceptron](img/multi-layer_perceptron.png){ loading=lazy } +![multi-layer_perceptron](./img/multi-layer_perceptron.png){ loading=lazy } ^[Multi layer Perceptron (MLP) Models on Real World Banking Data](https://becominghuman.ai/multi-layer-perceptron-mlp-models-on-real-world-banking-data-f6dd3d7e998f)^ ## 입력층/은닉층/출력층 @@ -104,7 +104,7 @@ $$ - Sparse Cross Entropy - 라벨이 `integer` 형태인 다중 분류에서 사용되는 손실 함수 -![cross_entropy](img/cross_entropy.png){ loading=lazy } +![cross_entropy](./img/cross_entropy.png){ loading=lazy } ## 학습률/최적화 함수 @@ -113,7 +113,7 @@ $$ 경사하강법 알고리즘은 local minimum이나 saddle point에서 멈추거나 학습이 더디게 진행되는 문제점이 있어 이를 개선하기 위한 **최적화 함수(Optimizer)**가 적용된다. **최적화 함수(Optimizer)**는 어떤 지점에서 계산을 수행할지를 결정하는 함수로, 인공신경망의 현재의 손실 함수 값이 감소하는 방향으로 파라미터를 업데이트 시킬 때 가장 중요한 부분인 어느 방향으로 얼만큼 갈 것인지 결정하는 함수를 말한다. -![optimizers](img/optimizers.png){ loading=lazy } +![optimizers](./img/optimizers.png){ loading=lazy } ^[출처: 자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.](https://www.slideshare.net/yongho/ss-79607172%20)^ ## metrics @@ -129,4 +129,4 @@ $$ - 분류(Classification) 문제 - 분류 문제의 경우 **Confusion Matrix(혼동행렬, (정)오분류표)**을 기반으로 한 모델 평가 방법론들을 사용한다. -![Confusion_Matrix](img/confusion_matrix.png){ loading=lazy } \ No newline at end of file +![Confusion_Matrix](./img/confusion_matrix.png){ loading=lazy } \ No newline at end of file diff --git a/docs/blog/posts/2022-07-30-telegram_bot.md b/docs/blog/posts/2022-07-30-telegram_bot.md index 174cd204..87a991e1 100644 --- a/docs/blog/posts/2022-07-30-telegram_bot.md +++ b/docs/blog/posts/2022-07-30-telegram_bot.md @@ -29,7 +29,7 @@ Telegram Bot API로 Python 자동 알림 만들기 Telegram을 가입 후 **BotFather**를 검색해서 새로운 bot을 만들자. -![telegram_bot_setting](img/telegram_bot_setting.png) +![telegram_bot_setting](./img/telegram_bot_setting.png) 검정색으로 가려진 부분이 **HTTP access token**이다. @@ -44,15 +44,15 @@ Telegram을 가입 후 **BotFather**를 검색해서 새로운 bot을 만들자. https://api.telegram.org/bot{YOUR_HTTP_ACCESS_TOKEN}/getMe ``` -![telegram_bot_getMe_01](img/telegram_bot_getMe_01.png) +![telegram_bot_getMe_01](./img/telegram_bot_getMe_01.png) -![telegram_bot_getMe_02](img/telegram_bot_getMe_02.png){ loading=lazy width="50%" } +![telegram_bot_getMe_02](./img/telegram_bot_getMe_02.png){ loading=lazy width="50%" } ## 3. ID 확인 bot에게 말을 걸어서 대화방을 생성하고 **id**를 확인하자. 스팸의 위험성 때문에 bot이 먼저 사용자에게 말을 걸 수는 없도록 되어있다고 한다. -![telegram_bot_getUpdates_01](img/telegram_bot_getUpdates_01.png){ loading=lazy width="50%" } +![telegram_bot_getUpdates_01](./img/telegram_bot_getUpdates_01.png){ loading=lazy width="50%" } 웹브라우저 주소창에 아래와 같이 입력하면 생성한 bot과의 대화방을 업데이트 한다. @@ -60,9 +60,9 @@ bot에게 말을 걸어서 대화방을 생성하고 **id**를 확인하자. 스 https://api.telegram.org/bot{YOUR_HTTP_ACCESS_TOKEN}/getUpdates ``` -![telegram_bot_getUpdates_02](img/telegram_bot_getUpdates_02.png){ loading=lazy } +![telegram_bot_getUpdates_02](./img/telegram_bot_getUpdates_02.png){ loading=lazy } -![telegram_bot_getUpdates_03](img/telegram_bot_getUpdates_03.png){ loading=lazy width="50%" } +![telegram_bot_getUpdates_03](./img/telegram_bot_getUpdates_03.png){ loading=lazy width="50%" } `message`의 `from` `id`를 보면 되는데, 이 경우에는 `5463934262`이다. @@ -84,7 +84,7 @@ import requests requests.get('https://api.telegram.org/bot{YOUR_HTTP_ACCESS_TOKEN}/sendMessage?chat_id=5463934262&text=Code Finished') ``` -![telegram_bot_test](img/telegram_bot_test.png){ loading=lazy width="25%" } +![telegram_bot_test](./img/telegram_bot_test.png){ loading=lazy width="25%" } ### POST 방식 @@ -120,7 +120,7 @@ requests.post( ) ``` -![telegram_bot_test_02](img/telegram_bot_test_02.png){ loading=lazy } +![telegram_bot_test_02](./img/telegram_bot_test_02.png){ loading=lazy } 정상적으로 메세지가 보내지는 것을 확인할 수 있다. diff --git a/docs/blog/posts/2022-07-31-date_modeling.md b/docs/blog/posts/2022-07-31-date_modeling.md index 183ace56..5c9e008d 100644 --- a/docs/blog/posts/2022-07-31-date_modeling.md +++ b/docs/blog/posts/2022-07-31-date_modeling.md @@ -97,7 +97,7 @@ tags: ## 5. 데이터 모델링의 요소 -데이터 모델링은 [엔티티(Entity)](2022-08-06-entity_relationship_model.md/#1-엔티티), [속성(Attribute)](2022-08-06-entity_relationship_model.md/#2-속성), [관계(Relationship)](2022-08-06-entity_relationship_model.md/#3-관계)의 3요소로 구성됨 +데이터 모델링은 [엔티티(Entity)](./2022-08-06-entity_relationship_model.md/#1-엔티티), [속성(Attribute)](./2022-08-06-entity_relationship_model.md/#2-속성), [관계(Relationship)](./2022-08-06-entity_relationship_model.md/#3-관계)의 3요소로 구성됨 ## 6. E-R Model diff --git a/docs/blog/posts/2022-08-07-database_normalization.md b/docs/blog/posts/2022-08-07-database_normalization.md index 1ffe1688..7604667f 100644 --- a/docs/blog/posts/2022-08-07-database_normalization.md +++ b/docs/blog/posts/2022-08-07-database_normalization.md @@ -83,7 +83,7 @@ tags: 역정규화로 번역되기도 하는 **반정규화(Denormalization)**는 정규화된 엔티티, 속성, 관계에 대해 시스템의 성능 향상, 개발, 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법을 의미한다. -반정규화는 데이터의 무결성을 희생하는 대신 조회 성능을 향상시킨다. 정규화를 수행하면 엔티티의 갯수가 증가하고 관계가 많아져 [조인](2022-08-14-sql_join.md)을 통해 데이터를 가져오게 되는데, 조회의 처리 성능이 더 중요할 때 반정규화를 수행한다. +반정규화는 데이터의 무결성을 희생하는 대신 조회 성능을 향상시킨다. 정규화를 수행하면 엔티티의 갯수가 증가하고 관계가 많아져 [조인](./2022-08-14-sql_join.md)을 통해 데이터를 가져오게 되는데, 조회의 처리 성능이 더 중요할 때 반정규화를 수행한다. ### 3-2. 반정규화 적용 방법 @@ -104,13 +104,13 @@ tags: **테이블 반정규화**는 아래와 같다. - 테이블 병합 - - 1:1 관계 테이블 병합, 1:M 관계 테이블 병합, [슈퍼타입/서브타입](2022-08-08-database_architecture.md/#2-1-슈퍼서브타입-모델) 테이블 병합 + - 1:1 관계 테이블 병합, 1:M 관계 테이블 병합, [슈퍼타입/서브타입](./2022-08-08-database_architecture.md/#2-1-슈퍼서브타입-모델) 테이블 병합 - 테이블 분할 - - 수직 분할: 칼럼 단위 분할, [트랜잭션](2022-08-11-relational_database.md/#4-tcl) 처리 유형 파악 선행 필수 + - 수직 분할: 칼럼 단위 분할, [트랜잭션](./2022-08-11-relational_database.md/#4-tcl) 처리 유형 파악 선행 필수 - 수평 분할: 로우 단위 분할 - 테이블 추가 - 중복 테이블 추가: 다른 업무이거나 서버가 다른 경우 동일한 테이블 구조를 중복하여 원격 조인 제거 - - 통계 테이블 추가: [집계 함수](2022-08-13-sql_where_groupby.md/#3-1-집계-함수)를 미리 계산하여 저장 + - 통계 테이블 추가: [집계 함수](./2022-08-13-sql_where_groupby.md/#3-1-집계-함수)를 미리 계산하여 저장 - 이력 테이블 추가 - 부분 테이블 추가: 전체 칼럼 중 이용도가 높은 칼럼을 모은 별도의 테이블 추가 diff --git a/docs/blog/posts/2022-08-11-relational_database.md b/docs/blog/posts/2022-08-11-relational_database.md index 53dd83aa..31c92243 100644 --- a/docs/blog/posts/2022-08-11-relational_database.md +++ b/docs/blog/posts/2022-08-11-relational_database.md @@ -40,7 +40,7 @@ SQL 기본: 관계형 데이터베이스, DDL, DML, TCL, DCL **테이블(Table)**은 데이터를 저장하는 객체(Object)로, 관계형 데이터베이스의 기본 단위이다. 테이블의 열을 칼럼(Column), 가로 방향을 행(Row)이라고 하고, 열과 행이 겹치는 하나의 공간을 필드(Field)라고 한다. -테이블을 분할하여 데이터의 불필요한 중복을 줄이는 것을 [정규화(Normalization)](2022-08-07-database_normalization.md/#2-정규화)라고 한다. 정규화(Normalization)를 통해 데이터의 정합성을 확보하고, 데이터 입력/수정/삭제 시 발생할 수 있는 이상 현상(Anomaly)을 방지할 수 있다. +테이블을 분할하여 데이터의 불필요한 중복을 줄이는 것을 [정규화(Normalization)](./2022-08-07-database_normalization.md/#2-정규화)라고 한다. 정규화(Normalization)를 통해 데이터의 정합성을 확보하고, 데이터 입력/수정/삭제 시 발생할 수 있는 이상 현상(Anomaly)을 방지할 수 있다. 테이블의 각 행을 한 가지 의미로 특정할 수 있는 한 개 이상의 칼럼을 **기본키(Primary Key, PK)**라고 하며, 다른 테이블의 기본 키로 사용되면서 테이블과의 관계를 연결하는 역할을 하는 칼럼을 **외부키(Foreign Key, FK)**라고 한다. diff --git a/docs/blog/posts/2022-08-13-sql_where_groupby.md b/docs/blog/posts/2022-08-13-sql_where_groupby.md index aaac255c..7b860f63 100644 --- a/docs/blog/posts/2022-08-13-sql_where_groupby.md +++ b/docs/blog/posts/2022-08-13-sql_where_groupby.md @@ -118,8 +118,8 @@ SELECT TOP(4) WITH TIES job, deptno FROM emp ORDER BY job, deptno; - [NULL 관련 함수](#2-6-null-관련-함수) - 다중행 함수(Multi-Row Function) - [집계 함수(Aggregate Function)](#3-1-집계-함수) - - [그룹 함수(Group Function)](2022-08-18-sql_group_window_function.md/#2-그룹-함수) - - [윈도우 함수(Window Function)](2022-08-18-sql_group_window_function.md/#3-윈도우-함수) + - [그룹 함수(Group Function)](./2022-08-18-sql_group_window_function.md/#2-그룹-함수) + - [윈도우 함수(Window Function)](./2022-08-18-sql_group_window_function.md/#3-윈도우-함수) 단일행 함수(Single-Row Function)의 주요 특징은 다음과 같다. @@ -141,7 +141,7 @@ SELECT TOP(4) WITH TIES job, deptno FROM emp ORDER BY job, deptno; - `CHR/CHAR(ASCII)` - ASCII 코드를 문자로 변경 - `CONCAT('str1', 'str2')` - - 'str1'과 'str2'을 연결. [합성연산자](2022-08-11-relational_database.md/#3-5-연산자)와 동일 + - 'str1'과 'str2'을 연결. [합성연산자](./2022-08-11-relational_database.md/#3-5-연산자)와 동일 - `SUBSTR/SUBSTRING('str', m, n)` - 문자열의 m 위치에서 n개의 문자 길이에 해당하는 문자를 반환. n이 생략되면 마지막 문자까지 반환 - `LENGTH/LEN('str')` @@ -315,7 +315,7 @@ ORDER BY expression1 ASC/DESC expression2; !!! tip Oracle은 `NULL`값을 가장 큰 값으로 취급하는 반면, MSSQL은 가장 작은 값으로 취급한다. -Oracle의 경우 데이터에 접근할 때 행 전체 칼럼을 메모리에 로드하기 때문에 `SELECT`절에 지정되지 않은 칼럼으로도 정렬이 가능하나, `FROM`절이 [서브쿼리](2022-08-17-sql_subquery_view.md/#1-3-위치에-따른-서브쿼리-분류) 형태로 되어있을 경우(인라인 뷰)에는 불가능하다는 특징이 있다. +Oracle의 경우 데이터에 접근할 때 행 전체 칼럼을 메모리에 로드하기 때문에 `SELECT`절에 지정되지 않은 칼럼으로도 정렬이 가능하나, `FROM`절이 [서브쿼리](./2022-08-17-sql_subquery_view.md/#1-3-위치에-따른-서브쿼리-분류) 형태로 되어있을 경우(인라인 뷰)에는 불가능하다는 특징이 있다. ## 5. SQL문 실행 순서 diff --git a/docs/blog/posts/2022-08-18-sql_group_window_function.md b/docs/blog/posts/2022-08-18-sql_group_window_function.md index a78efb6a..202ae9f0 100644 --- a/docs/blog/posts/2022-08-18-sql_group_window_function.md +++ b/docs/blog/posts/2022-08-18-sql_group_window_function.md @@ -23,7 +23,7 @@ SQL 활용: 그룹 함수, 윈도우 함수 ANSI/ISO SQL 표준은 데이터 분석을 위한 세 가지 종류의 함수를 정의하고 있다. -- [집계 함수(Aggregate Function)](2022-08-13-sql_where_groupby.md/#3-1-집계-함수) +- [집계 함수(Aggregate Function)](./2022-08-13-sql_where_groupby.md/#3-1-집계-함수) - [그룹 함수(Group Function)](#2-그룹-함수) - [윈도우 함수(Window Function)](#3-윈도우-함수) @@ -71,7 +71,7 @@ FROM table_name; ### 3-2. 일반 집계 함수 -`GROUP BY`절의 [집계 함수](2022-08-13-sql_where_groupby.md/#3-1-집계-함수)와 동일하게 집계 연산을 수행하며, 종류는 다음과 같다. +`GROUP BY`절의 [집계 함수](./2022-08-13-sql_where_groupby.md/#3-1-집계-함수)와 동일하게 집계 연산을 수행하며, 종류는 다음과 같다. - `SUM()`/`AVG()` - `MIN()`/`MAX()` diff --git a/docs/blog/posts/2022-08-19-sql_procedure.md b/docs/blog/posts/2022-08-19-sql_procedure.md index 5f3b598f..96244f22 100644 --- a/docs/blog/posts/2022-08-19-sql_procedure.md +++ b/docs/blog/posts/2022-08-19-sql_procedure.md @@ -46,7 +46,7 @@ SQL 활용: 절차형 SQL ## 4. 트리거 -**트리거(Trigger)**란 특정 테이블에 [DML](2022-08-11-relational_database.md/#3-dml)이 수행되었을 때 데이터베이스에서 자동으로 동작하도록 작성된 프로그램으로, 데이터베이스에서 자동적으로 수행한다. +**트리거(Trigger)**란 특정 테이블에 [DML](./2022-08-11-relational_database.md/#3-dml)이 수행되었을 때 데이터베이스에서 자동으로 동작하도록 작성된 프로그램으로, 데이터베이스에서 자동적으로 수행한다. 트리거는 테이블, 뷰, 데이터베이스 작업을 대상으로 정의할 수 있으며, 전체 트랜잭션 작업에 대한 트리거와 각 행에 대한 트리거가 있다. diff --git a/docs/blog/posts/2022-09-07-csv_encoding_02.md b/docs/blog/posts/2022-09-07-csv_encoding_02.md index 100d2256..7c604d24 100644 --- a/docs/blog/posts/2022-09-07-csv_encoding_02.md +++ b/docs/blog/posts/2022-09-07-csv_encoding_02.md @@ -9,6 +9,7 @@ categories: - Data Analysis tags: - pandas + - troubleshooting --- pandas read_csv 함수의 UnicodeDecodeError 해결하기 diff --git a/docs/blog/posts/2022-09-08-bigdata_certi_01.md b/docs/blog/posts/2022-09-08-bigdata_certi_01.md index b91037c3..67dbd644 100644 --- a/docs/blog/posts/2022-09-08-bigdata_certi_01.md +++ b/docs/blog/posts/2022-09-08-bigdata_certi_01.md @@ -29,7 +29,7 @@ scipy xgboost ``` -`pip install` 명령어를 사용해서 각각의 패키지들을 설치해주자. Python 환경을 분리해야할 경우 [가상환경](2022-01-05-venv_guide.md)을 만들어서 작업하면 된다. +`pip install` 명령어를 사용해서 각각의 패키지들을 설치해주자. Python 환경을 분리해야할 경우 [가상환경](./2022-01-05-venv_guide.md)을 만들어서 작업하면 된다. ## 작업형 제1유형 : 데이터 처리 영역 @@ -114,7 +114,7 @@ test = pd.read_csv('data/X_test.csv', encoding='euc-kr') ``` !!! note - [인코딩 문제](2022-09-07-csv_encoding_02.md)가 있어서 `encoding='euc-kr'` 옵션을 추가했는데, 한국데이터산업진흥원에서 제공하는 체험 환경에서는 없어도 작동한다. 아마 시험 환경에서도 입력하지 않아도 될 듯하다. + [인코딩 문제](./2022-09-07-csv_encoding_02.md)가 있어서 `encoding='euc-kr'` 옵션을 추가했는데, 한국데이터산업진흥원에서 제공하는 체험 환경에서는 없어도 작동한다. 아마 시험 환경에서도 입력하지 않아도 될 듯하다. **EDA** @@ -297,7 +297,7 @@ df['환불금액'].fillna(value=0, inplace=True) **정규화** -정규화는 이상점의 영향을 적게 받는 Robust Scaling을 적용해주는게 무난하다. 자세한 설명은 [이 글](2022-07-11-data_scalers.md) 참고 +정규화는 이상점의 영향을 적게 받는 Robust Scaling을 적용해주는게 무난하다. 자세한 설명은 [이 글](./2022-07-11-data_scalers.md) 참고 ```python import numpy as np diff --git a/docs/blog/posts/2022-09-12-bigdata_certi_03.md b/docs/blog/posts/2022-09-12-bigdata_certi_03.md index 531f0ecf..997d1bdd 100644 --- a/docs/blog/posts/2022-09-12-bigdata_certi_03.md +++ b/docs/blog/posts/2022-09-12-bigdata_certi_03.md @@ -150,7 +150,7 @@ Index(['Warehouse_block', 'Mode_of_Shipment', 'Product_importance', 'Gender'], d **정규화** -이상점의 영향을 적게 받는 Robust Scaling으로 정규화를 해주자. 자세한 설명은 [이 글](2022-07-11-data_scalers.md) 참고 +이상점의 영향을 적게 받는 Robust Scaling으로 정규화를 해주자. 자세한 설명은 [이 글](./2022-07-11-data_scalers.md) 참고 ```python import numpy as np diff --git a/docs/blog/posts/2022-09-13-statistical_typed_python.md b/docs/blog/posts/2022-09-13-statistical_typed_python.md index 332ab338..f567412c 100644 --- a/docs/blog/posts/2022-09-13-statistical_typed_python.md +++ b/docs/blog/posts/2022-09-13-statistical_typed_python.md @@ -108,7 +108,7 @@ Found 1 error in 1 file (checked 1 source file) 이렇게 타입 에러를 검사해준다. 참고로 Python의 Annotations은 Comment와 마찬가지로 강제성이 전혀 없기 때문에 실행 시에 Annotations을 작성해주는 것 자체로는 런타임 시에 에러가 나지는 않는다. -![python_type_checking_mypy](img/python_type_checking_mypy.png){ loading=lazy } +![python_type_checking_mypy](./img/python_type_checking_mypy.png){ loading=lazy } !!! info 참고로 [Variable Annotations](https://peps.python.org/pep-0008/#variable-annotations)는 Python 3.6 부터 도입된 일종의 주석 기능으로, [PEP 526](https://peps.python.org/pep-0526/)에서 세부 내용을 확인할 수 있다. @@ -117,7 +117,7 @@ Found 1 error in 1 file (checked 1 source file) VS Code에서 Python 스크립트를 코딩할 때 사용하는 extension 중 [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)가 있다. Pylance의 `Type Checking Mode`옵션을 켜주면 아래 그림과 같이 데이터의 자료형을 검사해준다. -![python_type_checking_pylance](img/python_type_checking_pylance.png){ loading=lazy } +![python_type_checking_pylance](./img/python_type_checking_pylance.png){ loading=lazy } ### Annotation 무시하기 @@ -127,7 +127,7 @@ VS Code에서 Python 스크립트를 코딩할 때 사용하는 extension 중 [P a: int = "a" # type: ignore ``` -![python_type_checking_ignore](img/python_type_checking_ignore.png){ loading=lazy } +![python_type_checking_ignore](./img/python_type_checking_ignore.png){ loading=lazy } --- ## Reference diff --git a/docs/blog/posts/2022-09-17-bigdata_certi_04.md b/docs/blog/posts/2022-09-17-bigdata_certi_04.md index c7ac1003..ac0fa096 100644 --- a/docs/blog/posts/2022-09-17-bigdata_certi_04.md +++ b/docs/blog/posts/2022-09-17-bigdata_certi_04.md @@ -127,7 +127,7 @@ print(num_cols) **정규화** -이상점의 영향을 적게 받는 Robust Scaling으로 정규화 진행. 자세한 설명은 [이 글](2022-07-11-data_scalers.md) 참고 +이상점의 영향을 적게 받는 Robust Scaling으로 정규화 진행. 자세한 설명은 [이 글](./2022-07-11-data_scalers.md) 참고 ```python import numpy as np diff --git a/docs/blog/posts/2022-09-18-datascience_roadmap.md b/docs/blog/posts/2022-09-18-datascience_roadmap.md index 6d06c63f..22e53859 100644 --- a/docs/blog/posts/2022-09-18-datascience_roadmap.md +++ b/docs/blog/posts/2022-09-18-datascience_roadmap.md @@ -28,13 +28,13 @@ tags: ??? note "통계학" - [ ] 📙[데이터 과학을 위한 통계](http://www.yes24.com/Product/Goods/99942893) - [ ] 📙[An Introduction to Statistical Learning](https://www.statlearning.com/) - - [x] 🖥️💡[통계학의 이해 Ⅰ](http://www.kmooc.kr/courses/course-v1:SookmyungK+SM_sta_004k+2019_03SM_02/about) - - [ ] [통계학의 이해 Ⅱ](http://www.kmooc.kr/courses/course-v1:SookmyungK+SM_sta_009k+2020_03SM_04/about) + - [x] 🖥️💡[통계학의 이해 Ⅰ(숙명여대 여인권)](http://www.kmooc.kr/courses/course-v1:SookmyungK+SM_sta_004k+2019_03SM_02/about) + - [ ] 🖥️[통계학의 이해 Ⅱ(숙명여대 여인권)](http://www.kmooc.kr/courses/course-v1:SookmyungK+SM_sta_009k+2020_03SM_04/about) - [ ] 🖥️[데이터로 배우는 통계학](http://www.kmooc.kr/courses/course-v1:SNUk+SNU064.020k+2022_T2/about) - [ ] 🖥️[확률론](http://www.kocw.net/home/cview.do?cid=e8a7769e2bfe9497) - - [ ] [확률 및 통계(한양대학교 안종창)](http://www.kocw.net/home/cview.do?cid=0b0f037aa47cb5f0) - - [ ] [확률 및 통계(한양대학교 이상화)](http://www.kocw.net/home/cview.do?cid=a2881d53f7ea3252) - - [ ] [2014-2 확률통계론](https://www.youtube.com/watch?v=Qk-Qe06s3ow&list=PLSN_PltQeOyjGOCnBz402iwXeki2wVXMJ&index=2) + - [ ] 🖥️[확률 및 통계(한양대학교 안종창)](http://www.kocw.net/home/cview.do?cid=0b0f037aa47cb5f0) + - [ ] 🖥️[확률 및 통계(한양대학교 이상화)](http://www.kocw.net/home/cview.do?cid=a2881d53f7ea3252) + - [ ] 🖥️[2014-2 확률통계론](https://www.youtube.com/watch?v=Qk-Qe06s3ow&list=PLSN_PltQeOyjGOCnBz402iwXeki2wVXMJ&index=2) - [ ] 🖥️💡[베이지안통계학](http://www.kocw.net/home/cview.do?cid=2eea29dbf2f4e070) - [ ] 🖥️[응용통계](http://www.kocw.net/home/cview.do?cid=6c61eb3c868f4d86) - [ ] 🖥️[경영통계분석](http://www.kocw.net/home/cview.do?cid=8ab6016717940a1d) @@ -47,7 +47,7 @@ tags: - [ ] 🖥️💡[고급통계학특강 (II)](http://www.kocw.net/home/cview.do?cid=f653717700cd7176) - [ ] 🖥️[생존분석](http://www.kocw.net/home/cview.do?cid=decbdeb1b4af6adc) - [ ] 🖥️💡[시계열분석 기법과 응용](http://www.kmooc.kr/courses/course-v1:POSTECHk+IMEN677+2021_T2/about) - - [ ] [2013 2학기 시계열분석](https://youtube.com/playlist?list=PLSN_PltQeOyjnE4AnJyQUlHXNwE_hVtKL) + - [ ] 🖥️[2013 2학기 시계열분석](https://youtube.com/playlist?list=PLSN_PltQeOyjnE4AnJyQUlHXNwE_hVtKL) ??? note "선형대수학" - [ ] 📙💡[딥러닝을 위한 선형대수학](http://www.yes24.com/Product/Goods/91574113)([강의](http://www.kmooc.kr/courses/course-v1:PNUk+LD_C01+2022_KM011/about)) @@ -72,6 +72,7 @@ tags: ??? note "컴퓨터 공학 입문" - [ ] 🖥️💡[CS50x Courses from Harvard](https://youtube.com/playlist?list=PLhQjrBD2T382_R182iC2gNZI9HzWFMC_8) + - [ ] 🖥️💡[운영체제(이화여대 - 반효경)](http://www.kocw.net/home/cview.do?cid=4b9cd4c7178db077) ??? note "자료구조/알고리즘" - [ ] 📙💡[파이썬 알고리즘 인터뷰](http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791189909178) @@ -82,7 +83,8 @@ tags: ??? note "네트워크" - - [ ] [컴퓨터네트워크](http://www.kocw.net/home/cview.do?cid=6b984f376cfb8f70) + - [ ] 📙[모두의 네트워크](https://www.yes24.com/Product/Goods/61794014) + - [ ] 🖥️[컴퓨터네트워크](http://www.kocw.net/home/cview.do?cid=6b984f376cfb8f70) ??? note "소프트웨어 엔지니어링" - [ ] 🖥️[Python for Everybody](https://www.py4e.com/)([강의](https://www.coursera.org/specializations/python)) @@ -138,8 +140,8 @@ tags: ## 개발 ??? note "백엔드 엔지니어링" - - [ ] 🔗[FastAPI](https://fastapi.tiangolo.com/ko/) + - [x] 🔗[FastAPI](https://fastapi.tiangolo.com/) - [x] 📙[점프 투 FastAPI](https://wikidocs.net/book/8531) - - [ ] 🔗[Django](https://docs.djangoproject.com/ko/4.1/intro/) + - [ ] 🔗[Django](https://docs.djangoproject.com/) - [x] 📙[점프 투 장고](https://wikidocs.net/book/4223) - [ ] 🔗[DATA ON-AIR: SQL](https://dataonair.or.kr/db-tech-reference/d-guide/sql/) \ No newline at end of file diff --git a/docs/blog/posts/2022-09-24-algorithm_cheat_sheet.md b/docs/blog/posts/2022-09-24-algorithm_cheat_sheet.md index 17a5f3cf..1f3af6d4 100644 --- a/docs/blog/posts/2022-09-24-algorithm_cheat_sheet.md +++ b/docs/blog/posts/2022-09-24-algorithm_cheat_sheet.md @@ -20,7 +20,7 @@ tags: 머신러닝 라이브러리로 유명한 scikit-learn의 개발진들은 사용자들에게 어떤 경우에 어떤 방법론의 적용을 고려해야 하는지에 대한 가이드를 주기 위해 아래와 같은 cheat sheet을 만들어 제공하고 있다. -![ml_map](img/ml_map.png){ loading=lazy } +![ml_map](./img/ml_map.png){ loading=lazy } 데이터 사이언티스트를 목표로 하는 사람이 인공신경망까지의 진도에 있어서 어떤 알고리즘들을 공부할지 계획을 세울 때 참고하기에도 좋을 듯 하다. diff --git a/docs/blog/posts/2022-09-25-initiate_django.md b/docs/blog/posts/2022-09-25-initiate_django.md index 47e4a08d..dbfcfedd 100644 --- a/docs/blog/posts/2022-09-25-initiate_django.md +++ b/docs/blog/posts/2022-09-25-initiate_django.md @@ -29,7 +29,7 @@ Django도 기본적으로 Python 라이브러리이기 때문에 `pip`를 통해 pip install Django ``` -아래와 같이 Django와 Python [호환성 제약](https://docs.djangoproject.com/en/4.1/faq/install/#what-python-version-can-i-use-with-django)이 있으니 [Python 가상환경](2022-01-05-venv_guide.md)을 사용해서 버전을 맞춰주어야 한다. +아래와 같이 Django와 Python [호환성 제약](https://docs.djangoproject.com/en/4.1/faq/install/#what-python-version-can-i-use-with-django)이 있으니 [Python 가상환경](./2022-01-05-venv_guide.md)을 사용해서 버전을 맞춰주어야 한다. | Django version | Python versions | | -------------- | ---------------------------------------------------------- | @@ -115,13 +115,13 @@ Quit the server with CTRL-BREAK. 위와 같이 개발 서버가 작동하면 [http://127.0.0.1:8000/](http://127.0.0.1:8000/)로 접속할 수 있고, ++ctrl+c++로 서버를 중지할 수 있다. 개발 서버에 접속하면 아래와 같이 정상 작동 중인 것을 확인할 수 있다. -![django_localhost](img/django_localhost.png){ loading=lazy } +![django_localhost](./img/django_localhost.png){ loading=lazy } ## 4. Secret Key 숨기기 구성한 프로젝트를 GitHub에 그대로 push 하면 *Django Secret Key exposed on GitHub*이라는 제목으로 경고가 날아온다. -![django_secretkey_email](img/django_secretkey_email.png){ loading=lazy } +![django_secretkey_email](./img/django_secretkey_email.png){ loading=lazy } Django 프로젝트의 Secret Key가 노출되었다는 것인데, Secret Key는 [디지털 서명](https://docs.djangoproject.com/en/1.11/topics/signing/)을 위해 사용되고, 사용 대상은 아래와 같다. @@ -132,7 +132,7 @@ Django 프로젝트의 Secret Key가 노출되었다는 것인데, Secret Key는 Django의 Secret Key에 대한 상세한 설명은 [공식 문서](https://docs.djangoproject.com/en/4.1/ref/settings/#std:setting-SECRET_KEY)에서 확인할 수 있는데, Secret Key를 노출시키면 Django가 제공하는 보안 관련 기능을 무력화하니 주의하라고 한다. -![django_secretkey_warning](img/django_secretkey_warning.png){ loading=lazy } +![django_secretkey_warning](./img/django_secretkey_warning.png){ loading=lazy } 이번 경우에는 이미 노출되었으니 다음과 같은 두 단계로 해결해야 한다. diff --git a/docs/blog/posts/2022-09-27-django_app_orm.md b/docs/blog/posts/2022-09-27-django_app_orm.md index 4392980a..b2c03fb1 100644 --- a/docs/blog/posts/2022-09-27-django_app_orm.md +++ b/docs/blog/posts/2022-09-27-django_app_orm.md @@ -206,7 +206,7 @@ Django가 지원하는 여러 가지 DB의 백엔드 엔진은 아래와 같다. `board_qna/models.py` 파일에서 `board_qna` 앱이 사용할 데이터 모델을 설정할 수 있다. 기본적인 데이터 모델의 구상은 아래와 같다. -![django_erd_board_qna](img/django_erd_board_qna.png){ loading=lazy } +![django_erd_board_qna](./img/django_erd_board_qna.png){ loading=lazy } 위와 같이 구상한 데이터 모델을 구현하기 위해 아래와 같이 작성해준다. @@ -353,7 +353,7 @@ Running migrations: `db.sqlite3`를 데이터베이스 관리 도구로 열어 보면 아래 그림과 같이 실제 ERD가 설계대로 생성된 것을 확인할 수 있다. -![django_erd_board_qna_actual](img/django_erd_board_qna_actual.png){ loading=lazy } +![django_erd_board_qna_actual](./img/django_erd_board_qna_actual.png){ loading=lazy } ### 2-6. Python shell로 API 접근하기 @@ -400,11 +400,11 @@ Superuser created successfully. 접속하면 아래와 같이 관리자 로그인 화면이 뜬다. -![django_admin_login](img/django_admin_login.png){ loading=lazy } +![django_admin_login](./img/django_admin_login.png){ loading=lazy } 앞에서 설정한 이름과 비밀번호를 통해 접속하면 아래와 같이 관리자 화면이 나타난다. -![django_admin_page_01](img/django_admin_page_01.png){ loading=lazy } +![django_admin_page_01](./img/django_admin_page_01.png){ loading=lazy } ### 3-2. 모델 관리 권한 부여 @@ -422,9 +422,9 @@ admin.site.register(Answer) 로컬호스트 서버에서 아래와 같이 관리자가 글을 직접 관리할 수 있는 것을 확인할 수 있다. -![django_admin_page_02](img/django_admin_page_02.png){ loading=lazy } +![django_admin_page_02](./img/django_admin_page_02.png){ loading=lazy } -![django_admin_page_03](img/django_admin_page_03.png){ loading=lazy } +![django_admin_page_03](./img/django_admin_page_03.png){ loading=lazy } 만약 관리자에게 검색 기능을 주고 싶다면 아래와 같이 작성하면 된다. diff --git a/docs/blog/posts/2022-09-30-django_template.md b/docs/blog/posts/2022-09-30-django_template.md index 38f50d62..4cf3493e 100644 --- a/docs/blog/posts/2022-09-30-django_template.md +++ b/docs/blog/posts/2022-09-30-django_template.md @@ -129,9 +129,9 @@ urlpatterns = [ admin 권한으로 샘플 데이터를 몇 개 생성한 후 확인해보면 결과물을 아래 화면과 같이 확인할 수 있다. -![django_template_01](img/django_template_01.png){ loading=lazy } +![django_template_01](./img/django_template_01.png){ loading=lazy } -![django_template_02](img/django_template_02.png){ loading=lazy } +![django_template_02](./img/django_template_02.png){ loading=lazy } Django에서는 [Django 템플릿 언어](https://docs.djangoproject.com/en/4.1/ref/templates/language/)를 사용해서 템플릿을 작성한다. Jekyll에서 사용하는 [liquid](https://shopify.github.io/liquid/)와 별 차이는 없는 것 같다. diff --git a/docs/blog/posts/2022-10-01-django_mtv.md b/docs/blog/posts/2022-10-01-django_mtv.md index c0ed0a27..9622d2f9 100644 --- a/docs/blog/posts/2022-10-01-django_mtv.md +++ b/docs/blog/posts/2022-10-01-django_mtv.md @@ -25,7 +25,7 @@ MVC(Model, View, Controller)와 MTV(Model, Template, View) 각각의 요소는 - Model - 모델은 데이터 모델을 가리키는 말로, 데이터베이스에 저장된 데이터를 가리킨다. - - [App과 ORM](2022-09-27-django_app_orm.md) 단계에서 생성한 [모델](2022-09-27-django_app_orm.md/#2-3-model-생성)이 해당된다. + - [App과 ORM](./2022-09-27-django_app_orm.md) 단계에서 생성한 [모델](./2022-09-27-django_app_orm.md/#2-3-model-생성)이 해당된다. - View/Template - 뷰는 사용자에게 보여주는 화면과 정보를 가리키는 말로, 웹개발 관점에서는 프론트엔드를 가리킨다. - Django에서는 뷰 대신에 HTML 템플릿이라고 부른다. @@ -165,7 +165,7 @@ MIDDLEWARE = [ 아래와 같은 화면으로 생성된다. -![django_bootstrap_02](img/django_bootstrap_02.png){ loading=lazy } +![django_bootstrap_02](./img/django_bootstrap_02.png){ loading=lazy } #### 템플릿 포함 @@ -244,7 +244,7 @@ form의 에러를 확인하는 `form_errors.html` 파일은 아래와 같다. 아래와 같은 화면으로 생성된다. -![django_bootstrap_01](img/django_bootstrap_01.png){ loading=lazy } +![django_bootstrap_01](./img/django_bootstrap_01.png){ loading=lazy } ## 3. 답변 등록 화면 @@ -370,7 +370,7 @@ urlpatterns = [ 아래와 같은 화면으로 생성된다. -![django_bootstrap_03](img/django_bootstrap_03.png){ loading=lazy } +![django_bootstrap_03](./img/django_bootstrap_03.png){ loading=lazy } --- ## Reference diff --git a/docs/blog/posts/2022-10-02-django_index_page.md b/docs/blog/posts/2022-10-02-django_index_page.md index b80103f7..22bded3c 100644 --- a/docs/blog/posts/2022-10-02-django_index_page.md +++ b/docs/blog/posts/2022-10-02-django_index_page.md @@ -21,7 +21,7 @@ tags: [인덱스](https://en.wikipedia.org/wiki/Home_page) 페이지가 아래 사진처럼 아무 내용도 없고 404 에러만 보여줘서 개발 중인 페이지를 보고 싶을 경우 매번 주소를 입력해서 접속해야하는게 불편하다. -![django_homepage_01](img/django_homepage_01.png){ loading=lazy } +![django_homepage_01](./img/django_homepage_01.png){ loading=lazy } 어차피 나중에 제대로 된 홈페이지를 만들때 써먹어야하니 이참에 복습 겸 임시로 쓸 인덱스 페이지를 만들어보기로 한다. @@ -101,7 +101,7 @@ urlpatterns = [ # include() is a function for including url file in each app 아래와 같이 각 앱의 목록과 해당 앱의 메인 주소 링크를 보여준다. -![django_homepage_02](img/django_homepage_02.png){ loading=lazy } +![django_homepage_02](./img/django_homepage_02.png){ loading=lazy } --- ## Reference diff --git a/docs/blog/posts/2022-10-03-django_signin_signup.md b/docs/blog/posts/2022-10-03-django_signin_signup.md index a3abc0e2..4eac7920 100644 --- a/docs/blog/posts/2022-10-03-django_signin_signup.md +++ b/docs/blog/posts/2022-10-03-django_signin_signup.md @@ -147,7 +147,7 @@ urlpatterns = [ # include() is a function for including url file in each app 아래와 같은 화면으로 생성된다. -![django_login](img/django_login.png){ loading=lazy } +![django_login](./img/django_login.png){ loading=lazy } ### 1-5. 리다이렉트 지정 @@ -352,7 +352,7 @@ urlpatterns = [ 아래와 같은 화면으로 생성된다. -![django_signup](img/django_signup.png){ loading=lazy } +![django_signup](./img/django_signup.png){ loading=lazy } ## 4. 회원 탈퇴 @@ -468,7 +468,7 @@ urlpatterns = [ 아래와 같은 화면으로 생성된다. -![django_user_drop](img/django_user_drop.png){ loading=lazy } +![django_user_drop](./img/django_user_drop.png){ loading=lazy } --- ## Reference diff --git a/docs/blog/posts/2022-10-07-django_pagination.md b/docs/blog/posts/2022-10-07-django_pagination.md index 5bf5c6c8..69ea92d7 100644 --- a/docs/blog/posts/2022-10-07-django_pagination.md +++ b/docs/blog/posts/2022-10-07-django_pagination.md @@ -188,7 +188,7 @@ Type "help", "copyright", "credits" or "license" for more information. 페이지네이션이 적용된 결과는 아래와 같다. -![django_paging](img/django_paging.png){ loading=lazy } +![django_paging](./img/django_paging.png){ loading=lazy } --- ## Reference diff --git a/docs/blog/posts/2022-10-15-django_update_delete.md b/docs/blog/posts/2022-10-15-django_update_delete.md index 11420b60..536b8da7 100644 --- a/docs/blog/posts/2022-10-15-django_update_delete.md +++ b/docs/blog/posts/2022-10-15-django_update_delete.md @@ -336,7 +336,7 @@ Array.from(delete_elements).forEach(function (element) { 아래와 같이 페이지가 생성되고, 삭제 버튼을 누를 경우 확인창이 뜨는 것을 확인할 수 있다. -![django_delete](img/django_delete.png){ loading=lazy } +![django_delete](./img/django_delete.png){ loading=lazy } --- ## Reference diff --git a/docs/blog/posts/2022-10-22-django_many_to_many.md b/docs/blog/posts/2022-10-22-django_many_to_many.md index a3a9de68..635ebfba 100644 --- a/docs/blog/posts/2022-10-22-django_many_to_many.md +++ b/docs/blog/posts/2022-10-22-django_many_to_many.md @@ -165,7 +165,7 @@ Array.from(recommend_elements).forEach(function (element) { 아래와 같이 추천 기능이 정상적으로 작동하는 것을 확인할 수 있다. -![django_recommend](img/django_recommend.png){ loading=lazy } +![django_recommend](./img/django_recommend.png){ loading=lazy } --- ## Reference diff --git a/docs/blog/posts/2022-11-08-git_handling_branch.md b/docs/blog/posts/2022-11-08-git_handling_branch.md index 2146725e..cd86966a 100644 --- a/docs/blog/posts/2022-11-08-git_handling_branch.md +++ b/docs/blog/posts/2022-11-08-git_handling_branch.md @@ -48,7 +48,7 @@ git branch -d