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 ``` !!! tip - 참고로 원격 저장소의 브랜치를 삭제하려면 [`push`](2022-01-15-git_save_upload.md/#push) 명령어를 사용해야 한다. + 참고로 원격 저장소의 브랜치를 삭제하려면 [`push`](./2022-01-15-git_save_upload.md/#push) 명령어를 사용해야 한다. - 원격 저장소의 브랜치를 가져오기 @@ -57,7 +57,7 @@ git branch -t ``` !!! note - 원격 저장소에 여러 브랜치가 있는 경우 `pull`이나 `clone`을 하면 `main` 브랜치가 다운로드 되고 다른 브랜치들을 받아오지는 않는다. 따라서 [`git remote update`](2022-01-14-git_initiate.md/#remote) 명령어를 사용해서 원격 저장소의 브랜치에 접근할 수 있도록 해줘야 한다. + 원격 저장소에 여러 브랜치가 있는 경우 `pull`이나 `clone`을 하면 `main` 브랜치가 다운로드 되고 다른 브랜치들을 받아오지는 않는다. 따라서 [`git remote update`](./2022-01-14-git_initiate.md/#remote) 명령어를 사용해서 원격 저장소의 브랜치에 접근할 수 있도록 해줘야 한다. ## switch diff --git a/docs/blog/posts/2022-11-11-troubleshooting_pip.md b/docs/blog/posts/2022-11-11-troubleshooting_pip.md index 1e4ccbb1..2830f0d3 100644 --- a/docs/blog/posts/2022-11-11-troubleshooting_pip.md +++ b/docs/blog/posts/2022-11-11-troubleshooting_pip.md @@ -10,6 +10,7 @@ categories: tags: - python - pip + - troubleshooting --- Python pip 관련 이슈 해결 기록 @@ -22,7 +23,7 @@ Python pip 관련 이슈 해결 기록 Python으로 개발을 하다보면 아래와 같이 pip 버전이 오래되었다는 경고가 뜰 때가 있다. -![pip_version_warning](img/pip_version_warning.png){ loading=lazy } +![pip_version_warning](./img/pip_version_warning.png){ loading=lazy } 경고가 알려주는대로 복붙해서 업그레이드하면 된다. diff --git a/docs/blog/posts/2022-11-13-jekyll_responsive_page.md b/docs/blog/posts/2022-11-13-jekyll_responsive_page.md index 414248be..4a8ef8da 100644 --- a/docs/blog/posts/2022-11-13-jekyll_responsive_page.md +++ b/docs/blog/posts/2022-11-13-jekyll_responsive_page.md @@ -20,7 +20,7 @@ SCSS를 사용해서 Jekyll 프레임워크의 반응형 카테고리, 태그 ## 1. 목표 -기존에 사용하던 [카테고리/태그 페이지](2022-05-17-hydejack_categoryes_tags.md)에서 마음에 안 드는 점들이 있어서 수정해서 다시 만들었다. 이번 수정에서 개선한 내용은 아래와 같다. +기존에 사용하던 [카테고리/태그 페이지](./2022-05-17-hydejack_categoryes_tags.md)에서 마음에 안 드는 점들이 있어서 수정해서 다시 만들었다. 이번 수정에서 개선한 내용은 아래와 같다. 1. 필요 없는 코드 지우기 - 기존 코드는 다른 사람의 코드를 베껴서 만들다보니 기존 코드에는 필요 없는 코드가 많이 있었는데, 신규 코드는 처음부터 만드는 수준으로 기존 코드를 아주 약간만 참고해서 만들고 그 과정에서 필요 없는 코드는 다 지워버리기 @@ -147,7 +147,7 @@ layout: plain Jeykll에서 Sass 관련 파일은 `_sass` 디렉토리에서 관리하고, Hydejack 테마는 `my-style.scss` 파일을 통해 개발자가 스타일을 커스터마이징할 수 있도록 지원한다. -아래와 같이 [미디어 쿼리](2024-02-21-css_media_query.md)를 이용해 화면 크기에 따라 칼럼의 개수가 변하도록 만들어준다. +아래와 같이 [미디어 쿼리](./2024-02-21-css_media_query.md)를 이용해 화면 크기에 따라 칼럼의 개수가 변하도록 만들어준다. ```scss title="my-style.scss" // break point diff --git a/docs/blog/posts/2022-12-04-gitignore.md b/docs/blog/posts/2022-12-04-gitignore.md index 5edc4884..26137619 100644 --- a/docs/blog/posts/2022-12-04-gitignore.md +++ b/docs/blog/posts/2022-12-04-gitignore.md @@ -38,7 +38,7 @@ GitHub과 같은 Git 서비스를 이용한다면 저장소를 생성할 때 프 ## 기존 관리 대상 파일 제거 -기존에 관리 대상인 파일은 `.gitignore`에 추가하더라도 변경 내용이 추가로 업로드 되지 않는 것일 뿐 기존 내용은 그대로 저장소에 남아 있게 된다. 따라서 해당 파일을 [Git 저장소에서 삭제](2022-01-17-git_tips.md/#rm)해줘야 한다. +기존에 관리 대상인 파일은 `.gitignore`에 추가하더라도 변경 내용이 추가로 업로드 되지 않는 것일 뿐 기존 내용은 그대로 저장소에 남아 있게 된다. 따라서 해당 파일을 [Git 저장소에서 삭제](./2022-01-17-git_tips.md/#rm)해줘야 한다. - 파일을 워킹 트리와 인덱스에서 삭제 diff --git a/docs/blog/posts/2022-12-06-git_multi_profile.md b/docs/blog/posts/2022-12-06-git_multi_profile.md index bb78ea11..b658141c 100644 --- a/docs/blog/posts/2022-12-06-git_multi_profile.md +++ b/docs/blog/posts/2022-12-06-git_multi_profile.md @@ -142,7 +142,7 @@ cat djccnt15.pub GitHub의 경우 ssh 키를 아래와 같이 설정에 있는 SSH and GPG keys 메뉴에서 등록하면 된다. -![github_sshkey_01](img/github_sshkey_01.png){ loading=lazy } +![github_sshkey_01](./img/github_sshkey_01.png){ loading=lazy } ### 2-5. 연결 확인 @@ -167,7 +167,7 @@ Hi djccnt15! You've successfully authenticated, but GitHub does not provide shel 위와 같이 모든 준비가 끝나면 git 저장소에서 ssh를 통해 `clone`, `pull`, `push`를 할 수 있다. -![github_sshkey_02](img/github_sshkey_02.png){ loading=lazy } +![github_sshkey_02](./img/github_sshkey_02.png){ loading=lazy } ## 3. ⚡작업용 명령어 diff --git a/docs/blog/posts/2022-12-08-git_cowork.md b/docs/blog/posts/2022-12-08-git_cowork.md index c5814b5e..f84c7b4c 100644 --- a/docs/blog/posts/2022-12-08-git_cowork.md +++ b/docs/blog/posts/2022-12-08-git_cowork.md @@ -23,7 +23,7 @@ GitFlow 방식의 협업 방법론 정리 GitFlow는 아래 그림만 잘 봐도 이해할 수 있다. -![git_flow](img/git_flow.png){ loading=lazy } +![git_flow](./img/git_flow.png){ loading=lazy } ^[출처: A successful Git branching model](https://nvie.com/posts/a-successful-git-branching-model/)^ 부연 설명을 덧붙이자면, GitFlow 방법론에서는 Main, Develop의 핵심 브랜치 2개와 Release, Develop, Feature의 보조 브랜치 3개, 총 5개의 브랜치로 나누어서 소프트웨어 개발을 관리한다. diff --git a/docs/blog/posts/2022-12-09-vscode_python_breakpoint.md b/docs/blog/posts/2022-12-09-vscode_python_breakpoint.md index cc4ec8a6..1f0da606 100644 --- a/docs/blog/posts/2022-12-09-vscode_python_breakpoint.md +++ b/docs/blog/posts/2022-12-09-vscode_python_breakpoint.md @@ -11,6 +11,7 @@ tags: - VS Code - debug - python + - troubleshooting --- VS Code에서 Python 브레이크포인트 인식 버그 해결하기 diff --git a/docs/blog/posts/2022-12-18-univariate_data.md b/docs/blog/posts/2022-12-18-univariate_data.md index aedd12ab..73bca3fd 100644 --- a/docs/blog/posts/2022-12-18-univariate_data.md +++ b/docs/blog/posts/2022-12-18-univariate_data.md @@ -495,7 +495,7 @@ D(a, b) = \vert a - b \vert, \quad D(a, b) = (a - b)^{2} $$ !!! info - $D(a, b) = (a - b)^{2}$ 이 성립하는 이유는, 여기서 말하는 **거리**가 벡터의 크기([norm](2022-06-05-linear_algebra_inner_product_norm.md/#2-노름norm))를 의미하는 것이 아니기 때문이다. 데이터의 산포를 수학적으로 계산하기 위해서 **거리**를 사용할 때, 큰 것은 크게 작은 것은 작게 계산되는 부분에 변동이 없다면 제곱근을 하나 줄여 계산을 간결하게 하는 것이 더 좋다. + $D(a, b) = (a - b)^{2}$ 이 성립하는 이유는, 여기서 말하는 **거리**가 벡터의 크기([norm](./2022-06-05-linear_algebra_inner_product_norm.md/#2-노름norm))를 의미하는 것이 아니기 때문이다. 데이터의 산포를 수학적으로 계산하기 위해서 **거리**를 사용할 때, 큰 것은 크게 작은 것은 작게 계산되는 부분에 변동이 없다면 제곱근을 하나 줄여 계산을 간결하게 하는 것이 더 좋다. 따라서 위 정리를 바탕으로 모든 관측값들 간 거리의 합을 표현하면 아래와 같다. @@ -682,7 +682,7 @@ $$ ``` !!! tip - 표준화 외에도 다양한 scaling 방식이 있다. [관련 링크](2022-07-11-data_scalers.md) 참고 + 표준화 외에도 다양한 scaling 방식이 있다. [관련 링크](./2022-07-11-data_scalers.md) 참고 ### 2-4. 변동계수 diff --git a/docs/blog/posts/2022-12-23-multivariate_data.md b/docs/blog/posts/2022-12-23-multivariate_data.md index a8b2b0e8..5577fee3 100644 --- a/docs/blog/posts/2022-12-23-multivariate_data.md +++ b/docs/blog/posts/2022-12-23-multivariate_data.md @@ -25,7 +25,7 @@ tags: 분할표에서 비율(상대도수)를 표시할 때 기준(분모)을 어떻게 정하는지에 따라 결과가 달라지기 때문에, 분석 목적 및 자료의 수집 방법을 고려하여 기준을 정해야 한다. -엑셀을 활용하면 피봇 테이블 기능을 활용해서 분할표를 쉽게 만들 수 있고, csv 데이터를 Python을 활용해서 피봇 테이블을 만들고 싶다면 [pandas 라이브러리를 활용](2022-01-21-pd_pivot_table.md)하면 쉽게 만들 수 있다. +엑셀을 활용하면 피봇 테이블 기능을 활용해서 분할표를 쉽게 만들 수 있고, csv 데이터를 Python을 활용해서 피봇 테이블을 만들고 싶다면 [pandas 라이브러리를 활용](./2022-01-21-pd_pivot_table.md)하면 쉽게 만들 수 있다. ## 2. 공분산과 상관계수 @@ -33,7 +33,7 @@ tags: ### 2-1. 표본공분산 -**표본공분산(sample covariance)**은 아래 수식에서 볼 수 있듯이 [분산](2022-12-18-univariate_data.md/#표본분산) 형태의 구조를 파악하지만 하나의 변수가 아닌 두 변수를 동시에 고려하기 때문에 공분산이라고 부르며, 양수/음수일 경우 양/음의 기울기인 선분에 자료가 모여있는 것을 뜻한다. +**표본공분산(sample covariance)**은 아래 수식에서 볼 수 있듯이 [분산](./2022-12-18-univariate_data.md/#표본분산) 형태의 구조를 파악하지만 하나의 변수가 아닌 두 변수를 동시에 고려하기 때문에 공분산이라고 부르며, 양수/음수일 경우 양/음의 기울기인 선분에 자료가 모여있는 것을 뜻한다. $$ c_{x, y} = \frac{1}{n - 1}\sum_{i=1}^{n}(x_{i} - \overline{x})(y_{i} - \overline{y}) @@ -84,9 +84,9 @@ $$ ### 2-2. 표본상관계수 -표본공분산은 측정 단위의 영향을 받아 그 값 자체로는 선형 관계의 정도를 알 수 없기 때문에, 이를 보정하기 위해 자료들을 [표준화](2022-12-18-univariate_data.md/#표준화)하여 계산하는 **표본상관계수(coefficient of correlation)**를 사용한다. [칼 피어슨](https://en.wikipedia.org/wiki/Karl_Pearson)이 제시하였기 때문에 **피어슨 상관계수(Pearson's r)** 등으로 부르기도 한다. +표본공분산은 측정 단위의 영향을 받아 그 값 자체로는 선형 관계의 정도를 알 수 없기 때문에, 이를 보정하기 위해 자료들을 [표준화](./2022-12-18-univariate_data.md/#표준화)하여 계산하는 **표본상관계수(coefficient of correlation)**를 사용한다. [칼 피어슨](https://en.wikipedia.org/wiki/Karl_Pearson)이 제시하였기 때문에 **피어슨 상관계수(Pearson's r)** 등으로 부르기도 한다. -표본상관계수는 아래와 같이 [분산](2022-12-18-univariate_data.md/#표본분산)을 이용해서 구할 수 있다. +표본상관계수는 아래와 같이 [분산](./2022-12-18-univariate_data.md/#표본분산)을 이용해서 구할 수 있다. $$ \begin{align*} diff --git a/docs/blog/posts/2022-12-29-random_variable_probability_distribution.md b/docs/blog/posts/2022-12-29-random_variable_probability_distribution.md index 2ec6c066..7896342f 100644 --- a/docs/blog/posts/2022-12-29-random_variable_probability_distribution.md +++ b/docs/blog/posts/2022-12-29-random_variable_probability_distribution.md @@ -40,7 +40,7 @@ $$ 따라서 확률변수에 대해 $X = x$ 또는 $a \leq X \leq b$ 에 대응하는 확률을 계산할 수 있다. 이 때 확률변수는 숫자로 표시되고 해당 숫자에 대한 확률을 구할 수 있기 때문에 확률변수의 값에 따라 확률이 어떤 형태로 분포되어 있는지를 말할 수 있는데, 이를 **확률분포(probability distribution)**라 하고, 확률분포를 표로 정리한 것을 확률분포표(probability distribution table)라 한다. -[상대도수의 극한의 개념](2022-12-24-statistical_probability.md/#3-통계적-확률)에 따라 확률은 모집단의 구성 형태를 보여주기 때문에, 확률분포는 모집단을 숫자로 표현했을 때의 형태, 즉 모집단의 확률구조를 보여준다고 볼 수 있다. +[상대도수의 극한의 개념](./2022-12-24-statistical_probability.md/#3-통계적-확률)에 따라 확률은 모집단의 구성 형태를 보여주기 때문에, 확률분포는 모집단을 숫자로 표현했을 때의 형태, 즉 모집단의 확률구조를 보여준다고 볼 수 있다. ## 2. 이산확률변수와 확률질량함수 @@ -90,7 +90,7 @@ $$ 확률변수가 가질 수 있는 값이 셀 수 없을 정도로 많은 경우에 **연속확률변수(continuous random variable)**라고 하며, 연속확률변수의 확률구조를 **확률밀도함수(probability density function, PDF)**를 통해 나타낼 수 있다. -[히스토그램](2022-12-17-variable_types.md/#4-히스토그램과-막대-그래프의-차이)에서 면적이 해당 구간에서의 비율을 의미하듯이, 확률밀도함수에서의 면적은 해당 구간에서의 확률을 의미하며, $f(x)$는 $x$에서의 확률이 아니라 그 위치에서 상대적으로 얼마나 밀집되어 있는지를 나타낸 것이다. +[히스토그램](./2022-12-17-variable_types.md/#4-히스토그램과-막대-그래프의-차이)에서 면적이 해당 구간에서의 비율을 의미하듯이, 확률밀도함수에서의 면적은 해당 구간에서의 확률을 의미하며, $f(x)$는 $x$에서의 확률이 아니라 그 위치에서 상대적으로 얼마나 밀집되어 있는지를 나타낸 것이다. ### 3-1. 확률밀도함수의 성질 diff --git a/docs/blog/posts/2022-12-31-expectation_population_variance.md b/docs/blog/posts/2022-12-31-expectation_population_variance.md index 7800f610..335213af 100644 --- a/docs/blog/posts/2022-12-31-expectation_population_variance.md +++ b/docs/blog/posts/2022-12-31-expectation_population_variance.md @@ -21,13 +21,13 @@ tags: ## 1. 모평균(기대값) -[표본평균](2022-12-18-univariate_data.md/#표본평균)을 [상대도수](2022-12-17-variable_types.md/#2-범주형-자료와-상대도수)를 이용한 식으로 표현하면 아래와 같이 관측된 자료의 값에 각 자료가 전체 자료에서 차지하는 비율을 곱하여 더한 것으로 표현할 수 있다. +[표본평균](./2022-12-18-univariate_data.md/#표본평균)을 [상대도수](./2022-12-17-variable_types.md/#2-범주형-자료와-상대도수)를 이용한 식으로 표현하면 아래와 같이 관측된 자료의 값에 각 자료가 전체 자료에서 차지하는 비율을 곱하여 더한 것으로 표현할 수 있다. $$ \overline{x} = \sum_{i=1}^{n}x_{i} \frac{n_{i}}{n} = \sum_{i=1}^{n}x_{i}p_{i}, \quad p_{i} = \frac{n_{i}}{n} $$ -이 때 $n_{i}$는 도수분포에서 $i$ 번째 값의 개수이고 $p_{i}$는 $i$ 번째 값의 표본비율이므로, [상대도수의 극한의 개념](2022-12-24-statistical_probability.md/#3-통계적-확률)에 따라 위 식에서 $n$이 무한대로 발산하면 모집단에서 각 사건이 발생할 확률이 되어 이를 통해 모평균을 구할 수 있다. 이를 **[큰 수의 법칙(Law of large numbers, LLN)](https://en.wikipedia.org/wiki/Law_of_large_numbers)**이라 한다. +이 때 $n_{i}$는 도수분포에서 $i$ 번째 값의 개수이고 $p_{i}$는 $i$ 번째 값의 표본비율이므로, [상대도수의 극한의 개념](./2022-12-24-statistical_probability.md/#3-통계적-확률)에 따라 위 식에서 $n$이 무한대로 발산하면 모집단에서 각 사건이 발생할 확률이 되어 이를 통해 모평균을 구할 수 있다. 이를 **[큰 수의 법칙(Law of large numbers, LLN)](https://en.wikipedia.org/wiki/Law_of_large_numbers)**이라 한다. $$ \overline{x} = \sum_{i}x_{i}p_{i} \ \to \ \overline{X} = \sum_{i}x_{i}f(x_{i}) = \mu = E(X) @@ -93,13 +93,13 @@ $$ ## 2. 모분산 -[표본분산](2022-12-18-univariate_data.md/#표본분산)을 [상대도수](2022-12-17-variable_types.md/#2-범주형-자료와-상대도수)를 이용한 식으로 표현하면 아래와 같이 표현할 수 있다. +[표본분산](./2022-12-18-univariate_data.md/#표본분산)을 [상대도수](./2022-12-17-variable_types.md/#2-범주형-자료와-상대도수)를 이용한 식으로 표현하면 아래와 같이 표현할 수 있다. $$ s^{2} = \frac{1}{n - 1}\sum_{i=1}^{k}n_{i}(x_{i} - \overline{x})^{2} = \frac{n}{n - 1}\sum_{i=1}^{k}(x_{i} - \overline{x})^{2}p_{i}, \quad p_{i} = \frac{n_{i}}{n} $$ -모평균과 마찬가지로 [상대도수의 극한의 개념](2022-12-24-statistical_probability.md/#3-통계적-확률)에 따라 위 식에서 $n$이 무한대로 발산하면 모집단에서의 자료의 분포에 대한 정보가 되어 아래와 같이 **모분산(population variance)**에 대한 식을 도출할 수 있다. +모평균과 마찬가지로 [상대도수의 극한의 개념](./2022-12-24-statistical_probability.md/#3-통계적-확률)에 따라 위 식에서 $n$이 무한대로 발산하면 모집단에서의 자료의 분포에 대한 정보가 되어 아래와 같이 **모분산(population variance)**에 대한 식을 도출할 수 있다. $$ s^{2} = \frac{n}{n - 1}\sum_{i=1}^{k}(x_{i} - \overline{x})^{2}p_{i} \ \to \ \sigma^{2} = \sum_{i=1}^{k}(x_{i} - \mu)^{2}f(x_{i}) = Var(x) diff --git a/docs/blog/posts/2023-01-01-probability_vector_covariance.md b/docs/blog/posts/2023-01-01-probability_vector_covariance.md index 54e3af66..1501530f 100644 --- a/docs/blog/posts/2023-01-01-probability_vector_covariance.md +++ b/docs/blog/posts/2023-01-01-probability_vector_covariance.md @@ -61,7 +61,7 @@ $$ ### 1-2. 주변분포 -표본공간이 사건 $B_{1}, B_{2}, \cdots, B_{n}$로 [분할](2022-12-25-conditional_probability.md/#2-2-표본공간의-분할과-조건부-확률)될 때 사건 $A$의 확률은 아래와 같다. +표본공간이 사건 $B_{1}, B_{2}, \cdots, B_{n}$로 [분할](./2022-12-25-conditional_probability.md/#2-2-표본공간의-분할과-조건부-확률)될 때 사건 $A$의 확률은 아래와 같다. $$ P(X = x) = P(A) = \sum_{i=1}^{n}P(A \cap B_{i}) = \sum_{i=1}^{n}P(X = x, Y = y_{i}) @@ -132,7 +132,7 @@ $$ ### 2-2. 결합분포의 공분산 -[표본공분산](2022-12-23-multivariate_data.md/#2-1-표본공분산)을 상대도수를 이용한 식으로 표현하면 아래와 같다. +[표본공분산](./2022-12-23-multivariate_data.md/#2-1-표본공분산)을 상대도수를 이용한 식으로 표현하면 아래와 같다. $$ \begin{align*} @@ -142,7 +142,7 @@ c_{x, y} & = \frac{1}{n - 1}\sum_{i=1}^{k1}\sum_{j=1}^{k2}n_{ij}(x_{i} - \overli \end{align*} $$ -따라서 위 식에 [상대도수의 극한의 개념](2022-12-24-statistical_probability.md/#3-통계적-확률)을 적용하면 모집단의 공분산은 아래와 같이 표현할 수 있다. +따라서 위 식에 [상대도수의 극한의 개념](./2022-12-24-statistical_probability.md/#3-통계적-확률)을 적용하면 모집단의 공분산은 아래와 같이 표현할 수 있다. $$ \begin{align*} @@ -228,7 +228,7 @@ $$ ### 2-4. 결합분포의 상관계수 -[표본상관계수](2022-12-23-multivariate_data.md/#2-2-표본상관계수)와 마찬가지로, 모집단에 대한 확률변수의 상관계수도 [표준화](2022-12-18-univariate_data.md/#표준화)한 확률변수를 통해 계산한다. +[표본상관계수](./2022-12-23-multivariate_data.md/#2-2-표본상관계수)와 마찬가지로, 모집단에 대한 확률변수의 상관계수도 [표준화](./2022-12-18-univariate_data.md/#표준화)한 확률변수를 통해 계산한다. $$ \begin{gathered} diff --git a/docs/blog/posts/2023-01-07-discrete_distribution.md b/docs/blog/posts/2023-01-07-discrete_distribution.md index c4885f20..8f9eefed 100644 --- a/docs/blog/posts/2023-01-07-discrete_distribution.md +++ b/docs/blog/posts/2023-01-07-discrete_distribution.md @@ -88,7 +88,7 @@ $$ X = X_{1} + X_{2} + \cdots + X_{n} $$ -따라서 [독립인 결합분포의 성질](2023-01-01-probability_vector_covariance.md/#2-공분산과-상관계수)을 바탕으로 이항분포의 기대값과 분산을 유도하면 아래와 같다. +따라서 [독립인 결합분포의 성질](./2023-01-01-probability_vector_covariance.md/#2-공분산과-상관계수)을 바탕으로 이항분포의 기대값과 분산을 유도하면 아래와 같다. $$ \begin{align*} @@ -657,7 +657,7 @@ Var(X_{i}) & = np_{i}(1 - p_{i}) \end{align*} $$ -또한 특정 결과들($R_{i} \cup R_{j}$)에 관심이 있는 경우 아래와 같이 이항분포의 [결합분포](2023-01-01-probability_vector_covariance.md/#2-공분산과-상관계수)로 다룰 수 있다. +또한 특정 결과들($R_{i} \cup R_{j}$)에 관심이 있는 경우 아래와 같이 이항분포의 [결합분포](./2023-01-01-probability_vector_covariance.md/#2-공분산과-상관계수)로 다룰 수 있다. $$ \begin{align*} diff --git a/docs/blog/posts/2023-02-11-normal_distribution.md b/docs/blog/posts/2023-02-11-normal_distribution.md index 125d9fdf..e28389a0 100644 --- a/docs/blog/posts/2023-02-11-normal_distribution.md +++ b/docs/blog/posts/2023-02-11-normal_distribution.md @@ -26,7 +26,7 @@ $$ X \sim N(\mu, \sigma^{2}) $$ -![Normal_Distribution_PDF](img/Normal_Distribution_PDF.svg){ loading=lazy } +![Normal_Distribution_PDF](./img/Normal_Distribution_PDF.svg){ loading=lazy } ^[출처: wikipedia - Normal distribution](https://en.wikipedia.org/wiki/Normal_distribution)^ 정규분포의 확률질량함수는 아래와 같다. diff --git a/docs/blog/posts/2023-02-15-sampling_distribution.md b/docs/blog/posts/2023-02-15-sampling_distribution.md index 85356eb7..cedfa12c 100644 --- a/docs/blog/posts/2023-02-15-sampling_distribution.md +++ b/docs/blog/posts/2023-02-15-sampling_distribution.md @@ -54,9 +54,9 @@ $$ ### 1-3. 표본분포 -통계량의 확률분포를 **표본분포(sampling distribution)**라 하며, 통계량의 [표준편차](2022-12-18-univariate_data.md/#표본표준편차)($SD$)를 **표준 오차(standard error)**라고 한다. +통계량의 확률분포를 **표본분포(sampling distribution)**라 하며, 통계량의 [표준편차](./2022-12-18-univariate_data.md/#표본표준편차)($SD$)를 **표준 오차(standard error)**라고 한다. -표본평균/표본비율, 표본분산/표본표준편차, 극한값 등 다양한 통계량이 있는데, 표본평균을 예로 들면 평균이 $\mu$, 분산이 $\sigma^{2}$인 [정규분포](2023-02-11-normal_distribution.md)에서 $n$개의 확률표본을 추출했을 때 표본평균 $\overline{X}$의 분포는 아래와 같다. +표본평균/표본비율, 표본분산/표본표준편차, 극한값 등 다양한 통계량이 있는데, 표본평균을 예로 들면 평균이 $\mu$, 분산이 $\sigma^{2}$인 [정규분포](./2023-02-11-normal_distribution.md)에서 $n$개의 확률표본을 추출했을 때 표본평균 $\overline{X}$의 분포는 아래와 같다. $$ \begin{align*} @@ -83,7 +83,7 @@ $$ \end{align*} $$ -모집단이 정규분포일 때 통계량 $\overline{X}$을 [표준화](2022-12-18-univariate_data.md/#표준화) 하면 아래와 같다. +모집단이 정규분포일 때 통계량 $\overline{X}$을 [표준화](./2022-12-18-univariate_data.md/#표준화) 하면 아래와 같다. $$ \begin{gathered} @@ -97,9 +97,9 @@ $$ ### 2-1. 큰 수의 법칙 -위에서 확인했듯이 평균이 $\mu$, 분산이 $\sigma^{2}$인 [정규분포](2023-02-11-normal_distribution.md)에서 $n$개의 확률표본을 추출했을 때 [표본평균](2022-12-18-univariate_data.md/#1-1-평균) $\overline{X}$의 평균과 분산은 각각 $\mu$와 $\sigma^{2}/n$이 된다. 이 때, $n$이 무한대로 발산하면 $\overline{X}$는 $\mu$로 수렴한다. +위에서 확인했듯이 평균이 $\mu$, 분산이 $\sigma^{2}$인 [정규분포](./2023-02-11-normal_distribution.md)에서 $n$개의 확률표본을 추출했을 때 [표본평균](./2022-12-18-univariate_data.md/#1-1-평균) $\overline{X}$의 평균과 분산은 각각 $\mu$와 $\sigma^{2}/n$이 된다. 이 때, $n$이 무한대로 발산하면 $\overline{X}$는 $\mu$로 수렴한다. -이처럼 표본집단의 크기가 커지면 그 표본평균이 모평균에 가까워지며 결과적으로 [확률분포](2022-12-29-random_variable_probability_distribution.md/#1-1-확률분포)가 [통계적 확률](2022-12-24-statistical_probability.md/#3-통계적-확률)로 수렴하는 것을 큰 수의 법칙이라고 한다. +이처럼 표본집단의 크기가 커지면 그 표본평균이 모평균에 가까워지며 결과적으로 [확률분포](./2022-12-29-random_variable_probability_distribution.md/#1-1-확률분포)가 [통계적 확률](./2022-12-24-statistical_probability.md/#3-통계적-확률)로 수렴하는 것을 큰 수의 법칙이라고 한다. 이러한 정리가 **큰 수의 법칙(law of large numbers)** 중 하나인 약한 큰 수의 법칙이며 아래와 같이 표현한다. @@ -137,7 +137,7 @@ $$ ### 3-1. 표본평균의 표본분포 -[이항분포](2023-01-07-discrete_distribution.md/#2-이항분포)의 [표본평균](2022-12-18-univariate_data.md/#1-1-평균)은 각각의 조건에 따라 아래와 같이 근사한다. +[이항분포](./2023-01-07-discrete_distribution.md/#2-이항분포)의 [표본평균](./2022-12-18-univariate_data.md/#1-1-평균)은 각각의 조건에 따라 아래와 같이 근사한다. - $n$이 크고 $p$가 작은 경우: 포아송 근사 - $n$이 크고 $p$가 큰 경우: 포아송 근사 @@ -200,7 +200,7 @@ $$ ### 3-2. 표본분산의 표본분포 -모집단이 정규분포를 따를 때, [표본분산](2022-12-18-univariate_data.md/#표본분산)의 표본분포는 자유도가 $n - 1$인 카이제곱분포로 근사한다. +모집단이 정규분포를 따를 때, [표본분산](./2022-12-18-univariate_data.md/#표본분산)의 표본분포는 자유도가 $n - 1$인 카이제곱분포로 근사한다. $$ P(X) \simeq \chi_{n - 1}^{2} diff --git a/docs/blog/posts/2023-03-04-oracle_xe_install.md b/docs/blog/posts/2023-03-04-oracle_xe_install.md index b9da062d..a11d18d7 100644 --- a/docs/blog/posts/2023-03-04-oracle_xe_install.md +++ b/docs/blog/posts/2023-03-04-oracle_xe_install.md @@ -29,7 +29,7 @@ Oracle Database Express Edition 설치 및 사용 방법 설치 단계에서 데이터베이스 비밀번호를 물어보는데, `admin` 같이 적당히 쉽고 기억하기 좋은 것으로 정하자. 잊어버리면 매우 귀찮아진다. -![oracle_xe_install](img/oracle_xe_install.png){ loading=lazy width="600px" } +![oracle_xe_install](./img/oracle_xe_install.png){ loading=lazy width="600px" } ## 3. DBeaver 연결 @@ -50,7 +50,7 @@ Lsnrctl services 아래와 같이 접속 정보를 맞게 설정해주면 정상적으로 접속된다. -![oracle_xe_dbeaver](img/oracle_xe_dbeaver.png){ loading=lazy width="600px" } +![oracle_xe_dbeaver](./img/oracle_xe_dbeaver.png){ loading=lazy width="600px" } --- ## Reference diff --git a/docs/blog/posts/2023-03-05-oracle_user_schema.md b/docs/blog/posts/2023-03-05-oracle_user_schema.md index fc5b01a3..cf037e1c 100644 --- a/docs/blog/posts/2023-03-05-oracle_user_schema.md +++ b/docs/blog/posts/2023-03-05-oracle_user_schema.md @@ -40,7 +40,7 @@ CREATE USER ID IDENTIFIED BY password; 이 때 생성된 유저는 기본적으로 `USERS` Tablespace에 얼마만큼의 영역을 할당한 것인지 정해지지 않은 상태이기 때문에 데이터를 입력할 수 없어 `INSERT`에 대한 에러가 발생하는 것이다. -따라서 아래와 같이 [GRANT](2022-08-11-relational_database.md/#5-dcl)를 통해 관련 권한을 부여해주면 에러가 해결된다. +따라서 아래와 같이 [GRANT](./2022-08-11-relational_database.md/#5-dcl)를 통해 관련 권한을 부여해주면 에러가 해결된다. ```sql -- 무제한 용량 권한 부여 diff --git a/docs/blog/posts/2023-03-08-correlation_analysis.md b/docs/blog/posts/2023-03-08-correlation_analysis.md index a68afcc4..3396a05a 100644 --- a/docs/blog/posts/2023-03-08-correlation_analysis.md +++ b/docs/blog/posts/2023-03-08-correlation_analysis.md @@ -68,7 +68,7 @@ plt.savefig(fname='iris_corr.png', bbox_inches='tight') plt.show() ``` -![iris_corr](img/iris_corr.png){ loading=lazy } +![iris_corr](./img/iris_corr.png){ loading=lazy } ## 필요한 칼럼만 골라서 분석하기 @@ -170,4 +170,4 @@ plt.savefig(fname='iris_corr_scatter.png', bbox_inches='tight') plt.show() ``` -![iris_corr_scatter](img/iris_corr_scatter.png){ loading=lazy } \ No newline at end of file +![iris_corr_scatter](./img/iris_corr_scatter.png){ loading=lazy } \ No newline at end of file diff --git a/docs/blog/posts/2023-03-12-git_restore.md b/docs/blog/posts/2023-03-12-git_restore.md index 9cbd8b2b..dfadf718 100644 --- a/docs/blog/posts/2023-03-12-git_restore.md +++ b/docs/blog/posts/2023-03-12-git_restore.md @@ -21,7 +21,7 @@ Git restore 명령어의 활용 방법 ## restore -[`restore`](2022-01-17-git_tips.md/#restore) 명령어는 원래 수정 사항을 되돌리기 위해 사용하는 명령어로, 아래와 같이 사용한다. +[`restore`](./2022-01-17-git_tips.md/#restore) 명령어는 원래 수정 사항을 되돌리기 위해 사용하는 명령어로, 아래와 같이 사용한다. - 수정 사항 되돌리기 diff --git a/docs/blog/posts/2023-03-18-pandas_profiling.md b/docs/blog/posts/2023-03-18-pandas_profiling.md index e6fdcf5f..14a0efce 100644 --- a/docs/blog/posts/2023-03-18-pandas_profiling.md +++ b/docs/blog/posts/2023-03-18-pandas_profiling.md @@ -37,7 +37,7 @@ profile.to_file("your_report.html") 대략 아래와 같은 보고서를 만들어준다. -![ydata_sample](img/ydata_sample.gif){ loading=lazy width=600 } +![ydata_sample](./img/ydata_sample.gif){ loading=lazy width=600 } ^[출처: https://ydata-profiling.ydata.ai](https://ydata-profiling.ydata.ai/docs/master/pages/integrations/data_apps.html)^ --- diff --git a/docs/blog/posts/2023-03-24-encoding_categoric.md b/docs/blog/posts/2023-03-24-encoding_categoric.md index f3c797d2..25bbcdd1 100644 --- a/docs/blog/posts/2023-03-24-encoding_categoric.md +++ b/docs/blog/posts/2023-03-24-encoding_categoric.md @@ -21,7 +21,7 @@ tags: 데이터에 대한 수학적 분석을 통해 모델을 만드려면 반드시 모든 데이터가 숫자로 이루어져 있어야 한다. -[pandas를 직접 전처리하거나 NumPy가 제공하는 함수를 사용](2022-01-20-conditional_replace.md)해서 [범주형 자료](2022-12-17-variable_types.md/#1-1-자료의-분류)를 수치화하는 전처리 작업을 직접 진행할 수도 있지만, scikit-learn이나 pandas에서 인코딩을 쉽게 할 수 있는 API를 제공하고 있어 정리해둔다. +[pandas를 직접 전처리하거나 NumPy가 제공하는 함수를 사용](./2022-01-20-conditional_replace.md)해서 [범주형 자료](./2022-12-17-variable_types.md/#1-1-자료의-분류)를 수치화하는 전처리 작업을 직접 진행할 수도 있지만, scikit-learn이나 pandas에서 인코딩을 쉽게 할 수 있는 API를 제공하고 있어 정리해둔다. ## Label 인코딩 diff --git a/docs/blog/posts/2023-03-26-baekjoon_2480.md b/docs/blog/posts/2023-03-26-baekjoon_2480.md index 7c5054a8..d8185d39 100644 --- a/docs/blog/posts/2023-03-26-baekjoon_2480.md +++ b/docs/blog/posts/2023-03-26-baekjoon_2480.md @@ -23,7 +23,7 @@ tags: --- -각각의 조건을 직접 비교해주는 방법도 있지만, 아래와 같이 [상대도수](2022-12-17-variable_types.md/#2-범주형 자료와-상대도수) 개념을 사용한다면 조금 더 재미있게 해결할 수 있다. +각각의 조건을 직접 비교해주는 방법도 있지만, 아래와 같이 [상대도수](./2022-12-17-variable_types.md/#2-범주형 자료와-상대도수) 개념을 사용한다면 조금 더 재미있게 해결할 수 있다. ```python d = [int(x) for x in input().split()] diff --git a/docs/blog/posts/2023-04-09-recursion.md b/docs/blog/posts/2023-04-09-recursion.md index d4638c40..7a83cbd7 100644 --- a/docs/blog/posts/2023-04-09-recursion.md +++ b/docs/blog/posts/2023-04-09-recursion.md @@ -8,7 +8,7 @@ description: > categories: - Computer Science tags: - - data structure + - recursion --- 부분곱과 팩토리얼 구현으로 알아보는 재귀함수 @@ -64,7 +64,7 @@ Python에서 $\prod$을 구현하는 방법들은 아래와 같다. ## 재귀함수 -**[재귀함수(recursive function)](2023-04-09-recursion.md)**는 아래 함수처럼 함수 내에서 자기 자신을 다시 호출하는 함수를 말한다. +**[재귀함수(recursive function)](./2023-04-09-recursion.md)**는 아래 함수처럼 함수 내에서 자기 자신을 다시 호출하는 함수를 말한다. === "Production" diff --git a/docs/blog/posts/2023-04-22-fastapi_architecture.md b/docs/blog/posts/2023-04-22-fastapi_architecture.md index 29c3254d..98a7ea70 100644 --- a/docs/blog/posts/2023-04-22-fastapi_architecture.md +++ b/docs/blog/posts/2023-04-22-fastapi_architecture.md @@ -67,19 +67,19 @@ uvicorn main:app --reload 구동한 서버로 접속해보면 단 몇 줄의 짧은 코드로 아래와 같이 API가 생성된 것을 확인할 수 있다. -![fastapi_firstlook](img/fastapi_firstlook.png){ loading=lazy } +![fastapi_firstlook](./img/fastapi_firstlook.png){ loading=lazy } ### 1-3. OpenAPI FastAPI는 OpenAPI(Swagger)를 기본으로 제공하는데, 아래와 같이 `/docs` 주소로 접속해서 확인할 수 있다. -![fastapi_docs](img/fastapi_docs.png){ loading=lazy } +![fastapi_docs](./img/fastapi_docs.png){ loading=lazy } ## 2. 아키텍처 FastAPI 기반 백엔드 서버의 전체적인 아키텍처는 아래와 같다. -![fastapi_server_architecture](img/fastapi_server_architecture.png){ loading=lazy } +![fastapi_server_architecture](./img/fastapi_server_architecture.png){ loading=lazy } ### 2-1. Web Server diff --git a/docs/blog/posts/2023-08-01-baekjoon_2738.md b/docs/blog/posts/2023-08-01-baekjoon_2738.md index 5d753185..0d365052 100644 --- a/docs/blog/posts/2023-08-01-baekjoon_2738.md +++ b/docs/blog/posts/2023-08-01-baekjoon_2738.md @@ -17,7 +17,7 @@ N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프 --- -선형대수를 공부하면서 만들었던 [아래 함수](2022-05-01-linear_algebra_vector_scalar.md/#덧셈과-뺄셈)를 이용하면 여러 행렬의 합을 쉽게 구할 수 있다. +선형대수를 공부하면서 만들었던 [아래 함수](./2022-05-01-linear_algebra_vector_scalar.md/#덧셈과-뺄셈)를 이용하면 여러 행렬의 합을 쉽게 구할 수 있다. ```python def add(*a): diff --git a/docs/blog/posts/2023-08-11-baekjoon_2798.md b/docs/blog/posts/2023-08-11-baekjoon_2798.md index fe79061e..79a3be22 100644 --- a/docs/blog/posts/2023-08-11-baekjoon_2798.md +++ b/docs/blog/posts/2023-08-11-baekjoon_2798.md @@ -17,7 +17,7 @@ N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으 --- -[경우의 수](2022-12-24-statistical_probability.md/#2-경우의-수)를 다룰 때 나오는 [조합](2022-12-24-statistical_probability.md/#2-3-조합)에 대한 문제로, 아래와 같이 모든 경우의 수를 찾아낸 후 조건에 맞게 결과를 출력해주면 된다. +[경우의 수](./2022-12-24-statistical_probability.md/#2-경우의-수)를 다룰 때 나오는 [조합](./2022-12-24-statistical_probability.md/#2-3-조합)에 대한 문제로, 아래와 같이 모든 경우의 수를 찾아낸 후 조건에 맞게 결과를 출력해주면 된다. ```python (n, m), l = ([int(x) for x in input().split()] for _ in range(2)) @@ -34,7 +34,7 @@ print( ) ``` -Python에는 [조합](2022-12-24-statistical_probability.md/#2-3-조합)을 위한 내장 클래스 `combinations`가 있다. `combinations`를 사용하면 아래와 같이 간결하게 만들 수 있다. +Python에는 [조합](./2022-12-24-statistical_probability.md/#2-3-조합)을 위한 내장 클래스 `combinations`가 있다. `combinations`를 사용하면 아래와 같이 간결하게 만들 수 있다. ```python from itertools import combinations diff --git a/docs/blog/posts/2023-09-08-tcp_port_error.md b/docs/blog/posts/2023-09-08-tcp_port_error.md index dd27282c..143b6f4a 100644 --- a/docs/blog/posts/2023-09-08-tcp_port_error.md +++ b/docs/blog/posts/2023-09-08-tcp_port_error.md @@ -6,10 +6,11 @@ date: description: > Windows에서 TCP 포트 사용 범위 제외 문제 해결 방법 categories: - - SW Engineering + - Server Engineering tags: - network - port + - troubleshooting --- Windows에서 TCP 포트 사용 범위 제외 문제 해결 방법 diff --git a/docs/blog/posts/2023-09-11-sql_tuning_basic.md b/docs/blog/posts/2023-09-11-sql_tuning_basic.md index 65c0c058..7b06e51f 100644 --- a/docs/blog/posts/2023-09-11-sql_tuning_basic.md +++ b/docs/blog/posts/2023-09-11-sql_tuning_basic.md @@ -29,7 +29,7 @@ SQL 조회 쿼리 튜닝 기초 팁 - VARCHAR로 지정된 숫자 칼럼의 경우 변수를 숫자로 사용하게 되면 내부적으로 칼럼에 TO_NUMBER 함수로 형변환을 하기 때문에 마찬가지로 index를 사용할 수 없게 됨 1. 한 테이블은 한번만 조회 - 테이블에 여러 번 조회할수록 조회 성능이 저하됨 - - [SQL문의 수행 순서](2022-08-13-sql_where_groupby.md/#5-sql)는 `FROM` → `WHERE` → `GROUP BY` → `HAVING` → `SELECT` → `ORDER BY`이기 때문에 한 테이블의 데이터는 한번에 가져오는 것이 IO 비용이 절감됨 + - [SQL문의 수행 순서](./2022-08-13-sql_where_groupby.md/#5-sql)는 `FROM` → `WHERE` → `GROUP BY` → `HAVING` → `SELECT` → `ORDER BY`이기 때문에 한 테이블의 데이터는 한번에 가져오는 것이 IO 비용이 절감됨 --- ## Reference diff --git a/docs/blog/posts/2023-09-19-tensorflow_install_note.md b/docs/blog/posts/2023-09-19-tensorflow_install_note.md index 35740305..ed941f5a 100644 --- a/docs/blog/posts/2023-09-19-tensorflow_install_note.md +++ b/docs/blog/posts/2023-09-19-tensorflow_install_note.md @@ -10,6 +10,7 @@ categories: tags: - AI - TensorFlow + - troubleshooting --- TensorFlow 설치 관련 주의할 점들에 대한 기록들 diff --git a/docs/blog/posts/2023-09-21-python_logging.md b/docs/blog/posts/2023-09-21-python_logging.md index 2c51a8df..caaff69f 100644 --- a/docs/blog/posts/2023-09-21-python_logging.md +++ b/docs/blog/posts/2023-09-21-python_logging.md @@ -139,7 +139,7 @@ Python이 기본 제공하는 다양한 Log Handler 중에 [TimedRotatingFileHan | process | %(process)d | 프로세스 ID(가능할 경우에만) | | thread | %(thread)d | 쓰레드 ID(가능할 경우에만) | -[^2]: 엄밀히 말하면 `asctime`은 `LogRecord` 객체의 요소는 아니다. `LogRecord` 객체는 `time.time()`[^3]으로 생성시간을 저장한 후, [`Formatter`](#formatter)가 생성시간을 [`time.strftime`](2022-12-03-python_datetime.md/#strftime)을 사용해서 입력받은 포맷대로 생성해준다. +[^2]: 엄밀히 말하면 `asctime`은 `LogRecord` 객체의 요소는 아니다. `LogRecord` 객체는 `time.time()`[^3]으로 생성시간을 저장한 후, [`Formatter`](#formatter)가 생성시간을 [`time.strftime`](./2022-12-03-python_datetime.md/#strftime)을 사용해서 입력받은 포맷대로 생성해준다. [^3]: 시간의 시작점인 *epoch*[^4] 로부터의 초를 반환한다. [^4]: January 1, 1970, 00:00:00 (UTC) diff --git a/docs/blog/posts/2023-11-13-gradle_build_error.md b/docs/blog/posts/2023-11-13-gradle_build_error.md index 6d43aedc..2779d968 100644 --- a/docs/blog/posts/2023-11-13-gradle_build_error.md +++ b/docs/blog/posts/2023-11-13-gradle_build_error.md @@ -11,6 +11,7 @@ tags: - java - gradle - IntelliJ + - troubleshooting --- Gradle 빌드 에러 해결 기록들 diff --git a/docs/blog/posts/2023-12-23-cache_pattern.md b/docs/blog/posts/2023-12-23-cache_pattern.md index ed5286bd..7466e759 100644 --- a/docs/blog/posts/2023-12-23-cache_pattern.md +++ b/docs/blog/posts/2023-12-23-cache_pattern.md @@ -28,7 +28,7 @@ tags: Read 관점에서 많이 활용되는 패턴 -![cache_aside_pattern_read](img/cache_aside_pattern_read.png){ loading=lazy } +![cache_aside_pattern_read](./img/cache_aside_pattern_read.png){ loading=lazy } 1. Cache Query 1. Cache에 데이터 없을 경우 Database Query @@ -36,7 +36,7 @@ Read 관점에서 많이 활용되는 패턴 - TTL 옵션 지정을 통해 Cache 메모리 관리 - 데이터의 특성에 따라 적절한 TTL 지정 필요 -![cache_aside_pattern_write](img/cache_aside_pattern_write.png){ loading=lazy } +![cache_aside_pattern_write](./img/cache_aside_pattern_write.png){ loading=lazy } 1. Database Create 1. Invalidate Cache Data @@ -46,7 +46,7 @@ Read 관점에서 많이 활용되는 패턴 Write 관점에서 많이 활용되는 패턴 -![write_back_pattern](img/write_back_pattern.png){ loading=lazy } +![write_back_pattern](./img/write_back_pattern.png){ loading=lazy } 1. 서버는 다수의 쓰기 작업을 Cache로 전송 1. Cache에서 다수의 쓰기 작업을 모아 Database로 Bulk Insert 함 diff --git a/docs/blog/posts/2024-01-03-netstat_taskkill.md b/docs/blog/posts/2024-01-03-netstat_taskkill.md index 9951411b..b29e029d 100644 --- a/docs/blog/posts/2024-01-03-netstat_taskkill.md +++ b/docs/blog/posts/2024-01-03-netstat_taskkill.md @@ -11,6 +11,7 @@ tags: - cmd - terminal - taskkill + - troubleshooting --- port를 사용중인 프로세스가 제대로 종료되지 않아 문제가 될 때는 해당 프로세스를 강제로 종료해주면 된다. diff --git a/docs/blog/posts/2024-01-27-spring_batch.md b/docs/blog/posts/2024-01-27-spring_batch.md index 215a8cd9..68a176b8 100644 --- a/docs/blog/posts/2024-01-27-spring_batch.md +++ b/docs/blog/posts/2024-01-27-spring_batch.md @@ -23,7 +23,7 @@ Spring Batch를 활용한 Java 배치 프로그램 만들기 Spring Batch는 아래 구조로 구성되어 있다. -![Batch Stereotypes](img/spring-batch-reference-model.png){ loading=lazy } +![Batch Stereotypes](./img/spring-batch-reference-model.png){ loading=lazy } ^[출처: The Domain Language of Batch](https://docs.spring.io/spring-batch/reference/domain.html)^ ## 2. Spring Batch 주요 도메인 @@ -36,7 +36,7 @@ Spring Batch는 아래 구조로 구성되어 있다. - Step 정의 및 순서 - 작업을 다시 시작할 수 있는지 여부 -![Job Hierarchy With Steps](img/spring-batch-jobHeirarchyWithSteps.png){ loading=lazy } +![Job Hierarchy With Steps](./img/spring-batch-jobHeirarchyWithSteps.png){ loading=lazy } ^[출처: The Domain Language of Batch](https://docs.spring.io/spring-batch/reference/domain.html#step)^ #### 2-1-1. JobInstance @@ -69,7 +69,7 @@ Step은 배치 작업의 독립적이고 순차적인 단계를 캡슐화한 도 입력 자원의 설정 및 실질적인 배치 작업 로직에 대한 모든 정보를 갖고 있는 도메인으로, Step의 동작 구조는 아래와 같다. -![Chunk-oriented Processing](img/spring-batch-chunk-oriented-processing-with-item-processor.png){ loading=lazy } +![Chunk-oriented Processing](./img/spring-batch-chunk-oriented-processing-with-item-processor.png){ loading=lazy } ^[출처: Chunk-oriented Processing](https://docs.spring.io/spring-batch/reference/step/chunk-oriented-processing.html)^ #### 2-2-1. StepExecution diff --git a/docs/blog/posts/2024-01-29-python_getter_setter.md b/docs/blog/posts/2024-01-29-python_getter_setter.md index e13200fa..e7c25f0a 100644 --- a/docs/blog/posts/2024-01-29-python_getter_setter.md +++ b/docs/blog/posts/2024-01-29-python_getter_setter.md @@ -55,7 +55,7 @@ mc = MyClass() mc.a = 1 ``` -아래와 같이 [name mangling](2024-01-28-access_modifier.md/#python의-접근제한자)을 통해 private화 된 요소를 호출할 수 있다. +아래와 같이 [name mangling](./2024-01-28-access_modifier.md/#python의-접근제한자)을 통해 private화 된 요소를 호출할 수 있다. ```python print(f"{mc.a=}") diff --git a/docs/blog/posts/2024-02-18-css_specificity.md b/docs/blog/posts/2024-02-18-css_specificity.md index 58513833..d67fddfa 100644 --- a/docs/blog/posts/2024-02-18-css_specificity.md +++ b/docs/blog/posts/2024-02-18-css_specificity.md @@ -44,7 +44,7 @@ CSS 적용 우선순위는 MDN Web Docs의 [Specificity](https://developer.mozil ``` 1. Classes, pseudo-classes, attribute selectors - - 클래스, [가상 클래스](2024-02-11-css_selector.md/#가상-클래스-선택자), 속성 선택자로 지정한 경우 + - 클래스, [가상 클래스](./2024-02-11-css_selector.md/#가상-클래스-선택자), 속성 선택자로 지정한 경우 ```css .intro { @@ -53,7 +53,7 @@ CSS 적용 우선순위는 MDN Web Docs의 [Specificity](https://developer.mozil ``` 1. Elements and pseudo-elements - - 태그, [가상 태그](2024-02-11-css_selector.md/#가상-태그-선택자)로 지정한 경우 + - 태그, [가상 태그](./2024-02-11-css_selector.md/#가상-태그-선택자)로 지정한 경우 ```css p { diff --git a/docs/blog/posts/2024-03-18-python_cmd_interface.md b/docs/blog/posts/2024-03-18-python_cmd_interface.md index 98c9a8fe..9279f258 100644 --- a/docs/blog/posts/2024-03-18-python_cmd_interface.md +++ b/docs/blog/posts/2024-03-18-python_cmd_interface.md @@ -19,7 +19,7 @@ Python을 실행할 때, command line 입력을 통해 추가적인 옵션을 ## 최적화 실행 -프로그램의 품질 향상을 위해 `assert` 구문과 [Docstring](2022-01-07-python_function.md/#documentation-strings)을 사용하는데, 해당 코드도 결국 메모리와 CPU 성능을 소모하게 된다. +프로그램의 품질 향상을 위해 `assert` 구문과 [Docstring](./2022-01-07-python_function.md/#documentation-strings)을 사용하는데, 해당 코드도 결국 메모리와 CPU 성능을 소모하게 된다. 아래 옵션을 통해 프로그램 실행 시에 해당 구문을 삭제하고 실행하도록 할 수 있다. @@ -98,7 +98,7 @@ options: ## 모듈 Docstring 출력 -[함수나 클래스의 Docstring](2022-01-07-python_function.md/#documentation-strings)은 해당 객체의 `__doc__`을 호출하면 된다. +[함수나 클래스의 Docstring](./2022-01-07-python_function.md/#documentation-strings)은 해당 객체의 `__doc__`을 호출하면 된다. 모듈의 Docstring을 출력하고 싶다면 아래와 같이 [pydoc](https://docs.python.org/3/library/pydoc.html)을 사용하면 된다. diff --git a/docs/blog/posts/2024-04-04-git_rollback.md b/docs/blog/posts/2024-04-04-git_rollback.md index 4361ce56..c1ebd640 100644 --- a/docs/blog/posts/2024-04-04-git_rollback.md +++ b/docs/blog/posts/2024-04-04-git_rollback.md @@ -21,7 +21,7 @@ Git을 사용해서 과거 코드 이력으로 되돌리는 방법 ## 💡switch -[`switch`](2022-11-08-git_handling_branch.md/#switch) 명령어는 원래 특정 브랜치로 HEAD를 옮기기 위한 명령어인데, HEAD를 옮길 수 있다는 점 때문인지 과거 커밋으로 HEAD를 옮기는 용도로도 사용 가능하다. +[`switch`](./2022-11-08-git_handling_branch.md/#switch) 명령어는 원래 특정 브랜치로 HEAD를 옮기기 위한 명령어인데, HEAD를 옮길 수 있다는 점 때문인지 과거 커밋으로 HEAD를 옮기는 용도로도 사용 가능하다. 아래와 같이 `--detach` 옵션을 사용하면 **과거 특정 커밋 상태인 코드를 보기 위한 이동 개념**으로 detached HEAD 상태를 만들어 저장 상태를 변경하지 않고 코드를 일시적으로 되돌릴 수 있다. @@ -37,7 +37,7 @@ git switch --detach ## restore -[`restore`](2022-01-17-git_tips.md/#restore) 명령어는 삭제한 파일을 되살리는 명령어인데, 아래와 같이 `-s`, `--sorce` 옵션과 함께 사용하면 특정 커밋에서 해당 파일의 내용을 되살릴 수 있다. +[`restore`](./2022-01-17-git_tips.md/#restore) 명령어는 삭제한 파일을 되살리는 명령어인데, 아래와 같이 `-s`, `--sorce` 옵션과 함께 사용하면 특정 커밋에서 해당 파일의 내용을 되살릴 수 있다. ```bash git restore --s @@ -52,7 +52,7 @@ git restore --source= ## reset -[`reset`](2022-01-17-git_tips.md/#reset) 명령어는 현재의 HEAD를 특정 상태로 되돌리는 명령어인데, 아래와 같이 특정 커밋의 특정 파일에 대해서도 지정할 수 있다. +[`reset`](./2022-01-17-git_tips.md/#reset) 명령어는 현재의 HEAD를 특정 상태로 되돌리는 명령어인데, 아래와 같이 특정 커밋의 특정 파일에 대해서도 지정할 수 있다. ```bash git reset diff --git a/docs/blog/posts/2024-04-15-git_unstage.md b/docs/blog/posts/2024-04-15-git_unstage.md index caa1a1fc..22c8fe5a 100644 --- a/docs/blog/posts/2024-04-15-git_unstage.md +++ b/docs/blog/posts/2024-04-15-git_unstage.md @@ -21,7 +21,7 @@ Git staging area의 add 된 파일 취소하는 방법 ## restore -[`restore`](2022-01-17-git_tips.md/#restore) 명령어로 add 취소하는 방법 +[`restore`](./2022-01-17-git_tips.md/#restore) 명령어로 add 취소하는 방법 ```bash git restore --staged @@ -29,7 +29,7 @@ git restore --staged ## reset -[`reset`](2022-01-17-git_tips.md/#reset) 명령어로 add 취소하는 방법 +[`reset`](./2022-01-17-git_tips.md/#reset) 명령어로 add 취소하는 방법 ```bash git reset diff --git a/docs/blog/posts/2024-07-16-computational_complexity.md b/docs/blog/posts/2024-07-16-computational_complexity.md index 8d5e1a0a..f9d97c4f 100644 --- a/docs/blog/posts/2024-07-16-computational_complexity.md +++ b/docs/blog/posts/2024-07-16-computational_complexity.md @@ -11,7 +11,7 @@ tags: - complexity --- -알고리즘 복잡도 정리 +알고리즘 복잡도 정리 @@ -21,13 +21,13 @@ tags: 알고리즘의 실행 속도를 말하며 **반복문**에 큰 영향을 받는다. 주요 표기법은 아래와 같다. -- Big O 표기법(**Big O notation**): $O(N)$, 알고리즘 최악의 실행 시간을 표기. **가장 일반적** +- Big O 표기법(Big O notation): $O(N)$, 알고리즘 최악의 실행 시간을 표기. **가장 일반적으로 사용** - 오메가 표기법: $\Omega(N)$, 알고리즘 최상의 실행 시간을 표기 - 세타 표기법: $\Theta(N)$, 알고리즘 평균 실행 시간을 표기 ### Big O 표기법 -아래와 같은 형태의 함수로 알고리즘 실행 시간을 표기하며 $\lim_{x \to \infty} f(x)$ 이기 때문에 의미 없는 상수 및 배수는 표기하지 않는다. +아래와 같은 형태의 함수로 알고리즘 실행 시간을 표기하며 $\lim_{x \to \infty} f(x)$ 인 것을 전제로 계산하기 때문에 의미 없는 상수 및 배수는 표기하지 않는다. $$f(x) = O(g(x))$$ diff --git a/docs/blog/posts/2024-07-25-web_client_server.md b/docs/blog/posts/2024-07-25-web_client_server.md index 5e48839e..82164515 100644 --- a/docs/blog/posts/2024-07-25-web_client_server.md +++ b/docs/blog/posts/2024-07-25-web_client_server.md @@ -106,5 +106,5 @@ sequenceDiagram ``` !!! note - 기본적으로는 웹서버가 클라이언트의 요청을 접수한 후에 복잡한 로직을 처리하기 위해 Common Gateway Interface를 통해 Java나 Python으로 개발된 프로그램을 실행하고 출력 결과를 회신하였음 - 그러나 가상 머신을 기반으로 실행되는 언어로 작성된 프로그램을 매 요청마다 새롭게 실행하는 것은 처리속도가 너무 느리기 때문에 해당 언어로 개발된 어플리케이션을 상시 실행해두는 Web Application Server, Web Server Gateway Interface 등의 방식이 개발됨 \ No newline at end of file + 과거에는 웹서버가 클라이언트의 요청을 접수한 후에 복잡한 로직을 처리하기 위해 Common Gateway Interface(CGI)를 통해 고급언어로 작성된 프로그램을 실행하고 출력 결과를 회신하였음 + 그러나 가상 머신을 기반으로 실행되는 언어로 작성된 프로그램을 매 요청마다 새롭게 실행하는 것은 처리속도가 너무 느리기 때문에 해당 언어로 개발된 어플리케이션을 상시 실행해두는 Web Application Server(WAS), Web Server Gateway Interface(WSGI) 등의 방식이 개발됨 \ No newline at end of file diff --git a/docs/blog/posts/2024-07-29-data_structure_hash_table.md b/docs/blog/posts/2024-07-29-data_structure_hash_table.md new file mode 100644 index 00000000..4549e7da --- /dev/null +++ b/docs/blog/posts/2024-07-29-data_structure_hash_table.md @@ -0,0 +1,131 @@ +--- +slug: data-structure-array +title: '[자료구조] 06. 해시 테이블' +date: + created: 2024-07-29 +description: > + Python으로 해시 테이블 구현하기 +categories: + - Computer Science +tags: + - data structure +--- + +해시 테이블(Hash Table)의 개념과 Python으로 구현하기 + + + +--- + +## 해시 테이블의 개념 + +**해시 테이블(hash table)**은 데이터를 Key - Value 쌍으로 묶어 저장하며 Key를 통해서 데이터에 접근하는 형태의 자료구조를 말한다. 이 때 Key는 중복될 수 없기 때문에, Key로 지정된 값을 hash를 통해 변환하기 때문에 해시 테이블이라고 불린다. + +- 장점 + - Key를 통해 데이터에 접근하기 때문에 데이터 접근 속도가 매우 빠르다 + - 특정 키에 대한 데이터가 존재하는지 확인이 쉽다 +- 단점 + - 일반적으로 저장공간이 많이 필요하다 + - Key를 hashing하는 해시 함수에서 동일한 주소(hash address)가 반환될 경우(다른 Key 값인데 동일한 주소가 도출될 경우)에 발생하는 해시 충돌(hash collision)을 방지하기 위한 대처가 필요하다 +- 시간복잡도 + - 해시 충돌이 없는 경우 $O(1)$ + - 해시 충돌이 모두 발생할 경우 $O(n)$ +- 주요 용도 + - 검색이 많이 필요한 경우 + - 저장, 삭제, 읽기가 빈번한 경우 + - 캐쉬 구현 + +!!! note "Key 해시 충돌 해결 방법" + 1. 좋은 해시 함수 사용 + 1. Chaining 기법 사용 + - 해시 테이블 외의 공간 활용 + - 연결 리스트를 활용해 충돌 발생 시 데이터를 다음 노드에 저장 + 1. Linear Probing 기법 사용 + - 충돌 발생 시 해당 hash address의 다음 address 부터 맨 처음 나오는 빈공간에 저장 + - 저장공간 활용도가 높음 + +!!! note + Python의 경우 `dictionary`라는 해시 테이블 자료구조를 기본적으로 제공하는데, 해싱 함수를 통해 도출되는 Key값의 정합성을 유지하기 위해 Key 값에는 immutable 데이터만 사용 가능하다. + +## 해시 테이블의 구현 + +Python으로 해시 테이블을 구현하면 아래와 같다. + +```python +class Slot: + def __init__(self, key, value) -> None: + self.key = key + self.value = value + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(key={self.key}, value={self.value})" + + +class ChainingHashTable: + def __init__(self, *, size: int) -> None: + self.table: list[list[Slot]] = [None for _ in range(size)] + self.size = size + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(size={self.size}, table={self.table})" + + def hash_key(self, data): + return data % self.size + + def save_data(self, data, value): + index_key = hash(data) + hash_addr = self.hash_key(data=index_key) + if not self.table[hash_addr]: + self.table[hash_addr] = [Slot(key=index_key, value=value)] + else: + for i in range(len(self.table[hash_addr])): + if self.table[hash_addr][i].key == index_key: + self.table[hash_addr][i].value = value + self.table[hash_addr].extend([Slot(key=index_key, value=value)]) + + def read_data(self, data): + index_key = hash(data) + hash_addr = self.hash_key(data=index_key) + if self.table[hash_addr]: + for i in range(len(self.table[hash_addr])): + if self.table[hash_addr][i].key == index_key: + return self.table[hash_addr][i].value + return None + else: + return None + + +class LinearProbingHashTable: + def __init__(self, *, size: int) -> None: + self.table: list[Slot] = [None for _ in range(size)] + self.size = size + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(size={self.size}, table={self.table})" + + def hash_key(self, data): + return data % self.size + + def save_data(self, data, value): + index_key = hash(data) + hash_addr = self.hash_key(data=index_key) + if self.table[hash_addr]: + for i in range(hash_addr, len(self.table)): + if not self.table[i]: + self.table[i] = Slot(key=index_key, value=value) + elif self.table[i].key == index_key: + self.table[i].value = value + return + self.table[hash_addr] = Slot(key=index_key, value=value) + + def read_data(self, data): + index_key = hash(data) + hash_addr = self.hash_key(data=index_key) + if self.table[hash_addr]: + for i in range(hash_addr, len(self.table)): + if not self.table[i]: + return None + elif self.table[i].key == index_key: + return self.table[i].value + return None +``` \ No newline at end of file diff --git a/docs/blog/posts/2024-07-31-python_repr.md b/docs/blog/posts/2024-07-31-python_repr.md new file mode 100644 index 00000000..3ddce261 --- /dev/null +++ b/docs/blog/posts/2024-07-31-python_repr.md @@ -0,0 +1,64 @@ +--- +slug: class-representation +title: Python repr 활용법 +date: + created: 2024-07-31 +description: > + class의 representation을 쉽게 만드는 방법 +categories: + - Python +tags: + - python +--- + +class의 representation을 쉽게 만드는 방법 + + + +--- + +## str, repr 함수의 차이 + +두 함수 모두 객체를 `str` 형태로 변환하여 반환한다는 점은 동일하지만, 세부적인 부분에서 차이가 있다. + +`str` 함수는 프로그램 사용자를 위한 문자열을 반환하기 때문에 일반 사용자가 보기 쉬운 형식으로 반환하지만, `repr` 함수는 개발자를 위한 문자열을 반환하기 때문에 `eval` 함수에 넣어졌을 때 동일한 객체를 생성할 수 있는 문자열을 반환한다. + +이 차이는 `datetime` 객체를 `str` 함수와 `repr` 함수에 넣어보면 확실하게 확인할 수 있다. + +```python +from datetime import datetime + +now = datetime.now().replace(microsecond=0) + +print(now) +print(repr(now)) +``` +``` +2024-07-31 00:06:59 +datetime.datetime(2024, 7, 31, 0, 6, 59) +``` + +## repr 메서드 쉽게 만들기 + +개발을 하다보면 class 직접 만들 일이 종종 있는데, 아래와 같이 `ReprMixin` class를 만들고 상속을 통해 사용하면 쉽게 repr 메서드를 만들 수 있다. + +```python +class ReprMixin: + def __repr__(self) -> str: + attrs = ", ".join(f"{k}={v!r}" for k, v in vars(self).items()) + return f"{self.__class__.__name__}({attrs})" +``` + +```python +class Test(ReprMixin): + def __init__(self, a) -> None: + self.a = a + + +t = Test(3) + +print(t) +``` +``` +Test(a=3) +``` \ No newline at end of file diff --git a/docs/blog/posts/2024-08-02-tomcat_troubleshooting.md b/docs/blog/posts/2024-08-02-tomcat_troubleshooting.md new file mode 100644 index 00000000..77ae4470 --- /dev/null +++ b/docs/blog/posts/2024-08-02-tomcat_troubleshooting.md @@ -0,0 +1,34 @@ +--- +slug: tomcat-troubleshooting +title: 톰캣 트러블 슈팅 모음 +date: + created: 2024-08-02 +description: > + 톰캣 트러블 슈팅 모음 +categories: + - Server Engineering +tags: + - tomcat + - troubleshooting +--- + +톰캣 트러블 슈팅 모음 + + + +--- + +## ERR_CONNECTION_RESET + +- 현상: Tomcat 매니저를 통해 배포 중 `ERR_CONNECTION_RESET` 오류 발생 +- 원인: Tomcat 매니저를 통해 배포할 수 있는 WAR, JAR 파일의 용량을 초과할 경우 주로 발생 +- 해결: `\webapps\manager\WEB-INF\web.xml` 파일에서 아래 설정값 수정 + +```xml title="web.xml" + + + {YOUR_OWN_SIZE} + {YOUR_OWN_SIZE} + 0 + +``` \ No newline at end of file diff --git a/docs/blog/posts/2024-08-04-sqlalchemy_relations.md b/docs/blog/posts/2024-08-04-sqlalchemy_relations.md new file mode 100644 index 00000000..c274023c --- /dev/null +++ b/docs/blog/posts/2024-08-04-sqlalchemy_relations.md @@ -0,0 +1,168 @@ +--- +slug: sqlalchemy-relations +title: SQLAlchemy의 relations +date: + created: 2024-08-04 +description: > + SQLAlchemy로 테이블의 관계를 사용하는 방법 +categories: + - Python +tags: + - python + - ORM + - sqlalchemy +--- + +SQLAlchemy로 테이블의 관계를 사용하는 방법 + + + +--- + +## 1:N 관계 + +기본적인 1:N 관계는 아래와 같이 설정한다. + +```python +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship +from sqlalchemy.schema import ForeignKey +from sqlalchemy.types import BigInteger, String + + +class BaseEntity(DeclarativeBase): ... + + +class RoleEntity(BaseEntity): + __tablename__ = "role" + + id: Mapped[int] = mapped_column(BigInteger, primary_key=True) + name: Mapped[str] = mapped_column(String(length=30), unique=True) + + user = relationship(argument="UserEntity", back_populates="role") + + +class UserEntity(BaseEntity): + __tablename__ = "user" + + id: Mapped[int] = mapped_column(BigInteger, primary_key=True) + name: Mapped[str] = mapped_column(String(length=30), unique=True) + role_id: Mapped[int] = mapped_column(BigInteger, ForeignKey(column=RoleEntity.id)) + + role = relationship(argument="RoleEntity", back_populates="user") +``` + +??? note "type hint를 사용해서 더 간결하고 직관적으로 작성하는 방법" + 아래와 같이 코드를 작성하면 더 간결하고 직관적으로 작성할 수 있으며, IDE와 사용자에게 연관관계에 대한 정보를 더 쉽게 줄 수 있는 장점이 있지만, + 엔티티 관리 모듈이 길어져 모듈을 분리할 때 **순환 참조 오류가 발생**한다는 문제점이 있다. + + ```python + from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship + from sqlalchemy.schema import ForeignKey + from sqlalchemy.types import BigInteger, String + + + class BaseEntity(DeclarativeBase): ... + + + class RoleEntity(BaseEntity): + __tablename__ = "role" + + id: Mapped[int] = mapped_column(BigInteger, primary_key=True) + name: Mapped[str] = mapped_column(String(length=30), unique=True) + + user: Mapped[list["UserEntity"]] = relationship(back_populates="role") + + + class UserEntity(BaseEntity): + __tablename__ = "user" + + id: Mapped[int] = mapped_column(BigInteger, primary_key=True) + name: Mapped[str] = mapped_column(String(length=30), unique=True) + role_id: Mapped[int] = mapped_column(BigInteger, ForeignKey(column=RoleEntity.id)) + + role: Mapped["RoleEntity"] = relationship(back_populates="user") + ``` + +## N:M 관계 + +N:M 관계는 아래와 같이 중계(junction) 테이블을 이용해서 설정할 수 있다. + +```python +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship +from sqlalchemy.schema import ForeignKey +from sqlalchemy.types import BigInteger, String + + +class BaseEntity(DeclarativeBase): ... + + +class UserEntity(BaseEntity): + __tablename__ = "user" + + id: Mapped[int] = mapped_column(BigInteger, primary_key=True) + name: Mapped[str] = mapped_column(String(length=30), unique=True) + + post = relationship( + argument="PostEntity", + secondary="PostVoteEntity", + back_populates="user", + ) + + +class PostEntity(BaseEntity): + __tablename__ = "post" + + id: Mapped[int] = mapped_column(BigInteger, primary_key=True) + name: Mapped[str] = mapped_column(String(length=30), unique=True) + user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey(column=UserEntity.id)) + + user = relationship( + argument="UserEntity", + secondary="PostVoteEntity", + back_populates="post", + ) + + +class PostVoteEntity(BaseEntity): + __tablename__ = "post_vote" + + user_id: Mapped[int] = mapped_column( + BigInteger, + ForeignKey(UserEntity.id), + primary_key=True, + ) + post_id: Mapped[int] = mapped_column( + BigInteger, + ForeignKey(PostEntity.id), + primary_key=True, + ) +``` + +## 자기참조 관계 + +계층형 테이블의 자기참조 관계는 아래와 같이 설정할 수 있다. + +```python +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship +from sqlalchemy.schema import ForeignKey +from sqlalchemy.types import BigInteger, Integer, String + + +class BaseEntity(DeclarativeBase): ... + + +class PostCategoryEntity(BaseEntity): + __tablename__ = "category" + + id: Mapped[int] = mapped_column( + type_=BigInteger, + primary_key=True, + autoincrement=True, + sort_order=-1, + ) # need to override for self relations + tier: Mapped[int] = mapped_column(Integer) + name: Mapped[str] = mapped_column(String(length=30)) + parent_id: Mapped[int | None] = mapped_column(BigInteger, ForeignKey("category.id")) + + parent = relationship(argument="PostCategoryEntity", remote_side=[id]) +``` \ No newline at end of file diff --git a/docs/blog/posts/2024-08-05-db_data_troubleshooting.md b/docs/blog/posts/2024-08-05-db_data_troubleshooting.md new file mode 100644 index 00000000..ac788d03 --- /dev/null +++ b/docs/blog/posts/2024-08-05-db_data_troubleshooting.md @@ -0,0 +1,39 @@ +--- +slug: db-data-troubleshooting +title: DB 데이터 트러블 슈팅 모음 +date: + created: 2024-08-05 +description: > + 데이터베이스 데이터 관련 트러블 슈팅 모음 +categories: + - Data Engineering +tags: + - database + - troubleshooting +--- + +데이터베이스 데이터 관련 트러블 슈팅 모음 + + + +--- + +## DB 한글 입력 깨짐 현상 + +DB의 COLLATE가 유니코드를 지원하지 않을 때 테이블에 한글 값 `INSERT`시 `??`로 입력된다. 이 경우 아래와 같이 N을 붙여서 입력하면 정상 작동한다. + +```sql +UPDATE tb_name +SET + col_name_1 = N'value_1', + col_name_2 = N'value_2' +WHERE + ... +; +``` + +```sql +INSERT INTO tb_name (col_name_1, col_name_2, col_name_3) +values (N'value_1', N'value_2', N'value_3') +; +``` \ No newline at end of file diff --git a/docs/blog/posts/2024-08-07-tesseract_101.md b/docs/blog/posts/2024-08-07-tesseract_101.md new file mode 100644 index 00000000..063e39db --- /dev/null +++ b/docs/blog/posts/2024-08-07-tesseract_101.md @@ -0,0 +1,165 @@ +--- +slug: tesseract-101 +title: 테서렉트 사용 방법 +date: + created: 2024-08-07 +description: > + Google Tesseract 사용 방법 정리 +categories: + - Vision +tags: + - ocr + - tesseract +--- + +Google Tesseract 사용 방법 정리 + + + +--- + +## 설치 방법 + +- Windows: [Tesseract at UB Mannheim](https://github.com/UB-Mannheim/tesseract/wiki)에서 설치파일 다운로드 가능 +- Linux: 아래 명령어들로 다운로드 및 설치 가능 + +```bash +sudo apt install tesseract-ocr +sudo apt install libtesseract-dev +``` +```bash +apt install -y tesseract-ocr +``` + +## 사용 방법 + +!!! note "주요 언어별 tesseract 사용 보조 패키지" + - Python: [pytesseract](https://pypi.org/project/pytesseract/) + +CLI에서 Tesseract 설치 위치에 접근하여 `tesseract.exe` 파일을 실행하면 아래와 같이 기초 사용법을 확인할 수 있음 + +```bat +tesseract.exe +``` +``` +Usage: + tesseract.exe --help | --help-extra | --version + tesseract.exe --list-langs + tesseract.exe imagename outputbase [options...] [configfile...] + +OCR options: + -l LANG[+LANG] Specify language(s) used for OCR. +NOTE: These options must occur before any configfile. + +Single options: + --help Show this help message. + --help-extra Show extra help for advanced users. + --version Show version information. + --list-langs List available languages for tesseract engine. +``` + +??? note "전체 명령어 확인 방법" + + ```bat + tesseract.exe --help-extra + ``` + ``` + Usage: + tesseract.exe --help | --help-extra | --help-psm | --help-oem | --version + tesseract.exe --list-langs [--tessdata-dir PATH] + tesseract.exe --print-fonts-table [options...] [configfile...] + tesseract.exe --print-parameters [options...] [configfile...] + tesseract.exe imagename|imagelist|stdin outputbase|stdout [options...] [configfile...] + + OCR options: + --tessdata-dir PATH Specify the location of tessdata path. + --user-words PATH Specify the location of user words file. + --user-patterns PATH Specify the location of user patterns file. + --dpi VALUE Specify DPI for input image. + --loglevel LEVEL Specify logging level. LEVEL can be + ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL or OFF. + -l LANG[+LANG] Specify language(s) used for OCR. + -c VAR=VALUE Set value for config variables. + Multiple -c arguments are allowed. + --psm NUM Specify page segmentation mode. + --oem NUM Specify OCR Engine mode. + NOTE: These options must occur before any configfile. + + Page segmentation modes: + 0 Orientation and script detection (OSD) only. + 1 Automatic page segmentation with OSD. + 2 Automatic page segmentation, but no OSD, or OCR. (not implemented) + 3 Fully automatic page segmentation, but no OSD. (Default) + 4 Assume a single column of text of variable sizes. + 5 Assume a single uniform block of vertically aligned text. + 6 Assume a single uniform block of text. + 7 Treat the image as a single text line. + 8 Treat the image as a single word. + 9 Treat the image as a single word in a circle. + 10 Treat the image as a single character. + 11 Sparse text. Find as much text as possible in no particular order. + 12 Sparse text with OSD. + 13 Raw line. Treat the image as a single text line, + bypassing hacks that are Tesseract-specific. + + OCR Engine modes: + 0 Legacy engine only. + 1 Neural nets LSTM engine only. + 2 Legacy + LSTM engines. + 3 Default, based on what is available. + + Single options: + -h, --help Show minimal help message. + --help-extra Show extra help for advanced users. + --help-psm Show page segmentation modes. + --help-oem Show OCR Engine modes. + -v, --version Show version information. + --list-langs List available languages for tesseract engine. + --print-fonts-table Print tesseract fonts table. + --print-parameters Print tesseract parameters. + ``` + +현재 환경에 설치 된 인식 언어 확인 명령어 + +```bat +tesseract.exe --list-langs +``` +``` +List of available languages in "C:\programming\Tesseract-OCR/tessdata/" (3): +eng +kor +osd +``` + +### 실행 옵션 + +- PSM + +``` +Page segmentation modes: + 0 Orientation and script detection (OSD) only. + 1 Automatic page segmentation with OSD. + 2 Automatic page segmentation, but no OSD, or OCR. (not implemented) + 3 Fully automatic page segmentation, but no OSD. (Default) + 4 Assume a single column of text of variable sizes. + 5 Assume a single uniform block of vertically aligned text. + 6 Assume a single uniform block of text. + 7 Treat the image as a single text line. + 8 Treat the image as a single word. + 9 Treat the image as a single word in a circle. + 10 Treat the image as a single character. + 11 Sparse text. Find as much text as possible in no particular order. + 12 Sparse text with OSD. + 13 Raw line. Treat the image as a single text line, + bypassing hacks that are Tesseract-specific. +``` + +- OEM + +``` +OCR Engine modes: + 0 Legacy engine only. + 1 Neural nets LSTM engine only. + 2 Legacy + LSTM engines. + 3 Default, based on what is available. +``` \ No newline at end of file diff --git a/docs/blog/posts/9999-12-31-format_post.md b/docs/blog/posts/9999-12-31-format_post.md index 864f73fe..bdec44c1 100644 --- a/docs/blog/posts/9999-12-31-format_post.md +++ b/docs/blog/posts/9999-12-31-format_post.md @@ -7,7 +7,7 @@ date: description: > description categories: - - \`Draft + - _Draft tags: - tag --- diff --git a/docs/index.md b/docs/index.md index 69a7460d..dea73a9b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,8 +6,8 @@ hide: # Note of Jay.D -![standing_on_the_shoulders_of_giants](assets/img/standing_on_the_shoulders_of_giants_b.png#only-light) -![standing_on_the_shoulders_of_giants](assets/img/standing_on_the_shoulders_of_giants_w.png#only-dark) +![standing_on_the_shoulders_of_giants](./assets/img/standing_on_the_shoulders_of_giants_b.png#only-light) +![standing_on_the_shoulders_of_giants](./assets/img/standing_on_the_shoulders_of_giants_w.png#only-dark) MLOps, 데이터 엔지니어링, 데이터 사이언티스트, 백엔드 엔지니어링 업무를 수행하고 있습니다. diff --git a/docs/pages/about/career.md b/docs/pages/about/career.md index d61272cb..2b566c85 100644 --- a/docs/pages/about/career.md +++ b/docs/pages/about/career.md @@ -20,7 +20,7 @@ search: - 전력 차단기 제품 조립공정 비전검사 시스템 고도와 및 안정화 프로젝트 - 비전검사 SW 아키텍처 개선안 설계 - 공통 프로세스를 추상화한 추상 클래스 설계 및 상속을 통한 공통 프로세스 관리 - - 비즈니스 프로세스 분석 기반 절차적 프로그래밍 적용 및 유지보수 용이성 제고 + - 비즈니스 프로세스 분석 기반 템플릿 메소드 패턴 적용 - 공통 기능을 일반화한 객체지향 프로그래밍 적용을 통한 개발 생산성 제고 - 코딩 컨벤션 관리 및 코드 리팩토링 - 전기차 충전소 전력 수요량 예측 및 고지서 관리 시스템 구축 @@ -32,7 +32,7 @@ search: - FastAPI 기반 백엔드 설계 및 개발 - 프레임워크 설정 및 SW 아키텍처 설계 - 백엔드 API 및 데이터 암호화 모듈 개발 - - [Tesseract](https://tesseract-ocr.github.io/) 연동 기반 OCR 기능 개발 + - [Tesseract](https://tesseract-ocr.github.io/) 탑재 OCR 기능 개발 - 비동기 처리 기반 공공데이터 포털 API 연동 - SQLAlchemy 기반 테이블 개발 및 관리, ORM 쿼리 개발 - AI 모델 개발 관리 @@ -47,7 +47,7 @@ search: ### 2021년 -- 철강 코일 제품 생산 공정 센서 데이터 분석 기반 양불 예측 모델 PoC 및 시스템 구축 +- 의료용 파스 제품 생산 공정 제조 데이터 분석 기반 양불 예측 모델 PoC 및 시스템 구축 - 데이터 기초 분석 및 EDA - AI 모델 개발 - 한국도로공사 - 스마트 안전 통합 관제 시스템([스마트건설](http://smartconstruction.kr/)) 연구 개발 diff --git a/docs/portfolio/board.md b/docs/portfolio/board.md index 0582be45..24ed2d48 100644 --- a/docs/portfolio/board.md +++ b/docs/portfolio/board.md @@ -178,7 +178,7 @@ erDiagram string name UK } - ROLE |o..o{ USER : role + ROLE |o..o{ USER : "" USER { bigint id PK string name UK "null" @@ -188,8 +188,8 @@ erDiagram bigint role_id FK "null" } - STATE ||..o{ USER_STATE : state - USER ||..o{ USER_STATE : state + STATE ||..o{ USER_STATE : "" + USER ||..o{ USER_STATE : "" USER_STATE { bigint user_id PK, FK bigint state_id PK, FK @@ -197,7 +197,7 @@ erDiagram datetime created_datetime } - USER ||..o{ LOGGED_IN : history + USER ||..o{ LOGGED_IN : create LOGGED_IN { bigint id PK bigint user_id FK @@ -212,8 +212,8 @@ erDiagram bigint parent_id FK "null" } - USER ||..o{ POST : author - CATEGORY ||..o{ POST : post-category + USER ||..o{ POST : create + CATEGORY ||..o{ POST : categorize POST { bigint id PK bigint user_id FK @@ -239,7 +239,7 @@ erDiagram bigint post_id PK, FK } - USER ||..o{ COMMENT : author + USER ||..o{ COMMENT : creates COMMENT { bigint id PK bigint user_id FK @@ -268,7 +268,7 @@ erDiagram - 데이터의 생성 및 관리 단위에 따라 테이블 분리 및 정규화 - 게시글과 댓글의 이력 관리를 위한 테이블 분리 - N + 1 문제 방지를 위해 연관 관계(relationship mapping) 사용 지양 -- 복잡한 연관 관계의 테이블에서 빠른 데이터 추출을 위해 한방 쿼리 사용 +- 복잡한 연관 관계의 테이블에서 정확한 데이터 추출을 위해 한방 쿼리 사용 ??? note "게시글 리스트 추출 Query" @@ -342,16 +342,14 @@ title: Cache Aside Pattern - Read Sequence --- sequenceDiagram Client ->> FastAPI: API request + activate FastAPI alt if cached data FastAPI -->> Cache Server: check data - activate FastAPI Cache Server --) FastAPI: response data - deactivate FastAPI else if not cached data FastAPI -->> Database: query - activate FastAPI Database --) FastAPI: result - deactivate FastAPI end FastAPI --) Client: response + deactivate FastAPI ``` \ No newline at end of file diff --git a/docs/portfolio/vision.md b/docs/portfolio/vision.md index 2fb1d9e9..8b64a9d1 100644 --- a/docs/portfolio/vision.md +++ b/docs/portfolio/vision.md @@ -41,7 +41,7 @@ tags: - 커넥션 풀(connection pool) 기반의 ORM 사용 - SQL injection 방지 - 데이터베이스 부하 방지 -- 이미지 Blob 데이터베이스 및 인식 결과 문서 저장을 위한 No-SQL DB 활용 +- 이미지 BLOB 데이터베이스 및 인식 결과 문서 저장을 위한 No-SQL DB 활용 - 테서렉트 프로세스 관리를 위해 싱글턴 패턴 활용 ??? note "테서렉트 프로세스 관리 class" @@ -97,7 +97,7 @@ erDiagram string name UK } - ROLE |o..o{ USER : role + ROLE |o..o{ USER : "" USER { bigint id PK string name UK "null" @@ -107,8 +107,8 @@ erDiagram bigint role_id FK "null" } - STATE ||..o{ USER_STATE : state - USER ||..o{ USER_STATE : state + STATE ||..o{ USER_STATE : "" + USER ||..o{ USER_STATE : "" USER_STATE { bigint user_id PK, FK bigint state_id PK, FK @@ -116,14 +116,14 @@ erDiagram datetime created_datetime } - USER ||..o{ LOGGED_IN : history + USER ||..o{ LOGGED_IN : creates LOGGED_IN { bigint id PK bigint user_id FK datetime created_datetime } - USER ||..O{ IMAGE : owner + USER ||..o{ IMAGE : owns IMAGE { bigint id PK string name @@ -134,24 +134,27 @@ erDiagram bigint user_id FK } - USER ||..O{ OCR : creator - IMAGE ||..o{ OCR : image + USER ||..o{ OCR : creates + IMAGE ||..o{ OCR : meta-data OCR { bigint id PK int version "default=1" datetime created_datetime bigint image_id FK bigint user_id FK - string content_id + string content_id "ocr result id at MongoDB" } + + OCR ||..|| BLOB : meta-data + IMAGE ||..|| BLOB : meta-data ``` - 데이터의 생성 및 관리 단위에 따라 테이블 분리 및 정규화 - N + 1 문제 방지를 위해 연관 관계(relationship mapping) 사용 지양 -- IMAGE 엔티티의 `image_id`, `thumbnail_id` 칼럼은 Blob 데이터베이스에 저장된 이미지 데이터의 식별자 +- IMAGE 엔티티의 `image_id`, `thumbnail_id` 칼럼은 BLOB 데이터베이스에 저장된 이미지 데이터의 식별자 - OCR 엔티티의 `content_id` 칼럼은 배열로 도출되는 인식 결과를 문서 형태로 저장한 NO-SQL DB에서의 식별자 -## 주요 비즈니스 프로세스 및 SW 설계 +## 주요 비즈니스 프로세스 및 설계 ### 이미지 OCR 서비스 @@ -161,14 +164,14 @@ title: Image Upload Process --- sequenceDiagram Client ->> FastAPI: API request - FastAPI -->> Blob Database: upload thumbnail activate FastAPI - Blob Database --) FastAPI: thumbnail id - FastAPI -->> Blob Database: upload image - Blob Database --) FastAPI: image id + FastAPI -->> BLOB Database: upload thumbnail + BLOB Database --) FastAPI: thumbnail id + FastAPI -->> BLOB Database: upload image + BLOB Database --) FastAPI: image id FastAPI -->> Database: insert image meta data - deactivate FastAPI FastAPI ->> Client: response + deactivate FastAPI ``` ```mermaid @@ -177,11 +180,11 @@ title: Document OCR Process --- sequenceDiagram Client ->> FastAPI: API request - FastAPI -->> Database: query activate FastAPI + FastAPI -->> Database: query Database --) FastAPI: image meta data - FastAPI -->> Blob Database: query - Blob Database --) FastAPI: image data + FastAPI -->> BLOB Database: query + BLOB Database --) FastAPI: image data FastAPI ->> Tesseract: ocr request Tesseract ->> FastAPI: result FastAPI --) Client: response diff --git a/mkdocs.yml b/mkdocs.yml index a2af8767..6d4c02d1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -140,6 +140,7 @@ theme: sympy: simple/sympy telegram: simple/telegram tensorflow: simple/tensorflow + tomcat: simple/apachetomcat vscode: material/microsoft-visual-studio-code extra: # generator: false # enable to remove `Made with Material for MkDocs` comment at footer @@ -226,6 +227,7 @@ extra: telegram: telegram TensorFlow: tensorflow terminal: terminal + tomcat: tomcat venv: python VS Code: vscode plugins: @@ -248,7 +250,7 @@ plugins: pagination_url_format: "page/{page}" pagination_format: "$link_first $link_previous ~2~ $link_next $link_last" categories_allowed: - - \`Draft + - _Draft - AI - C - Coding Test