<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Always awake,</title>
    <link>https://everyday-tech.tistory.com/</link>
    <description>데이터 분석가 입니다  
통계, 머신러닝, Data Science 내용을 기록하는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 29 Jun 2026 16:24:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>호재 P.B</managingEditor>
    <image>
      <title>Always awake,</title>
      <url>https://tistory1.daumcdn.net/tistory/4165762/attach/2bf8e474cbe94b83a7f747eb1da7caff</url>
      <link>https://everyday-tech.tistory.com</link>
    </image>
    <item>
      <title>Transformer 행렬 연산 #1 Encoder</title>
      <link>https://everyday-tech.tistory.com/entry/Transformer-%ED%96%89%EB%A0%AC-%EC%97%B0%EC%82%B0-1-Encoder</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;&quot;개인적으로 트랜스포머를 행렬 연산으로 이해하기 위해 작성한 포스트입니다&quot;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜스포머를 공부하다 보면 개념적으로는 이해가 되는데, 아래 내용들이 머릿 속에서 잘 그려지지 않아 이해해보려 합니다!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 흐름이 어떻게 되는지&lt;/li&gt;
&lt;li&gt;각 연산(Layer)마다 Tensor 형태가 어떻게 변하는지 (Input, Output)&lt;/li&gt;
&lt;li&gt;행렬 연산으로는 어떻게 처리되는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 글에서는 Transformer 의 구조, 개념, 각 층의 상세한 수식 및 의미는 아래 첨부한 글에 나와 있어 생략하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 연산을 통해 Tensor 의 형태가 어떻게 변해가는지 위주로 작성하였습니다!&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Transformer 구조&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YT6qX/btsMGr4f6zR/lY1ODkAkU2zyTykJ1VZqjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YT6qX/btsMGr4f6zR/lY1ODkAkU2zyTykJ1VZqjk/img.png&quot; data-alt=&quot;그림1. Transformer 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YT6qX/btsMGr4f6zR/lY1ODkAkU2zyTykJ1VZqjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYT6qX%2FbtsMGr4f6zR%2FlY1ODkAkU2zyTykJ1VZqjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;344&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1. Transformer 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;출처: &lt;a href=&quot;https://wikidocs.net/217018&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wikidocs.net/217018&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 Transformer 구조는 간단하게나마 알아야 하기에 잠깐 설명하겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transformer 는 Encoder - Decoder 구조로 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder, Decoder 에 들어가는 Input 공통적으로 1) Embedding, 2) Positional-Encoding 과정을 거칩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Encoder, Decoder 는 각각 크게 보면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder 는 1) Multi-Head Self-Attention 층, 2) Position-Wise FFNN 층 이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Decoder 는 1) Masked Multi-Head Self-Attention 층, 2) Cross Multi-Head Attention 층, 3) Position-Wise FFNN 층 이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 각 층의 출력 후에는 Add &amp;amp; Norm 층이 있는데 Residual Connection 과 Layer Normalization 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Residual Connection 은 Input 과 Output 을 더하는 연산을 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, Multi-Head Self-Attention 의 출력 후에 있는 Residual Connection 은 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ResidualConnection(x) = x + MultiHeadSelfAttention(x)$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Layer Normalization 은 Standard-Scaling 한 값과 $\gamma$, $\beta$ (학습 가능한 파라미터) 로 정의됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$LayerNormalization(x) = \gamma \ StandardScaling(x) + \beta$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;행렬 연산으로 보기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 본 글의 목적인 행렬 연산으로 위의 과정이 어떻게 처리되는지 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 그림에서 학습해야 하는 행렬(가중치) 는 점선 테두리로 표시하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 여러 파라미터가 나오는데, 각각의 의미와 그림에 사용한 값을 설명드리겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(쉽게 이해하기 위해 그림에 나오는 차원 수는 다소 작게 설정하였습니다)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.698%; height: 121px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 10.0132%; height: 19px;&quot;&gt;&lt;b&gt;Notation&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.9296%; height: 19px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.8612%; height: 19px;&quot;&gt;&lt;b&gt;그림에서 표현한 값&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 12.5415%; height: 19px;&quot;&gt;&lt;b&gt;Transfomer 기본 모델 값&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10.0132%; height: 17px;&quot;&gt;$seq\_len$&lt;/td&gt;
&lt;td style=&quot;width: 41.9296%; height: 17px;&quot;&gt;문장의 길이 (문장에서 토큰 수)&lt;/td&gt;
&lt;td style=&quot;width: 11.8612%; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 12.5415%; height: 17px;&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10.0132%; height: 17px;&quot;&gt;$d_{model}$&lt;/td&gt;
&lt;td style=&quot;width: 41.9296%; height: 17px;&quot;&gt;Multi-Head Self Attention 층에서 토큰 벡터 차원수&lt;/td&gt;
&lt;td style=&quot;width: 11.8612%; height: 17px;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;width: 12.5415%; height: 17px;&quot;&gt;512&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10.0132%; height: 17px;&quot;&gt;$n_{head}$&lt;/td&gt;
&lt;td style=&quot;width: 41.9296%; height: 17px;&quot;&gt;Multi-Head Self Attention 층에서 Head 갯수&lt;/td&gt;
&lt;td style=&quot;width: 11.8612%; height: 17px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 12.5415%; height: 17px;&quot;&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10.0132%; height: 17px;&quot;&gt;$d_v$&lt;/td&gt;
&lt;td style=&quot;width: 41.9296%; height: 17px;&quot;&gt;Multi-Head Attention 층 하나의 Head 에서 토큰 벡터 차원 수 (Value 에 해당)&lt;/td&gt;
&lt;td style=&quot;width: 11.8612%; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 12.5415%; height: 17px;&quot;&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10.0132%; height: 17px;&quot;&gt;$d_k$&lt;/td&gt;
&lt;td style=&quot;width: 41.9296%; height: 17px;&quot;&gt;Multi-Head Attention 층 하나의 Head 에서 토큰 벡터 차원 수 (Key, Query 에 해당)&lt;/td&gt;
&lt;td style=&quot;width: 11.8612%; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 12.5415%; height: 17px;&quot;&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 10.0132%; height: 17px;&quot;&gt;$d_{ff}$&lt;/td&gt;
&lt;td style=&quot;width: 41.9296%; height: 17px;&quot;&gt;FFNN 층에서 토큰을 표현하는 벡터 차원 수&lt;/td&gt;
&lt;td style=&quot;width: 11.8612%; height: 17px;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;width: 12.5415%; height: 17px;&quot;&gt;2048&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Transformer Encoder&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Encoder 부분부터 봅시다!&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Embedding &amp;amp; Positional Encoding&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k5AmY/btsMGus41XH/JR6TcaXDwaL4NbwFr0t8O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k5AmY/btsMGus41XH/JR6TcaXDwaL4NbwFr0t8O0/img.png&quot; data-alt=&quot;그림2-1. (Encoder) Embedding &amp;amp;amp; Positional Encoding&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k5AmY/btsMGus41XH/JR6TcaXDwaL4NbwFr0t8O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk5AmY%2FbtsMGus41XH%2FJR6TcaXDwaL4NbwFr0t8O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;244&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2-1. (Encoder) Embedding &amp;amp; Positional Encoding&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨간색 박스가 쳐져 있는 부분에 대한 설명입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMzxL/btsMZNmKerh/wKSUQ3m4ykh1UwSUP5rDj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMzxL/btsMZNmKerh/wKSUQ3m4ykh1UwSUP5rDj1/img.png&quot; data-alt=&quot;그림 2-2. (Encoder) Embedding &amp;amp;amp; Positional Encoding 행렬 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMzxL/btsMZNmKerh/wKSUQ3m4ykh1UwSUP5rDj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMzxL%2FbtsMZNmKerh%2FwKSUQ3m4ykh1UwSUP5rDj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1406&quot; height=&quot;526&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 2-2. (Encoder) Embedding &amp;amp; Positional Encoding 행렬 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Embedding Output: $(seq\_len, d_{model})$ 형태의 행렬입니다. 각 $seq\_len$ 개의 토큰이 $d_{model}$ 의 차원으로 표현되어 있습니다. Embedding Output 의 각 element 는 랜덤으로 초기화 되고, 학습을 진행하며 값이 변경된다고 합니다 (Learnable Parameter). 자세한 내용은 조금 더 찾아봐야겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Positional Encoding: Embedding Output $(seq\_len, d_{model})$ 에 위치 정보를 반영하기 위해 위치 정보를 담은 동일 크기의 행렬 Positional-Encoding Matrix 를 더하는 연산입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Multi-Head Self-Attention &amp;amp; Add &amp;amp; Norm&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBcES9/btsMGf3RTP9/TYdjSdmhHqeOAcHkbaimwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBcES9/btsMGf3RTP9/TYdjSdmhHqeOAcHkbaimwK/img.png&quot; data-alt=&quot;그림 3-1. (Encoder) Multi-Head Self-Attention &amp;amp;amp; Add&amp;amp;amp;Norm&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBcES9/btsMGf3RTP9/TYdjSdmhHqeOAcHkbaimwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBcES9%2FbtsMGf3RTP9%2FTYdjSdmhHqeOAcHkbaimwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;348&quot; height=&quot;230&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 3-1. (Encoder) Multi-Head Self-Attention &amp;amp; Add&amp;amp;Norm&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 핵심인 Multi-Head Self-Attention 에 대한 설명입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi-Head Self-Attention 은 Self-Attention 을 Head 갯수만큼 병렬 실행하기 때문에 Multi-Head 라는 prefix 가 붙습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Head 마다 Attention Value 를 만들고, 각 결과를 Concatenate 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Self-Attention (at 1 Head)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;1098&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl1Sbe/btsM0cNyQIT/hisKMqggfjjovEn0Y0wOU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl1Sbe/btsM0cNyQIT/hisKMqggfjjovEn0Y0wOU0/img.png&quot; data-alt=&quot;그림 3-2. (Encoder) Self-Attention at One Head 행렬 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl1Sbe/btsM0cNyQIT/hisKMqggfjjovEn0Y0wOU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl1Sbe%2FbtsM0cNyQIT%2FhisKMqggfjjovEn0Y0wOU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1562&quot; height=&quot;1098&quot; data-origin-width=&quot;1562&quot; data-origin-height=&quot;1098&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 3-2. (Encoder) Self-Attention at One Head 행렬 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선은 Head 하나에서 Self-Attention 이 어떻게 이루어지는지 살펴봅시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 Head 에서는 Embedding &amp;amp; Positional-Encoding Output $(seq\_len, d_{model})$ 으로 $Q$, $K$, $V$ 행렬을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$Q$ 와 $K$ 는 $(seq\_len, d_k)$ 형태입니다. 그래서 변환을 담당하는 $W_Q, W_K$ 의 모양은 $(d_{model}, d_k)$ 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$V$ 는 $(seq\_len, d_v)$ 형태입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;그래서 변환을 담당하는 $W_V$ 의 모양은 $(d_{model}, d_v)$ 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들어진 $Q$, $K$ 를 Scaled dot-product Attention 하여 Attention Score 를 만듭니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$(seq\_len, seq\_len)$ 형태가 나오는데, 이는 각 토큰 간의 Attention 점수를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이것을 $V$ 와 내적하면 Attention Value $(seq\_len, d_v)$가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attention Value 의 i 번째 행 벡터: Attention Score 의 i 번째 행 벡터의 각 element 와&amp;nbsp; $V$ 의 각 행 벡터와 가중합 되는 방식입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Self-Attention (at Multi-Head) 및 Add&amp;amp;Norm&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;1410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnjAXI/btsM0GnjmPi/y7yOLU3jg6tFf3hRpQTMW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnjAXI/btsM0GnjmPi/y7yOLU3jg6tFf3hRpQTMW0/img.png&quot; data-alt=&quot;그림 3-3. (Encoder) Multi-Head Attention &amp;amp;amp; Add&amp;amp;amp;Norm 행렬 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnjAXI/btsM0GnjmPi/y7yOLU3jg6tFf3hRpQTMW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnjAXI%2FbtsM0GnjmPi%2Fy7yOLU3jg6tFf3hRpQTMW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1788&quot; height=&quot;1410&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;1410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 3-3. (Encoder) Multi-Head Attention &amp;amp; Add&amp;amp;Norm 행렬 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서는 하나의 Head 에서 처리되는 Self-Attention 에 대해 설명하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 Heads 에서 각각 처리된 Attention Value $(seq\_len, d_v)$를 Concatenate 하면 Multi-Head Attention Values $(seq\_len, d_v * n_{head})$ 가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi-Head 를 사용하는 이유는 크게 두 가지입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 관점에서 Attention 을 수행하여 다양한 정보를 얻기 위함&lt;/li&gt;
&lt;li&gt;병렬 처리로 계산 속도를 향상하기 위함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Multi-Head Attention Values $(seq\_len, d_v * n_{head})$ 을 Multi-Head Attention Matrix $(seq\_len, d_{model})$ 로 변환해야 하므로 $W_0$ 의 형태는 $(d_v * n_{head}, d_{model})$ 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 그 윗쪽 층은 위에서 설명드린 Add&amp;amp;Norm (Residual Connection 과 Layer Normalization) 입니다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Residual Connection: Multi-Head Self Attention 층의 Output 인 Multi-Head Attention Matrix&amp;nbsp;과&amp;nbsp;Input 인 Embedding &amp;amp; Positional-Encoding Output 이 와 더해지는 구조입니다.&lt;/li&gt;
&lt;li&gt;Layer Normalization: 층 정규화를 거칩니다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Feed Forward Neural Network&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encoder 의 마지막 층입니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q9O5h/btsMF4Ie669/akBy03rClxadRzjffJjkKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q9O5h/btsMF4Ie669/akBy03rClxadRzjffJjkKk/img.png&quot; data-alt=&quot;그림 4-1. (Encoder) FFNN &amp;amp;amp; Add&amp;amp;amp;Norm&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q9O5h/btsMF4Ie669/akBy03rClxadRzjffJjkKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq9O5h%2FbtsMF4Ie669%2FakBy03rClxadRzjffJjkKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;363&quot; height=&quot;240&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 4-1. (Encoder) FFNN &amp;amp; Add&amp;amp;Norm&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;1438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Psx2N/btsM1fCM0ad/FPbRsqOYDBAaaY2fCUBOsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Psx2N/btsM1fCM0ad/FPbRsqOYDBAaaY2fCUBOsK/img.png&quot; data-alt=&quot;그림 4-2. (Encoder) FFNN &amp;amp;amp; Add&amp;amp;amp;Norm 행렬 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Psx2N/btsM1fCM0ad/FPbRsqOYDBAaaY2fCUBOsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPsx2N%2FbtsM1fCM0ad%2FFPbRsqOYDBAaaY2fCUBOsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1892&quot; height=&quot;1438&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;1438&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 4-2. (Encoder) FFNN &amp;amp; Add&amp;amp;Norm 행렬 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Feed Forward Neural Network 층입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Multi-Head Self-Attention w/ Add&amp;amp;Norm $(seq\_len, d_{model})$ 을 $F_1 (seq\_len, d_{ff})$ 으로 변환하기 위해 $W_1 (d_{model}, d_{ff})$ 행렬이 사용됩니다. 그리고 $b_1 (seq\_len, d_ff)$은 bias 를 위한 행렬입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 ReLU 함수를 거치고 (Max(0, ...) 부분) 다시 $F_3 (seq\_len, d_{model})$ 형태로 변환하기 위해 $W_2 (d_{ff}, d_{model})$ 와 $b_1 (seq\_len, d_{model})$ 행렬이 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 위에서 설명드린 Add&amp;amp;Norm 층을 거치게 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;References&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://wikidocs.net/217018&quot;&gt;https://wikidocs.net/217018&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;마치며&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Transformer Encoder 에서 행렬 연산을 그림으로 이해해보았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;글이 길어져 Decoder 는 다음 편에서 이야기 하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 부분이나 부족한 부분은 편하게 말씀해주시면 감사하겠습니다!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot;&gt;▼&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>머신러닝</category>
      <category>Encoder</category>
      <category>matrix calculation</category>
      <category>transformer</category>
      <category>인코더</category>
      <category>트랜스포머</category>
      <category>행렬연산</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/59</guid>
      <comments>https://everyday-tech.tistory.com/entry/Transformer-%ED%96%89%EB%A0%AC-%EC%97%B0%EC%82%B0-1-Encoder#entry59comment</comments>
      <pubDate>Tue, 11 Mar 2025 01:51:42 +0900</pubDate>
    </item>
    <item>
      <title>수치 미분을 해보자</title>
      <link>https://everyday-tech.tistory.com/entry/%EC%88%98%EC%B9%98-%EB%AF%B8%EB%B6%84%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;본 포스팅은 수치 미분에 대해 공부하고 코드를 구현하며 나름대로 정리한 글입니다.&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;수치 미분(Numerical Difference) 란 미분의 근사치를 구하는 방법입니다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;미분 정의&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 $f(x)$ 에 대한 $x$ 의 미분값은 특정 값에서의 순간 변화량(기울기) 로 표현됩니다. 함수 $f(x)$ 수식을 알고 있는 경우 미분 함수 $f'(x)$ 의 수식을 구할 수 있으니 미분 값을 구할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ f'(x)&amp;nbsp;=&amp;nbsp;lim_{\epsilon&amp;nbsp;\rightarrow&amp;nbsp;0}\frac{f(x+\frac{\epsilon}{2})&amp;nbsp;-&amp;nbsp;f(x-\frac{\epsilon}{2})}{\epsilon}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 함수가 있으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f(x) = x^3 + x^2 + 1$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차 미분 함수는 아래와 같이 전개할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{align*}&lt;br /&gt;f'(x) &amp;amp; = \frac{df(x)}{dx} &lt;br /&gt;\\ &lt;br /&gt;&amp;amp;= lim_{\epsilon \rightarrow 0}\frac{f(x + \frac{\epsilon}{2}) - f(x - \frac{\epsilon}{2})}{\epsilon} &lt;br /&gt;\\&lt;br /&gt;&amp;amp; = lim_{\epsilon \rightarrow 0}\frac{[x^3 + 3x^2\frac{\epsilon}{2} + 3x(\frac{\epsilon}{2})^2 + (\frac{\epsilon}{2})^3 +&amp;nbsp;&amp;nbsp;x^2 + \epsilon x + (\frac{\epsilon}{2})^2 + 1] - [x^3 - 3x^2\frac{\epsilon}{2} + 3x(\frac{\epsilon}{2})^2 - (\frac{\epsilon}{2})^3 + x^2 - \epsilon x + (\frac{\epsilon}{2})^2 + 1]}{\epsilon} &lt;br /&gt;\\&lt;br /&gt;&amp;amp; = lim_{\epsilon \rightarrow 0} \frac{3x^2\epsilon&amp;nbsp;+&amp;nbsp;\frac{\epsilon^3}{4}&amp;nbsp;+&amp;nbsp;2\epsilon&amp;nbsp;x}{\epsilon} &lt;br /&gt;\\ &lt;br /&gt;&amp;amp; = lim_{\epsilon \rightarrow 0}{3x^2 + \frac{\epsilon^2}{4} + 2 x} &lt;br /&gt;\\ &lt;br /&gt;&amp;amp; = 3x^2 + 2 x&lt;br /&gt;\end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;수치 미분이란?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 컴퓨터로 이를 계산할 때는 미분 함수의 꼴을 알 수가 없기 때문에 미분 함수를 구하는 방식을 묘사하여 근사치를 구합니다. 여기서 묘사한다는 뜻은 $x$ 의 매우 작은 변화 $\epsilon$ (예를 들어 1e-05) 에 대한 $f(x)$ 의 변화량을 구해 미분값의 근사치를 구하는 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f'(x) = lim_{\epsilon \rightarrow 0}\frac{f(x + \frac{\epsilon}{2}) - f(x - \frac{\epsilon}{2})}{\epsilon} \approx \frac{f(x + \frac{\epsilon}{2}) - f(x - \frac{\epsilon}{2})}{\epsilon}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;코드로 확인하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시를 코드로 확인해봅니다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;함수 정의&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 함수 $f(x)$ 와 1차, 2차 미분 함수($f'(x), f''(x)$) 를 정의해줍니다&lt;/p&gt;
&lt;pre id=&quot;code_1695476902440&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def f(x: float):
    return x**3 + x**2 + 1

def f_derivative1(x: float):  # f 1차 미분
    &quot;&quot;&quot;First Order Derivative of Function `f`&quot;&quot;&quot;
    return 3*(x**2) + 2*x

def f_derivative2(x: float):  # f 2차 미분
    &quot;&quot;&quot;Second Order Derivative of Function `f`&quot;&quot;&quot;
    return 6*x + 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 개형은 아래와 같습니다&lt;/p&gt;
&lt;pre id=&quot;code_1695476955360&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x = np.linspace(-100, 100, num=1000)

f_x = f(x=x)
f_drv1_x = f_derivative1(x=x)
f_drv2_x = f_derivative2(x=x)
f_drv3_x = f_derivative3(x=x)

plt.plot(x, f_x,
        color=&quot;black&quot;, linewidth=4)
plt.xlabel(&quot;x&quot;)
plt.ylabel(&quot;y&quot;)
plt.title(&quot;y=f(x)&quot;)
plt.grid()
plt.show()

plt.plot(x, f_drv1_x,
        color=&quot;black&quot;, linewidth=4)
plt.xlabel(&quot;x&quot;)
plt.ylabel(&quot;y&quot;)
plt.title(&quot;y=f'(x)&quot;)
plt.grid()
plt.show()

plt.plot(x, f_drv2_x,
        color=&quot;black&quot;, linewidth=4)
plt.xlabel(&quot;x&quot;)
plt.ylabel(&quot;y&quot;)
plt.title(&quot;y=f''(x)&quot;)
plt.grid()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crR3cG/btsvnd87w38/tK83Cb4vFuID9DRE0nb0M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crR3cG/btsvnd87w38/tK83Cb4vFuID9DRE0nb0M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crR3cG/btsvnd87w38/tK83Cb4vFuID9DRE0nb0M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrR3cG%2Fbtsvnd87w38%2FtK83Cb4vFuID9DRE0nb0M0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;220&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tgrXp/btsvkQGPrG8/CrGnoXnVkJWLmolDd2WjBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tgrXp/btsvkQGPrG8/CrGnoXnVkJWLmolDd2WjBK/img.png&quot; data-alt=&quot;1차 미분 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tgrXp/btsvkQGPrG8/CrGnoXnVkJWLmolDd2WjBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtgrXp%2FbtsvkQGPrG8%2FCrGnoXnVkJWLmolDd2WjBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;228&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1차 미분 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PGIj0/btsvl6WKjys/i0o0BNtvk1YCOjUFYcVBCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PGIj0/btsvl6WKjys/i0o0BNtvk1YCOjUFYcVBCk/img.png&quot; data-alt=&quot;2차 미분 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PGIj0/btsvl6WKjys/i0o0BNtvk1YCOjUFYcVBCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPGIj0%2Fbtsvl6WKjys%2Fi0o0BNtvk1YCOjUFYcVBCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;241&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2차 미분 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;수치 미분(1차 미분)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 수치 미분을 활용하여 근사치를 구하고 위의 1차 미분 함수와 값이 일치하는지 확인해봅니다&lt;/p&gt;
&lt;pre id=&quot;code_1695477197216&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def dydx(x: float, func: callable, eps: float = 1e-05):
    &quot;&quot;&quot;Numerical First Order Deravative of function argument `func`&quot;&quot;&quot;
    x_b = x - eps/2
    x_a = x + eps/2
    
    return (func(x_a) - func(x_b)) / eps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검정색은 위에서 정의한 1차 미분 함수 개형이고, 빨간색은 1차 수치 미분 함수 개형입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘이 개형이 일치하는 것을 알 수 있습니다&lt;/p&gt;
&lt;pre id=&quot;code_1695477245897&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dydx1_x = dydx(x=x, func=f)

plt.plot(x, f_drv1_x, 
         label=&quot;actual derivative value&quot;, linestyle=&quot;solid&quot;, color=&quot;black&quot;, linewidth=4)
plt.plot(x, dydx_x, 
         label=&quot;numerical derivative value&quot;, linestyle=&quot;dotted&quot;, color=&quot;red&quot;, linewidth=3)
plt.xlabel(&quot;x&quot;)
plt.ylabel(&quot;y&quot;)
plt.grid()
plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EfVeM/btsvl8Ac7nW/NJMzuqEY12WbCZxipxk3EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EfVeM/btsvl8Ac7nW/NJMzuqEY12WbCZxipxk3EK/img.png&quot; data-alt=&quot;1차 미분 함수 값 vs. 1차 수치 미분 함수 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EfVeM/btsvl8Ac7nW/NJMzuqEY12WbCZxipxk3EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEfVeM%2Fbtsvl8Ac7nW%2FNJMzuqEY12WbCZxipxk3EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;371&quot; height=&quot;239&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1차 미분 함수 값 vs. 1차 수치 미분 함수 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 여기서 주의해야 할 것은 두 값이 완전히 일치하지 않는다는 것입니다. 말 그대로 근사치 이므로 아래와 같이 오차가 발생합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1695477416777&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;np.abs(f_drv1_x - dydx_x).max()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcNSUq/btsvb5FcNbm/lNiReabueW5U2odcQA7JXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcNSUq/btsvb5FcNbm/lNiReabueW5U2odcQA7JXk/img.png&quot; data-alt=&quot;오차가 발생합니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcNSUq/btsvb5FcNbm/lNiReabueW5U2odcQA7JXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcNSUq%2Fbtsvb5FcNbm%2FlNiReabueW5U2odcQA7JXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;218&quot; height=&quot;32&quot; data-origin-width=&quot;259&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오차가 발생합니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;수치 미분(n차 미분)&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 만든 수치 미분 함수는 1차 미분 근사치만 계산할 수 있습니다. 그렇다면 2차 이상의 수치 미분은 어떻게 할까요?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 만들기 전에 먼저 2차 미분에 대한 수식을 살펴봅시다. 2차 미분 함수 $f''(x)$는 1차 미분 함수 $f'(x)$를 한번 더 미분한 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{align*}&lt;br /&gt;f''(x) &amp;amp;= \frac{df'(x)}{dx}&lt;br /&gt;\\&lt;br /&gt;&amp;amp;= lim_{\epsilon \rightarrow 0}\frac{f'(x + \frac{\epsilon}{2}) - f'(x - \frac{\epsilon}{2})}{\epsilon}&lt;br /&gt;\end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 위와 같이 수치 미분을 이용하여 매우 작은 $\epsilon$ 을 이용하면 근사치를 구할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{align*}&lt;br /&gt;f''(x) &amp;amp;= \frac{df'(x)}{dx}&lt;br /&gt;\\&lt;br /&gt;&amp;amp; = lim_{\epsilon \rightarrow 0}\frac{f'(x + \frac{\epsilon}{2}) - f'(x - \frac{\epsilon}{2})}{\epsilon} &lt;br /&gt;\\&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;amp; \approx \frac{f'(x + \frac{\epsilon}{2}) - f'(x - \frac{\epsilon}{2})}{\epsilon} &lt;br /&gt;\\ &lt;br /&gt;&amp;amp; \approx \frac{\frac{f(x + \frac{\epsilon}{2}) - f(x - \frac{\epsilon}{2})}{\epsilon} - \frac{f(x + \frac{\epsilon}{2}) - f(x - \frac{\epsilon}{2})}{\epsilon}}{\epsilon}&lt;br /&gt;\end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근사치 수식 (수치 미분) 꼴을 보면 뭔가 &lt;b&gt;반복되는 느낌&lt;/b&gt;이 듭니다. &lt;b&gt;n차 수치 미분 시에는 n-1 차 수치 미분 함수에 대해 수치 미분을 하는 것이지요. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 성질을 이용하면 2차 수치 미분 뿐만 아니라 3차 이상의 수치 미분을 할 수 있습니다.&lt;b&gt;&amp;nbsp;일반화된 n차 수치 미분 함수를 만들 수 있는 것이지요&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 아래와 같이 &lt;b&gt;재귀 함수&lt;/b&gt;를 이용하여 구현할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;order 가 주어지면(n차 미분에서 값 n) order-1 수치 미분 함수에 대해 수치 미분을 하는 꼴입니다. 이는 order 1이 될 때까지 수행되고 order 가 1일 때는 1차 수치 미분 값을 반환합니다&lt;/p&gt;
&lt;pre id=&quot;code_1695477906778&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def dydx_order(x: float, func: callable, eps: float = 1e-05, order: int = 1):
    &quot;&quot;&quot;Numerical `order` Deravative of function argument `func`&quot;&quot;&quot;
    x_b = x - eps/2
    x_a = x + eps/2
    
    if order == 1:
        return (func(x_a) - func(x_b)) / eps
    else:
        return (dydx_order(x_a, func=func, order=order-1) - dydx_order(x_b, func=func, order=order-1)) / eps&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 보면 위에서 정의한 미분 함수 값과 같은 개형을 띄는 것을 알 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검정색은 미분 함수의 개형이고, 빨간색은 수치 미분 함수 개형입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(단 위에서 언급한 것과 같이 오차가 발생함은 기억해야 합니다)&lt;/p&gt;
&lt;pre id=&quot;code_1695478203947&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dydx1_x = dydx_order(x=x, func=f, order=1)
dydx2_x = dydx_order(x=x, func=f, order=2)

plt.plot(x, f_drv1_x, 
         label=&quot;actual derivative value&quot;, linestyle=&quot;solid&quot;, color=&quot;black&quot;, linewidth=4)
plt.plot(x, dydx1_x, 
         label=&quot;numerical derivative value&quot;, linestyle=&quot;dotted&quot;, color=&quot;red&quot;, linewidth=3)
plt.xlabel(&quot;x&quot;)
plt.ylabel(&quot;y&quot;)
plt.grid()
plt.legend()
plt.show()


plt.plot(x, f_drv2_x, 
         label=&quot;actual derivative value&quot;, linestyle=&quot;solid&quot;, color=&quot;black&quot;, linewidth=4)
plt.plot(x, dydx2_x, 
         label=&quot;numerical derivative value&quot;, linestyle=&quot;dotted&quot;, color=&quot;red&quot;, linewidth=3)
plt.xlabel(&quot;x&quot;)
plt.ylabel(&quot;y&quot;)
plt.grid()
plt.legend()
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1bVu/btsvvCggdD4/k6KjqZuzjydFwXnZtxOaGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1bVu/btsvvCggdD4/k6KjqZuzjydFwXnZtxOaGK/img.png&quot; data-alt=&quot;1차 미분 함수 값 vs. 1차 수치 미분 함수 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1bVu/btsvvCggdD4/k6KjqZuzjydFwXnZtxOaGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1bVu%2FbtsvvCggdD4%2Fk6KjqZuzjydFwXnZtxOaGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;233&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1차 미분 함수 값 vs. 1차 수치 미분 함수 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0v82H/btsvlzx5kan/rkXDbdicN6cZnkUWHz68FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0v82H/btsvlzx5kan/rkXDbdicN6cZnkUWHz68FK/img.png&quot; data-alt=&quot;2차 미분 값 vs. 2차 수치 미분 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0v82H/btsvlzx5kan/rkXDbdicN6cZnkUWHz68FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0v82H%2Fbtsvlzx5kan%2FrkXDbdicN6cZnkUWHz68FK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;366&quot; height=&quot;239&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2차 미분 값 vs. 2차 수치 미분 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;수치 미분 함수 및 구현에 대해 알아보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;수식을 바탕으로 반복되는 꼴에 대해 탐색하고 이를 재귀함수로 구현해보는 좋은 경험이었습니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;포스트를 작성하다보니 수치 미분을 하면 오차가 발생할 수 밖에 없는데 이를 줄일 수 있는 방법은 어떤 것이 있는지 궁금해집니다. 이 부분도 시간이 나면 공부해봐야겠습니다  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;긴 글 읽어주셔서 감사합니다. 피드백은 언제나 환영합니다!&lt;/p&gt;</description>
      <category>코딩</category>
      <category>approximation</category>
      <category>Numerical Derivative</category>
      <category>recursive function</category>
      <category>근사치</category>
      <category>수치미분</category>
      <category>수치해석</category>
      <category>재귀함수</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/57</guid>
      <comments>https://everyday-tech.tistory.com/entry/%EC%88%98%EC%B9%98-%EB%AF%B8%EB%B6%84%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90#entry57comment</comments>
      <pubDate>Sat, 23 Sep 2023 21:50:34 +0900</pubDate>
    </item>
    <item>
      <title>잔차의 성질 #기하편 (단순 선형 회귀)</title>
      <link>https://everyday-tech.tistory.com/entry/%EC%9E%94%EC%B0%A8%EC%9D%98-%EC%84%B1%EC%A7%88-%EA%B8%B0%ED%95%98%ED%8E%B8-%EB%8B%A8%EC%88%9C-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅에서는 이전 포스팅(&lt;a href=&quot;https://everyday-tech.tistory.com/entry/%EC%9E%94%EC%B0%A8%EC%9D%98-%EC%84%B1%EC%A7%88-%EB%8B%A8%EC%88%9C-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;잔차의 성질 (단순 선형 회귀)&lt;/a&gt;) 에서 다룬 잔차의 4가지 성질을 기하학적으로 이해해보는 내용을 작성하겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 포스팅과 마찬가지로 단순 선형 회귀에서 &lt;b&gt;최소제곱법으로 계수를 추정하였을 때&lt;/b&gt;의 잔차의 성질에 대해 기술합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단순 선형 회귀의 기하학적 이해&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 단순 선형 회귀는 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ Y_i = \beta_0 + \beta_1 x_i + \epsilon_i&amp;nbsp; \ \ \ for \ i=1,2, ... , n$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ Y_1 = \beta_0 + \beta_1 x_1 + \epsilon_1 \\ Y_2 = \beta_0 + \beta_1 x_2 + \epsilon_2 \\ ... \\ Y_n = \beta_0 + \beta_1 x_n + \epsilon_n$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 Y벡터 $\vec{Y} = (Y_1, Y_2, ..., Y_n)$ 을 만들기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1벡터 $\vec{1} = (1, 1, ..., 1)$ 와 x벡터 $\vec{x} = (x_1, x_2, ..., x_n)$ 에 각각 $\beta_0, \beta_1$ 을 곱하여 선형 결합한 것으로 생각할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20230529_175740521.jpg&quot; data-origin-width=&quot;1441&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyy9wl/btshAZdhaCB/3VxDbrzrElhbTz4lhusXUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyy9wl/btshAZdhaCB/3VxDbrzrElhbTz4lhusXUk/img.jpg&quot; data-alt=&quot;일반적으로 Y 벡터는 1벡터와 x벡터의 sub-space 에 포함되지 않습니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyy9wl/btshAZdhaCB/3VxDbrzrElhbTz4lhusXUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyy9wl%2FbtshAZdhaCB%2F3VxDbrzrElhbTz4lhusXUk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;292&quot; data-filename=&quot;KakaoTalk_20230529_175740521.jpg&quot; data-origin-width=&quot;1441&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반적으로 Y 벡터는 1벡터와 x벡터의 sub-space 에 포함되지 않습니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 n 차원 공간에서 두 벡터 $\vec{1}, \vec{x}$를 선형 결합하여 벡터 $\vec{Y}$ 를 정확히 만드는 것은 어렵습니다. 왜냐하면 그림에서 보이는 2차원 sub-space (평면) 이 두 벡터 $\vec{1}, \vec{x}$ 를 선형 결합하여 만들 수 있는 벡터들의 집합공간이고, n 차원 공간에 존재하는 $\vec{Y}$ 가 해당 평면에 쏙 들어가 있는 경우는 드물 것이기 때문이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 해당 평면에 속한 벡터 중 $\vec{Y}$와 가장 유사한 벡터를 구하는 것을 목표로 삼아야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20230529_175740521_01.jpg&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;915&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Y38S/btshBl8p9as/jzAbqk8LM1sQgKKqHDcYAk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Y38S/btshBl8p9as/jzAbqk8LM1sQgKKqHDcYAk/img.jpg&quot; data-alt=&quot;최소제곱법을 이용하였을 때 벡터들의 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Y38S/btshBl8p9as/jzAbqk8LM1sQgKKqHDcYAk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Y38S%2FbtshBl8p9as%2FjzAbqk8LM1sQgKKqHDcYAk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;505&quot; height=&quot;313&quot; data-filename=&quot;KakaoTalk_20230529_175740521_01.jpg&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;915&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최소제곱법을 이용하였을 때 벡터들의 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, &lt;b&gt;&quot;유사하다&quot;&lt;/b&gt; 를 여러 형태로 정의할 수 있을텐데, &lt;b&gt;최소제곱법에서는 $\vec{Y}$와 $\vec{\hat{Y}}$ 의 거리 $|\vec{Y} - \vec{\hat{Y}}|$ 가 최소가 되는 $\vec{\hat{Y}}$ 를 구합니다.&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 위의 그림처럼 $\vec{Y}$ 에서 sub-space 로&lt;b&gt; 수선의 발을 내렸을 때의 벡터&lt;/b&gt;가 최소제곱법에서 추정한 $\vec{\hat{Y}}$ 가 되는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 $\vec{Y}$ 에서 $\vec{\hat{Y}}$ 를 뺀 벡터가 잔차 벡터 $\vec{\hat{\epsilon}}$가 되는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 단순 선형 회귀에서 최소제곱법으로 계수를 추정하였을 때 기하학적으로 어떻게 표현되는지 알아보았으니, 이를 이용하여 잔차의 성질에 대해 증명해보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잔차의 성질&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 선형 회귀에서 위와 같이 최소제곱법으로 계수를 추정하였을 때, 잔차는 아래의 네 가지 성질을 갖습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$$\sum_i^n{\hat{\epsilon_i}} = 0 \tag{1}$$&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$$\sum_i^n{\hat{\epsilon_i}x_i} = 0 \tag{2} $$&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$$\sum_i^n{\hat{\epsilon_i}\hat{Y_i}} = 0 \tag{3} $$&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$$\sum_i^n{\hat{\epsilon_i}Y_i} = \sum_i^n{{\hat{\epsilon_i}}^2} \tag{4}$$&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1번 증명&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1번의 경우 좌항을 보면 잔차 벡터 $\vec{\hat{\epsilon}}$ 와 1 벡터 $\vec{1}$ 의 내적임을 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;최소제곱법을 이용하여 계수를 추정하면 잔차 벡터 $\vec{\hat{\epsilon}}$ 는 1벡터 $\vec{1}$ 와 x벡터 $\vec{x}$ 가 형성하는 sub-space 에 수직(orthogonal) 하므로 1 벡터 $\vec{1}$ 와도 수직입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 내적 값은 0이 되어 1번 증명이 완료됩니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2번 증명&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2번의 경우 좌항을 보면 잔차 벡터 $\vec{\hat{\epsilon}}$ 과 x 벡터 $\vec{x}$ 의 내적임을 알 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;최소제곱법을 이용하여 계수를 추정하면 잔차 벡터 $\vec{\hat{\epsilon}}$ 는 1벡터 $\vec{1}$ 와 x벡터 $\vec{x}$ 가 형성하는 sub-space 에 수직(orthogonal) 하므로 x 벡터 $\vec{x}$ 와도 수직입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 내적 값은 0이 되어 2번 증명이 완료됩니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3번 증명&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3번의 경우 좌항을 보면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;잔차 벡터 $\vec{\hat{\epsilon}}$ 과 Y 추정 벡터 $\vec{\hat{Y}}$ 의 내적임을 알 수 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Y 추정 벡터 잔차 벡터 $\vec{\hat{\epsilon}}$ 과 수직(orthogonal) 이므로 내적 값은 0 입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 3번 증명이 완료됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4번 증명&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4번의 경우 좌항을 보면 잔차 벡터 $\vec{\hat{\epsilon}}$ 와 Y 벡터 $\vec{Y}$ 의 내적임을 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;내적 정리에 의해 아래와 같이 도출되므로 4번 증명이 완료됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20230529_175740521_02.jpg&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;1181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX1hfb/btshWtDqvwR/ukrJGbOQLi6uW4DKnI08gK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX1hfb/btshWtDqvwR/ukrJGbOQLi6uW4DKnI08gK/img.jpg&quot; data-alt=&quot;4번 증명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX1hfb/btshWtDqvwR/ukrJGbOQLi6uW4DKnI08gK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX1hfb%2FbtshWtDqvwR%2FukrJGbOQLi6uW4DKnI08gK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;447&quot; data-filename=&quot;KakaoTalk_20230529_175740521_02.jpg&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;1181&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4번 증명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최소제곱법으로 단순 선형 회귀 계수를 추정하였을 때, 잔차의 성질에 대해 기하학적으로 알아보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기하학적으로 생각하니 이해가 더 쉬운 것 같습니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;읽어주셔서 감사합니다  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot;&gt;▼&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>통계</category>
      <category>least square estimation</category>
      <category>residuals</category>
      <category>simple linear regression</category>
      <category>기하학적 의미</category>
      <category>단순선형회귀</category>
      <category>잔차의 성질</category>
      <category>최소제곱법</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/55</guid>
      <comments>https://everyday-tech.tistory.com/entry/%EC%9E%94%EC%B0%A8%EC%9D%98-%EC%84%B1%EC%A7%88-%EA%B8%B0%ED%95%98%ED%8E%B8-%EB%8B%A8%EC%88%9C-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80#entry55comment</comments>
      <pubDate>Mon, 29 May 2023 16:48:12 +0900</pubDate>
    </item>
    <item>
      <title>잔차의 성질 (단순 선형 회귀)</title>
      <link>https://everyday-tech.tistory.com/entry/%EC%9E%94%EC%B0%A8%EC%9D%98-%EC%84%B1%EC%A7%88-%EB%8B%A8%EC%88%9C-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅에서는 단순 선형 회귀의 잔차(오차의 추정량) 의 네 가지 성질에 대해 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 계수 추정 방식이 최소제곱법(Least Sqaure Estimation) 인 경우 잔차는 아래의 성질을 갖습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;단순 선형 회귀 계수 추정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 단순 선형 회귀 식이 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Y_i = \beta_0 + \beta_1 x_i + \epsilon_i$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최소제곱법을 이용하여&lt;/b&gt; 추정한 $\hat{\beta_0}$ 와 $\hat{\beta_1}$ 은 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \hat{\beta_1} = \frac{S_{xY}}{S_{xx}} = \frac{\sum_i^n{(x_i - \bar{x})(Y_i - \bar{Y})}}{\sum_i^n{(x_i - \bar{x})^2}} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \hat{\beta_0} = \bar{Y} - \hat{\beta_1} \bar{x} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추정 값은 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{align*} \hat{Y_i} &amp;amp;= \hat{\beta_0} + \hat{\beta_1} x_i \\&amp;amp;= (\bar{Y} - \hat{\beta_1} \bar{x}) + \hat{\beta_1} x_i \\&amp;amp;= \bar{Y} + \hat{\beta_1} (x_i - \bar{x}) \end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 추정값을 보면 추정한 회귀 선의 중요한 성질을 알 수 있습니다. 위의 식에서 $x_i = \bar{x}$ 인 경우 $\hat{Y_i} = \bar{Y}$ 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;추정한 회귀선은 $x_i$의 평균($\bar{x}$) 과 $Y_i$ 의 평균($\bar{Y})$ 를 지납니다&lt;/b&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잔차는 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{align*} \hat{\epsilon_i} &amp;amp;= Y_i - \hat{Y_i} \\&amp;amp;= Y_i - [\bar{Y} + \hat{\beta_1} (x_i - \bar{x})&amp;nbsp;]&amp;nbsp;\\&amp;amp;= (Y_i - \bar{Y}) - \hat{\beta_1} (x_i - \bar{x}) \end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;잔차의 성질&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 선형 회귀에서 위와 같이 최소제곱법으로 계수를 추정하였을 때, 잔차는 아래의 네 가지 성질을 갖습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\sum_i^n{\hat{\epsilon_i}} = 0 \tag{1}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\sum_i^n{\hat{\epsilon_i}x_i} = 0 \tag{2} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\sum_i^n{\hat{\epsilon_i}\hat{Y_i}} = 0 \tag{3} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\sum_i^n{\hat{\epsilon_i}Y_i} = \sum_i^n{{\hat{\epsilon_i}}^2} \tag{4}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1번 증명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{align*} \sum_i^n{\hat{\epsilon_i}} &amp;amp;= \sum_i^n{[(Y_i - \bar{Y}) - \hat{\beta_1} (x_i - \bar{x})]} \\&amp;amp;=&amp;nbsp; \sum_i^n{(Y_i - \bar{Y})} - \hat{\beta_1} \sum_i^n{(x_i - \bar{x})} \\&amp;amp;= 0 -\hat{\beta_1} 0 \\&amp;amp;= 0 &amp;nbsp; \end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2번 증명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{align*} \sum_i^n{\hat{\epsilon_i}x_i} &amp;amp;= \sum_i^n{[(Y_i - \bar{Y}) - \hat{\beta_1} (x_i - \bar{x})]x_i} \\&amp;amp;= \sum_i^n{(Y_i - \bar{Y})x_i} - \hat{\beta_1}\sum_i^n{(x_i - \bar{x})x_i} \\&amp;amp;= S_{xY} - \hat{\beta_1}S_{xx} \\&amp;amp;= S_{xY} - \frac{S_{xY}}{S_{xx}} S_{xx} \\&amp;amp;= 0 \end{align*}$$ &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3번 증명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{align*} \sum_i^n{\hat{\epsilon_i}\hat{Y_i}} &amp;amp;= \sum_i^n{[\hat{\epsilon_i}[\bar{Y} + \hat{\beta_1} (x_i - \bar{x})]]} \\&amp;amp;= \bar{Y}\sum_i^n{\hat{\epsilon_i}} + \beta_1 \sum_i^n{\hat{\epsilon_i} x_i} - \bar{x} \sum_i^n{\hat{\epsilon_i}} \\&amp;amp;= 0 \end{align*} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 증명에 의해 1, 3 번째 항이 0이 되고, 2번 증명에 의해 2 번째 항이 0이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4번 증명&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \sum_i^n{\hat{\epsilon_i}Y_i} &amp;amp;= \sum_i^n{\hat{\epsilon_i}(\hat{Y_i} + \hat{\epsilon_i})} \\&amp;amp;= \sum_i^n{\hat{\epsilon_i}\hat{Y_i}} + \sum_i^n{{\hat{\epsilon_i}}^2} \\&amp;amp;= \sum_i^n{{\hat{\epsilon_i}}^2} \end{align*} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 증명에 의해 1 번째 항이 0이 되므로 증명이 완료됩니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;단순 선형 회귀 모형에서 잔차항의 네 가지 성질에 대해 알아보았습니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅에서는 잔차의 4가지 성질을 기하학적으로 해석해보겠습니다&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;읽어주셔서 감사합니다  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot;&gt;▼&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>통계</category>
      <category>least square estimation</category>
      <category>residuals</category>
      <category>simple linear regression</category>
      <category>단순선형회귀</category>
      <category>잔차의 성질</category>
      <category>최소제곱법</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/54</guid>
      <comments>https://everyday-tech.tistory.com/entry/%EC%9E%94%EC%B0%A8%EC%9D%98-%EC%84%B1%EC%A7%88-%EB%8B%A8%EC%88%9C-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80#entry54comment</comments>
      <pubDate>Sun, 28 May 2023 16:55:42 +0900</pubDate>
    </item>
    <item>
      <title>MSE를 최소화 하는 추정량 (단순 선형 회귀)</title>
      <link>https://everyday-tech.tistory.com/entry/MSE%EB%A5%BC-%EC%B5%9C%EC%86%8C%ED%99%94-%ED%95%98%EB%8A%94-%EC%B6%94%EC%A0%95%EB%9F%89-%EB%8B%A8%EC%88%9C-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;i&gt;단순 선형 회귀(Simple Linear Regression) 에서 LSE 를 사용하여 추정한 추정치가 SSE 를 최소화 하는 추정치인지 증명하는 포스팅입니다 :)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 선형 회귀(Simple Linear Regression) 식이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$y_i = \beta_0 + \beta_1 x_i + \epsilon_i $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선형 회귀 모델에서 가지고 있는 데이터($x_i$, $y_i$) 를 잘 설명하기 위해 사용하는 방법 중 가장 보편적인 것이 &lt;b&gt;오차를 최소화 하는 것입니다.&lt;/b&gt; 오차의 제곱 합(SSE; Sum of Squared Error)을 최소화 하는 &lt;span style=&quot;color: #333333; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;$\beta_0$, $\beta_1$&lt;span&gt; 의 추정치($\hat{\beta_0}$, $\hat{\beta_1}$&lt;span style=&quot;color: #333333; text-align: start;&quot; data-darkreader-inline-color=&quot;&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;를 구하는 것이지요&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ SSE = \sum^n{(y_i - \hat{y_i})^2} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSE (Sum of Squared Error)를 각각 편미분하여 값이 0이 되는 지점을 추정치로 구합니다. 이렇게 구하는 방식을 LSE(Least Square Estimate) 라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(SSE 는 $\beta_0$, $\beta_1$ 의 전역에 대해 오목(Concave)&amp;nbsp; 함수 형태이어야 합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \hat{\beta_0} = \bar{y} - \hat{\beta_1} \bar{x} \\&amp;nbsp;\hat{\beta_1} = \frac{S_{xy}}{S_{xx}} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \small{S_{xx} = \sum^n{(x_i - \bar{x})^2}, S_{xy} = \sum^n{(x_i - \bar{x}) (y_i - \bar{y})}} $$&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅에서는 &lt;span style=&quot;background-color: #ffc1c8;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&lt;b&gt;LSE를 이용한 추정치가 SSE 를 최소화 하는 추정치인지&lt;/b&gt;&amp;nbsp;&lt;b&gt;증명&lt;/b&gt;&lt;/span&gt;해보는 시간을 가져보겠습니다  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;증명&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSE 가 가장 작게 만들기 위한 방법이 LSE 라는 것을 증명하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그래서 어떤 임의의 추정치 ($y_i^*$) 로 구한 SSE가 LSE 추정치($\hat{y_i}$)로 구한 SSE 보다 항상 같거나 큰지 증명하는 문제가 됩니다!&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(임의의 추정치이기 때문에 LSE 추정치도 포함되는 개념입니다)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;$$ pf) \sum^n{(y_i - y_i^*)^2} \ge \sum^n{(y_i - \hat{y_i})^2} \tag{1} $$&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\hat{y_i} = \hat{\beta_0} + \hat{\beta_1} x_i \\ y_i^* = \beta_0^* + \beta_1^* x_i$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 번 식의 좌항에 집중해봅니다. 아래와 같이 제곱항 내부에 $\hat{y_i}$ 을 더하고 빼준 후 이를 전개해줍니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \sum^n{(y_i - y_i^*)^2} &amp;amp;= \sum^n{(y_i - \hat{y_i} + \hat{y_i} - y_i^*)^2} \\ &amp;amp;= \sum^n{(y_i - \hat{y_i})^2 + \sum{(\hat{y_i} - y_i^*)}^2 + \sum^n{(y_i - \hat{y_i}) (\hat{y_i} - y_i^*)}} \tag{2} \end{align*} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 번 식에서 가운데 항인 $\sum{(\hat{y_i} - y_i^*)}^2$ 는 제곱 합이므로 항상 0보다 같거나 큽니다. 즉, (2) 번 식은 아래의 관계를 갖습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \sum^n{(y_i - \hat{y_i})^2 + \sum{(\hat{y_i} - y_i^*)}^2 + \sum^n{(y_i - \hat{y_i}) (\hat{y_i} - y_i^*)}} \\ &amp;amp;\ge \sum^n{(y_i - \hat{y_i})^2 + \sum^n{(y_i - \hat{y_i}) (\hat{y_i} - y_i^*)}} \tag{3} \end{align*} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 (2) 번, (3) 번 식을 엮으면 아래와 같이 정리할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \sum^n{(y_i - y_i^*)^2} &amp;amp;\ge \sum^n{(y_i - \hat{y_i})^2 + \sum^n{(y_i - \hat{y_i}) (\hat{y_i} - y_i^*)}} \end{align*} \tag{4} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 목표인 (1) 번 식을 증명하기 위해서 이제 위의 (4) 번 식의 우항 중 두 번째 항의 값이 0 임을 증명하면 됩니다. 이를 (5) 번 식으로 지칭하겠습니다. 마지막 관문입니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ pf) \sum^n{(y_i - \hat{y_i}) (\hat{y_i} - y_i^*)} = 0 \tag{5} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(5) 번 식을 증명하기 위해서는 LSE 로 추정된 오차항 ($\hat{e_i}$)의 성질들을 이용하여야 합니다. (6), (7)번 식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(성질에 대한 증명은 아래에 첨부해두었으니 확인하시면 됩니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\hat{e_i} = y_i - \hat{y_i}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \sum^n{\hat{e_i}} = 0 \tag{6} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \sum^n{\hat{e_i} x_i} = 0 \tag{7} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자, 다시 (5) 번 식을 증명해봅시다. 좌항을 변형해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \sum^n{(y_i - \hat{y_i}) (\hat{y_i} - y_i^*)} &amp;amp;= \sum^n{\hat{e_i} (\hat{y_i} - y_i^*)} \\ &amp;amp;= \sum^n{\hat{e_i} (\hat{y_i} - y_i^*)} \\ &amp;amp;= \sum^n{\hat{e_i} [(\hat{\beta_0} + \hat{\beta_1} x_i) - (\beta_0^* + \beta_1^* x_i)]} \\ &amp;amp;= \sum^n{\hat{e_i} [\hat{\beta_0} - \beta_0^* + (\hat{\beta_1} - \beta_1^*) x_i]} \\ &amp;amp;= \sum^n{[\hat{e_i}(\hat{\beta_0} - \beta_0^*) + (\hat{\beta_1} - \beta_1^*) \hat{e_i} x_i]} \\ &amp;amp;= (\hat{\beta_0} - \beta_0^*)\sum^n{\hat{e_i}} + (\hat{\beta_1} - \beta_1^*)\sum^n{\hat{e_i} x_i}&amp;nbsp; \end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 (6), (7) 번 식에 의해 값이 0이 됩니다. (5) 번 식 증명이 완성되었습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*}&amp;nbsp; (\hat{\beta_0} - \beta_0^*)\sum^n{\hat{e_i}} + (\hat{\beta_1} - \beta_1^*)\sum^n{\hat{e_i} x_i} &amp;amp;= (\hat{\beta_0} - \beta_0^*) 0 + (\hat{\beta_1} - \beta_1^*) 0 \\ &amp;amp;= 0 \end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 아래 식이 완성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해석하면 SSE 를 작게 만드는 추정치 중 가장 좋은 것은 LSE 를 이용하여 추정한 추정치입니다. &lt;b&gt;즉, SSE 를 최소화 하는 추정치는 LSE 를 이용하여 추정한 추정치입니다.&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \sum^n{(y_i - y_i^*)^2} \ge \sum^n{(y_i - \hat{y_i})^2} \end{align*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;참고) LSE 오차항 성질&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(6) 번 증명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ pf) \sum^n{\hat{e_i}} = 0 $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래를 이용해봅니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \hat{y_i} &amp;amp;= \hat{\beta_0} + \hat{\beta_1} x_i \\ &amp;amp;= \bar{y} - \hat{\beta_1}\bar{x} + \hat{\beta_1} x_i \\ &amp;amp;= \bar{y} + \hat{\beta_1}(x_i - \bar{x}) \end{align*} $$&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \sum^n{\hat{e_i}} &amp;amp;= \sum^n{(y_i - \hat{y_i})} \\ &amp;amp;= \sum^n{[y_i - [\bar{y} + \hat{\beta_1}(x_i - \bar{x})]]} \\ &amp;amp;= \sum^n{(y_i - \bar{y})} - \hat{\beta_1}\sum^n{(x_i - \bar{x})} = 0 - \hat{\beta_1} 0 = 0 \end{align*}$$&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(7) 번 증명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ pf) \sum^n{\hat{e_i} x_i} = 0&amp;nbsp; $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 ... 은 위의 (6) 번 식의 증명과 반복되므로 생략하기 위함입니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \begin{align*} \sum^n{\hat{e_i} x_i} = ... &amp;amp;= \sum^n{[(y_i - \bar{y}) - \hat{\beta_1}(x_i - \bar{x})]} x_i \\ &amp;amp;= \sum^n{(y_i - \bar{y}) x_i} - \hat{\beta_1} \sum^n{(x_i - \bar{x}) x_i} \\ &amp;amp;= \sum^n{(y_i - \bar{y}) x_i} + \frac{S_{xy}}{S_{xx}} \sum^n{(x_i - \bar{x}) x_i}\end{align*} $$&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ S_{xy} = \sum^n{(x_i - \bar{x}) (y_i - \bar{y})} = ... = \sum^n{(y_i - \bar{y}) x_i} \\ S_{xx} = \sum^n{(x_i - \bar{x})^2)} = ... = \sum^n{(x_i - \bar{x}) x_i} $$ 이므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \sum^n{(y_i - \bar{y}) x_i} - \frac{S_{xy}}{S_{xx}} \sum^n{(x_i - \bar{x}) x_i} = S_{xy} - \frac{S_{xy}}{S_{xx}} S_{xx} = 0 $$ 이 되어 증명이 완료됩니다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마치며&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;단순히 SSE 를 최소화 하는 방법으로 편미분을 통해 추정치를 구하는 방법만 알고 있었는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;미분을 사용하지 않고 증명하는 과정이 흥미로웠습니다. 그 과정에서 LSE 로 추정된 오차항의 성질들에 대해서도 정리할 수 있었습니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;긴 글 읽어주셔서 감사합니다~ 피드백은 언제나 환영입니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;▼&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>통계</category>
      <category>estimate</category>
      <category>least square estimation</category>
      <category>LSE</category>
      <category>Proof</category>
      <category>simple linear regression</category>
      <category>단순선형회귀</category>
      <category>증명</category>
      <category>최소제곱법</category>
      <category>추정</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/53</guid>
      <comments>https://everyday-tech.tistory.com/entry/MSE%EB%A5%BC-%EC%B5%9C%EC%86%8C%ED%99%94-%ED%95%98%EB%8A%94-%EC%B6%94%EC%A0%95%EB%9F%89-%EB%8B%A8%EC%88%9C-%EC%84%A0%ED%98%95-%ED%9A%8C%EA%B7%80#entry53comment</comments>
      <pubDate>Sat, 13 May 2023 21:50:35 +0900</pubDate>
    </item>
    <item>
      <title>행렬 곱의 여러 관점</title>
      <link>https://everyday-tech.tistory.com/entry/%ED%96%89%EB%A0%AC-%EA%B3%B1%EC%9D%98-%EC%97%AC%EB%9F%AC-%EA%B4%80%EC%A0%90</link>
      <description>&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선형대수를 공부하다보면 행렬 곱을 다양한 관점으로 해석하여 기하학적으로 이해하는 부분이 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 본 포스팅에서는 행렬 곱을 바라보는 관점을 정리하고, 어떤 경우에 해당 관점으로 보는지 정리해보았습니다 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해의 용이성을 위해 3*3 정사각행렬의 곱으로 이야기를 진행하겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ A B = C $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;notation 규칙인 다음과 같이 하겠습니다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\vec{r}$은 행 벡터를 의미하고, $\vec{c}$는 열 벡터를 의미합니다&lt;/li&gt;
&lt;li&gt;각 벡터의 아랫 첨자는 두 개의 문자의 조합이며, 첫 번째 문자는 행렬을 의미하고 두 번째 문자는 인덱스를 의미합니다&lt;/li&gt;
&lt;li&gt;$\vec{r}_{A2}$는 $A$ 행렬의 2번째 행 벡터를 의미합니다&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;1. 요소 관점 - 행 벡터와 열 벡터의 내적&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 기본적인 방법은 $A$의 행 벡터와 $B$의 열 벡터를 내적한 스칼라 값이 행렬 $C$의 요소 값이 되는 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$C$의 i행, j열의 요소 값은 $A$의 i행, $B$의 j열을 내적한 스칼라 값입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3K5HR/btrXHTXz287/kJxvK7PNL0pKQXJSpNtq90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3K5HR/btrXHTXz287/kJxvK7PNL0pKQXJSpNtq90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3K5HR/btrXHTXz287/kJxvK7PNL0pKQXJSpNtq90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3K5HR%2FbtrXHTXz287%2FkJxvK7PNL0pKQXJSpNtq90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;130&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내적의 개념을 사용하기 때문에 &lt;b&gt;$C$의 특정 행이나 열의 값이 모두 0인 영 벡터인 경우 이러한 관점으로 해석하곤 합니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$C$의 특정 열이 영 벡터인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\vec{c}_{B3}$가 $A$의 모든 행 벡터와 내적한 값이 0이므로, $B$의 3번째 열 벡터는 $A$의 모든 행 벡터와 orthogonal 합니다. 고유벡터 및 고유값의 공부할 때 Null Space에서 아래의 개념이 나옵니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbjQ3w/btrXInRpNmS/eKkwDBnCDyGF6IdkdkbGF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbjQ3w/btrXInRpNmS/eKkwDBnCDyGF6IdkdkbGF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbjQ3w/btrXInRpNmS/eKkwDBnCDyGF6IdkdkbGF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbjQ3w%2FbtrXInRpNmS%2FeKkwDBnCDyGF6IdkdkbGF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;374&quot; height=&quot;118&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$C$의 특정 행이 영 벡터인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\vec{r}_{A2}$가 $B$의 모든 열 벡터와 내적한 값이 0이므로, $A$의 두 번째 행 벡터는 $B$의 모든 열 벡터와 orthogonal 합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMOZoQ/btrXEBQWIHF/Kbi0jw2qLVr35tpzIiGIkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMOZoQ/btrXEBQWIHF/Kbi0jw2qLVr35tpzIiGIkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMOZoQ/btrXEBQWIHF/Kbi0jw2qLVr35tpzIiGIkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMOZoQ%2FbtrXEBQWIHF%2FKbi0jw2qLVr35tpzIiGIkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;374&quot; height=&quot;117&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;2. 열 관점 - 열 벡터의 선형 결합&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 관점은 $A$의 각 열 벡터를 $B$의 j번 째 열 벡터의 요소 값으로 선형 결합한 것이 $C$의 j번 째 열 벡터가 되는 것입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/phyTE/btrZJ3keq52/d9S8QnZQkKvlu8RKZQf6I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/phyTE/btrZJ3keq52/d9S8QnZQkKvlu8RKZQf6I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/phyTE/btrZJ3keq52/d9S8QnZQkKvlu8RKZQf6I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FphyTE%2FbtrZJ3keq52%2Fd9S8QnZQkKvlu8RKZQf6I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;187&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;289&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 관점은&amp;nbsp;&lt;b&gt;선형 회귀 식을 행렬 곱으로 표현할 때 많이 사용&lt;/b&gt;합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(샘플 수 * feature 수) 형태의 행렬 $A$와 각 feature에 대응하는 회귀 계수를 나타내는 열 벡터 $x$가 있고 각 샘플의 target 값을 나타내는 열 벡터 $b$가 있을 때 아래와 같이 표현할 수 있습니다. 우리가 구하고자 하는 것은 회귀 계수의 열 벡터인 $x$ 입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zI7Hy/btrXIxGh8Lm/ugLokrXSrMN7IH2mvCqOuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zI7Hy/btrXIxGh8Lm/ugLokrXSrMN7IH2mvCqOuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zI7Hy/btrXIxGh8Lm/ugLokrXSrMN7IH2mvCqOuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzI7Hy%2FbtrXIxGh8Lm%2FugLokrXSrMN7IH2mvCqOuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;351&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;3. 행 관점 - 행 벡터의 선형 결합&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째 관점은 $B$의 각 행 벡터를 $A$의 i번 째 행 벡터의 요소 값으로 선형 결합한 것이 $C$의 i번 째 행 벡터가 되는 것입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOEASC/btrXIoiwzd0/k4k7U6mC80KV9jojxU9u61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOEASC/btrXIoiwzd0/k4k7U6mC80KV9jojxU9u61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOEASC/btrXIoiwzd0/k4k7U6mC80KV9jojxU9u61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOEASC%2FbtrXIoiwzd0%2Fk4k7U6mC80KV9jojxU9u61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;673&quot; height=&quot;192&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 관점은 &lt;b&gt;가우스 소거법, LU 분해와 같이 행 간의 연산으로 행렬을 변환&lt;/b&gt;할 때 많이 사용합니다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://bskyvision.com/entry/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-%ED%96%89%EB%A0%ACA%EC%99%80-%ED%96%89%EB%A0%ACB%EC%9D%98-%EA%B3%B1%EC%9D%84-%EB%B0%94%EB%9D%BC%EB%B3%B4%EB%8A%94-%EC%84%B8-%EA%B0%80%EC%A7%80-%EA%B4%80%EC%A0%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://bskyvision.com/entry/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-%ED%96%89%EB%A0%ACA%EC%99%80-%ED%96%89%EB%A0%ACB%EC%9D%98-%EA%B3%B1%EC%9D%84-%EB%B0%94%EB%9D%BC%EB%B3%B4%EB%8A%94-%EC%84%B8-%EA%B0%80%EC%A7%80-%EA%B4%80%EC%A0%90&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://angeloyeo.github.io/2020/09/08/matrix_multiplication.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://angeloyeo.github.io/2020/09/08/matrix_multiplication.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;행렬 곱을 행과 열의 내적, 행 벡터의 선형결합, 열 벡터의 선형결합으로 보는 관점에 대해 정리해보았습니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;▼&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>선형 대수</category>
      <category>LU분해</category>
      <category>matrix multiplication</category>
      <category>가우스소거법</category>
      <category>선형 변환</category>
      <category>행렬곱</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/52</guid>
      <comments>https://everyday-tech.tistory.com/entry/%ED%96%89%EB%A0%AC-%EA%B3%B1%EC%9D%98-%EC%97%AC%EB%9F%AC-%EA%B4%80%EC%A0%90#entry52comment</comments>
      <pubDate>Wed, 1 Feb 2023 00:03:47 +0900</pubDate>
    </item>
    <item>
      <title>숄레스키 분해를 이용한 마할라노비스 거리</title>
      <link>https://everyday-tech.tistory.com/entry/%EC%88%84%EB%A0%88%EC%8A%A4%ED%82%A4-%EB%B6%84%ED%95%B4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A7%88%ED%95%A0%EB%9D%BC%EB%85%B8%EB%B9%84%EC%8A%A4-%EA%B1%B0%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;&quot;현재 인과추론 패키지 개발 업무 중 거리 기반 매칭 기능을 조사하며 얻은 지식을 정리하였습니다 :)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;마할라노비스 거리를 구하는 방법에 대해 기술합니다&quot;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;마할라노비스 거리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$n$개의 샘플이 있고, 각 샘플은 $k$차원 공간(feature의 수)의 벡터로 표현된다고 합시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 임의의 두 개의 샘플에 대한 $1 \times k$ 형태의 행 벡터가 $\vec{v} = (v_1, v_2, ..., v_{k-1}, v_k)$과 $\vec{u} = (u_1, u_2, ..., u_{k-1}, u_k)$일 때 마할라노비스 거리의 정의는 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ mahalanobis(\vec{v}, \vec{u}) = \sqrt{(\vec{v} - \vec{u}) {\sum}^{-1} (\vec{v} - \vec{u})^T} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 ${\sum}$는 $k \times k$ 형태의 feature 공분산 행렬(covariance matrix)입니다. 각 feature간 퍼짐의 정도를 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마할라노비스 거리 계산 시 중간에 공분산 행렬의 역행&lt;span style=&quot;color: #333333;&quot;&gt;렬 ${\sum}^{-1}$ 가 들어&lt;/span&gt;간 이유는 feature의 퍼짐이 클수록 거리 계산 시 down scaling하기 위해서 입니다. 샘플의 feature 간 거리가 동일하여도 넓은 값에 퍼져 있는 feature의 경우 그렇지 않은 feature보다 거리를 작게 보정해준다는 느낌으로 이해하면 좋습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅은 숄레스키 분해를 이용한 마할라노비스를 구하는 방법에 초점을 맞추어 작성하였으므로, 마할라노비스 거리에 대한 개념은 이정도로 마무리하겠습니다. 상세한 내용은 &lt;a title=&quot;해당 포스팅&quot; href=&quot;https://angeloyeo.github.io/2022/09/28/Mahalanobis_distance.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;해당 포스팅&lt;/a&gt; 에 잘 설명되어 있으니 참고하시면 좋습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;숄레스키 분해&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$k \times k$ 정사각행렬 $A$가 있을 때, 이를 하삼각행렬 $L$, 상삼각행렬 $U$로 분해하는 것을 LU 분해라고 합니다. 일반적으&lt;span style=&quot;color: #333333;&quot;&gt;로 $L \neq U^T$&amp;nbsp;입니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ A = LU $$&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 LU 분해의 특수한 형태가 숄레스키 분해입니다. 숄레스키 분해에서 $L = U^T$이고, 따라서 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ A = L L^T $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 숄레스키 분해에 대해 왜 언급하는가? 싶으실 수 있습니다. 마할라노비스 거리 계산 시 숄레스키 분해를 활용하면 계산 효율성을 높일 수 있기 때문입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;숄레스키 분해를 이용한 마할라노비스 거리 구하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;개념&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 사용한 공분산 행렬의 역행렬 ${\sum}^{-1}$ 는 $k \times k$ 형태의 정사각행렬이므로 아래와 같이 숄레스키 분해 할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ {\sum}^{-1} = L L^T $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 대입하여 $\vec{v}$와 $\vec{u}$ 간의 마할라노비스 거리를 작성하면 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ mahalanobis(\vec{v}, \vec{u}) = \sqrt{(\vec{v} - \vec{u}) {\sum}^{-1} (\vec{v} - \vec{u})^T} = \sqrt{(\vec{v} - \vec{u}) L L^T (\vec{v} - \vec{u})^T}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 $X = (\vec{v} - \vec{u}) L$ 라고 한다면 $X^T = L^T (\vec{v} - \vec{u})^T$ 가 됩니다. 즉, 아래와 같이 전개됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ mahalanobis(\vec{v}, \vec{u}) = \sqrt{(\vec{v} - \vec{u}) L L^T (\vec{v} - \vec{u})^T} = \sqrt{X X^T}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;$X$에 L2 norm을 취한 후 square root를 씌운 형태&lt;/b&gt;입니다. 이는 &lt;b&gt;유클리디안 거리를 구하는 방법입니다&lt;/b&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 원 데이터에 특정 처리를 한 후, 그 데이터를 이용하여 샘플 간 유클리디안 거리를 구하면 됩니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면, &lt;u&gt;&lt;b&gt;숄레스키 분해를 이용하여 샘플 간 마할라노비스 거리를 구하는 방법&lt;/b&gt;&lt;/u&gt;은 아래와 같습니다&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;원 데이터 ($n \times k$)의 공분산 행렬의 역행렬 ${\sum}^{-1}$ ($k \times k$)을 숄레스키 분해하여 하삼각행렬 $L$ ($k \times k$)을 구합니다&lt;/li&gt;
&lt;li&gt;원 데이터에 하삼각행렬 $L$을 행렬 곱 취하여 행렬 $X$ ($n \times k$)를 구합니다&lt;/li&gt;
&lt;li&gt;행렬 $X$의 샘플 간 유클리디안 거리를 구한 것이 원 데이터의 샘플 간 마할라노비스 거리를 구한 것과 같습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;코드를 통한 확인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iris 데이터를 이용하여 숄레스키 분해를 이용한 마할라노비스 거리에 대해 살펴보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;150개의 샘플과 4개의 feature (sepal_length, sepal_witdh, petal_length, petal_width)를 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 로딩&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676816347584&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import pandas as pd
import numpy as np
from sklearn import datasets
from sklearn.metrics import pairwise_distances

iris_dict = datasets.load_iris()
iris = pd.DataFrame(iris_dict['data'], columns=iris_dict['feature_names'])
iris['Species'] =  iris_dict['target_names'][iris_dict['target']]

feat = iris.drop('Species', axis=1)  # samples * features dataframe&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;숄레스키 분해 - 하삼각행렬 $L$ 반환&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676816432265&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cov = np.array(feat.cov())  # 공분산 행렬
cov_inv = np.linalg.inv(cov)  # 공분산 행렬의 역행렬

cov_inv_L = np.linalg.cholesky(cov_inv)  # cholesky 분해 - 하삼각행렬
print(cov_inv_L)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dps0qB/btrZQdlsuW7/edWQdjWxr61mg0MWvie0N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dps0qB/btrZQdlsuW7/edWQdjWxr61mg0MWvie0N0/img.png&quot; data-alt=&quot;공분산 행렬의 역행렬을 숄레스키 분해 - 하삼각행렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dps0qB/btrZQdlsuW7/edWQdjWxr61mg0MWvie0N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdps0qB%2FbtrZQdlsuW7%2FedWQdjWxr61mg0MWvie0N0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;83&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공분산 행렬의 역행렬을 숄레스키 분해 - 하삼각행렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고) 하삼각 행렬 곱을 통한 원본 행렬과 비교 :&amp;nbsp; ${\sum}^{-1} = L L^T$&lt;/p&gt;
&lt;pre id=&quot;code_1676816493159&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 숄레스키 분해 확인 : 공분산 행렬 역행렬 = 하삼각행렬 * 하삼각행렬^T
print(cov_inv)  # 공분산 행렬 역행렬
print(np.matmul(cov_inv_L, cov_inv_L.T)) # 하삼각 행렬 * 하삼각행렬^T&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7YK9w/btrZK0mUmi9/Ys3yKDUI6WuPNtev9nJAi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7YK9w/btrZK0mUmi9/Ys3yKDUI6WuPNtev9nJAi0/img.png&quot; data-alt=&quot;두 행렬이 같은 것을 볼 수 있습니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7YK9w/btrZK0mUmi9/Ys3yKDUI6WuPNtev9nJAi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7YK9w%2FbtrZK0mUmi9%2FYs3yKDUI6WuPNtev9nJAi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;397&quot; height=&quot;145&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 행렬이 같은 것을 볼 수 있습니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마할라노비스 거리 구하기 - 기본 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676816806584&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기본 마할라노비스 거리 계산 방법으로 계산
# VI : 공분산행렬 역행렬 - 마할라노비스 거리 계산 시 필요함
mah1 = pairwise_distances(feat, feat, metric='mahalanobis', VI=cov_inv)
print(mah1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnp42r/btrZLRQVBIK/3B40HSDFQc5O2kkCKb5Ag1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnp42r/btrZLRQVBIK/3B40HSDFQc5O2kkCKb5Ag1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnp42r/btrZLRQVBIK/3B40HSDFQc5O2kkCKb5Ag1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdnp42r%2FbtrZLRQVBIK%2F3B40HSDFQc5O2kkCKb5Ag1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;122&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마할라노비스 거리 구하기 - 숄레스키 분해 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 기본 방법으로 구한 마할라노비스 거리와 결과가 같은 것을 알 수 있습니다 :)&lt;/p&gt;
&lt;pre id=&quot;code_1676816917830&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X = np.matmul(feat, cov_inv_L)  # 원 데이터 * 하삼각행렬
mah2 = pairwise_distances(X, X, metric='euclidean')  # euclidean 방법으로 계산
print(mah2)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZEG7D/btrZ0KpekLP/IZsC3ORpXQguvmFPNDPCvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZEG7D/btrZ0KpekLP/IZsC3ORpXQguvmFPNDPCvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZEG7D/btrZ0KpekLP/IZsC3ORpXQguvmFPNDPCvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZEG7D%2FbtrZ0KpekLP%2FIZsC3ORpXQguvmFPNDPCvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;215&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;References&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마할라노비스 거리 개념
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://angeloyeo.github.io/2022/09/28/Mahalanobis_distance.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://angeloyeo.github.io/2022/09/28/Mahalanobis_distance.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;숄레스키 분해를 이용한 마할라노비스 거리 구하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://stats.stackexchange.com/questions/147210/efficient-fast-mahalanobis-distance-computation&quot;&gt;https://stats.stackexchange.com/questions/147210/efficient-fast-mahalanobis-distance-computation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kosukeimai/MatchIt/blob/master/R/dist_functions.R&quot;&gt;https://github.com/kosukeimai/MatchIt/blob/master/R/dist_functions.R&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;행렬 분해를 이용하여 마할라노비스 거리를 구하는 방법에 대해 알아보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;읽어주셔서 감사합니다  &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;▼&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>선형 대수</category>
      <category>Cholesky decomposition</category>
      <category>covariance matrix</category>
      <category>lower triangular matrix</category>
      <category>LU Decomposition</category>
      <category>LU분해</category>
      <category>mahalanobis distance</category>
      <category>공분산행렬</category>
      <category>마할라노비스 거리</category>
      <category>숄레스키분해</category>
      <category>하삼각행렬</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/51</guid>
      <comments>https://everyday-tech.tistory.com/entry/%EC%88%84%EB%A0%88%EC%8A%A4%ED%82%A4-%EB%B6%84%ED%95%B4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A7%88%ED%95%A0%EB%9D%BC%EB%85%B8%EB%B9%84%EC%8A%A4-%EA%B1%B0%EB%A6%AC#entry51comment</comments>
      <pubDate>Sat, 28 Jan 2023 21:35:51 +0900</pubDate>
    </item>
    <item>
      <title>가우스소거법으로 역행렬 구하기</title>
      <link>https://everyday-tech.tistory.com/entry/%EA%B0%80%EC%9A%B0%EC%8A%A4%EC%86%8C%EA%B1%B0%EB%B2%95%EC%9C%BC%EB%A1%9C-%EC%97%AD%ED%96%89%EB%A0%AC-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&quot;행 관점에서의 행렬 연산, 가우스 소거법으로 역행렬을 구하는 방법&amp;amp;증명 내용입니다&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;행 관점에서의 행렬 변환&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;행 관점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 $D,A,A^*$가 있을 때 아래 식의 의미는 &quot;$A$ 행렬에 $D$ 연산을 하여 $A^*$ 행렬을 만든다&quot; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 $A$에 어떤 연산 $D$를 취하여 변환한 행렬이 $A^*$ 인 것입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ DA = A^* $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ (A \xrightarrow{D} A^*) $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xUXZm/btrXFt5TPP4/fWdFbsNckKnKc311TnFu8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xUXZm/btrXFt5TPP4/fWdFbsNckKnKc311TnFu8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xUXZm/btrXFt5TPP4/fWdFbsNckKnKc311TnFu8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxUXZm%2FbtrXFt5TPP4%2FfWdFbsNckKnKc311TnFu8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;152&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세히 보면 $A$의 각 행을 잘 조합하여 $A^*$ 가 만들어진다는 규칙을 알 수 있습니다&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;$A$의 각 행을 재료로 하고, 이를 조합하여($D$) 행렬 $A^*$를 만듭니다&lt;/li&gt;
&lt;li&gt;변환 역할을 담당하는 행렬 &lt;b&gt;$D$의 각 행의 값들이 $A^*$의 동일한 행에 영향을 미치는 것&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;을 알 수 있습니다&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 $D$의 1행 $(a_1, a_2, a_3) = (1,3,-2)$라면 이는 $A$ 행렬의 각 행 순서대로 1, 3, -2를 곱한 후 더한 벡터를 다시 $A$ 행렬의 1행에 넣는 것으로 생각할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 &lt;b&gt;변환하는 행렬 $D$의 각 행의 값을 보면 행렬 $A$의 행들이 어떻게 선형결합 되는지 알 수 있습니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;행 관점 - 기본 세 가지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설명한 행 관점에서 행렬 변환 중 기본이 되는 세 가지 변환에 대해 설명합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 기본 연산 하나하나는 행렬로 표현 가능합니다. &lt;b&gt;그리고 몇 차례의 연속적인 연산에 대응하는 행렬을 얻고자 한다면, 각 연산에 대응하는 행렬을 역순으로 곱하면 됩니다&lt;/b&gt;. &lt;a title=&quot;해당 포스팅&quot; href=&quot;https://angeloyeo.github.io/2021/06/15/elementary_square_matrices.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;해당 포스팅&lt;/a&gt;에 잘 설명되어 있으니 참고하시면 좋습니다  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Row multiplication&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 행에 곱셈을 취하는 것입니다&lt;/li&gt;
&lt;li&gt;$r_3 \rightarrow 3r_3$ (3번째 행에 3을 곱하는 연산)을 수행하는 행렬은 아래와 같습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$&amp;nbsp;\begin{pmatrix} &lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\ &lt;br /&gt;0&amp;nbsp;&amp;amp;&amp;nbsp;1&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\ &lt;br /&gt;0 &amp;amp; 0 &amp;amp; \Large{3}&lt;br /&gt;\end{pmatrix}&amp;nbsp;$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Row addition&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행 끼리 더하여 특정 행에 넣어주는 연산입니다&lt;/li&gt;
&lt;li&gt;$r_3 \rightarrow r_2 + r_3$ (3번째 행에 3번째 행과 2번째 행을 더한 벡터를 넣는 연산)을 수행하는 행렬은 아래와 같습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$&amp;nbsp;\begin{pmatrix}&lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\&lt;br /&gt;0&amp;nbsp;&amp;amp;&amp;nbsp;1&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\&lt;br /&gt;0 &amp;amp; \Large{1} &amp;amp; \Large{1}&lt;br /&gt;\end{pmatrix}&amp;nbsp;$$&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 나아가 위의 row mutiplication과 조합하여 생각해보면 아래와 같은 연산을 생각해볼 수 있습니다&lt;/li&gt;
&lt;li&gt;$r_3 \rightarrow -5r_2 + r_3$ (3번째 행에 3번째 행에 2번째 행에 5를 곱한 값을 빼준 벡터를 넣는 연산)을 수행하는 행렬은 아래와 같습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$&amp;nbsp;\begin{pmatrix}&lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\&lt;br /&gt;0&amp;nbsp;&amp;amp;&amp;nbsp;1&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\&lt;br /&gt;0 &amp;amp; \Large{-5} &amp;amp; \Large{1}&lt;br /&gt;\end{pmatrix}&amp;nbsp;$$&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Row switching&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행의 순서를 바꾸는 연산입니다&lt;/li&gt;
&lt;li&gt;$r_1 \rightarrow r_3, r_3 \rightarrow r_1$ (3번째 행과 1번째 행의 순서를 바꾸는 연산)을 수행하는 행렬은 아래와 같습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$&amp;nbsp;\begin{pmatrix}&lt;br /&gt;0 &amp;amp; 0 &amp;amp; \Large{1} \\&lt;br /&gt;0&amp;nbsp;&amp;amp;&amp;nbsp;1&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\&lt;br /&gt;\Large{1} &amp;amp; 0&amp;amp; 0&lt;br /&gt;\end{pmatrix}&amp;nbsp;$$&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 보면 각 변환에 대한 이해가 어렵습니다. 일반화하여 각 변환을 이해하면 아래와 같습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;row multiplication, row addition, row switching 변환을 하는 행렬 $D$가 행렬 $A$를 $A^*$로 변환한다고 합시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ DA = A* $$&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;$A$의 각 행을 $D$의 행의 값들로 조합하여 $A^*$를 만듭니다&lt;/li&gt;
&lt;li&gt;이 때 $D$의 n번째 행의 값들로 조합하여 $A^*$의 n번째 행을 만듭니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면, $A,D,A^*$가 모두 3*3 행렬이고 $D$의 2번째 행이 $(1,4,-5)$ 이면 $A^*$의 2번째 행은 $A$의 각 행에 순서대로 1,4,-5를 곱한 후 합한 값입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bytgvQ/btrXoDNGeII/pqvgDCnyPQjcBQjFyLldI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bytgvQ/btrXoDNGeII/pqvgDCnyPQjcBQjFyLldI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bytgvQ/btrXoDNGeII/pqvgDCnyPQjcBQjFyLldI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbytgvQ%2FbtrXoDNGeII%2FpqvgDCnyPQjcBQjFyLldI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;541&quot; height=&quot;155&quot; data-origin-width=&quot;877&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;가우스 소거법으로 역행렬 구하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가우스 소거법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우스 소거법은 특정 행렬 $A$의 행 간 연산을 통해 다른 행렬을 만드는 방법입니다. 위에서 말씀드린 row addition, row multiplication, row switching 방법을 사용합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 위에서 설명드린 것과 같이 &lt;b&gt;이러한 연산은 행렬로 표현 가능하기 때문에 행렬 곱으로 가우스 소거법을 표현할 수 있습니다&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;역행렬 구하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬 $A$의 역행렬이 존재한다고 가정할 때, 이를 가우스 소거법으로 구해보겠습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$A^{-1} A= I$$&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우스 소거법을 이용하여 역행렬을 구하는 방법 아래와 같습니다&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;행렬 $A$와 $I$를 행 기준으로 concatenate 한 행렬을 만든다
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$$ (A | I) $$&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;가우스 소거법을 이용하여 행렬 $(A | I)$에서 행렬 $A$를 $I$로 만든다
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$$(A | I) \rightarrow (I | I^*)$$&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;이 때, 행렬 $I^*$가 행렬 $A$의 역행렬이다&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참고) 가우스 소거법은 행 기준으로 연산을 하므로 해당 연산을 수행하여 $A$가 $I$로 변환되는 결과와 $I$가 $I^*$로 변환되는 결과는 변함이 없기 때문에 $(A | I)$로 행 기준으로 concatenate한 후 한번에 연산해도 된다&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;증명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$I^*$가 $A^{-1}$임을 증명해봅니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 행 관점에서 변환에서 설명하였듯이 이러한 변환은 행렬 곱으로 표현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$A$를 가우시안 소거법에 의해 $I$로 변환하는 행렬을 $G$ 라고 하면 아래와 같이 표현할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ G (A | I) = (I | I^*) \\ (A | I) \xrightarrow{G} (I | I^*) $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우시안 소거법은 각 행에만 영향을 미치므로 아래와 같이 적을 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ G A = I \tag{1} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ G I = I^* \tag{2} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2)번 식의 양변에 행렬 $A$를 곱하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ G I A = I^* A \tag{3} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 (3)의 좌변을 살펴보면 $G I A = G A = I$ 이므로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ I = I^* A \tag{4} $$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, $A$에 $I^*$행렬을 곱하면 단위 행렬이 되므로 $I^*$는 $A$의 역행렬이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우시안 소거법에 의해 역행렬을 구하는 방법에 대한 증명이었습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://angeloyeo.github.io/2021/06/15/elementary_square_matrices.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://angeloyeo.github.io/2021/06/15/elementary_square_matrices.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://angeloyeo.github.io/2021/06/16/LU_decomposition.html&quot;&gt;https://angeloyeo.github.io/2021/06/16/LU_decomposition.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%82%AC%EB%8B%A4%EB%A6%AC%EA%BC%B4%ED%96%89%EB%A0%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.wikipedia.org/wiki/%EC%82%AC%EB%8B%A4%EB%A6%AC%EA%BC%B4%ED%96%89%EB%A0%AC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bskyvision.com/entry/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-%ED%96%89%EB%A0%ACA%EC%99%80-%ED%96%89%EB%A0%ACB%EC%9D%98-%EA%B3%B1%EC%9D%84-%EB%B0%94%EB%9D%BC%EB%B3%B4%EB%8A%94-%EC%84%B8-%EA%B0%80%EC%A7%80-%EA%B4%80%EC%A0%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://bskyvision.com/entry/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99-%ED%96%89%EB%A0%ACA%EC%99%80-%ED%96%89%EB%A0%ACB%EC%9D%98-%EA%B3%B1%EC%9D%84-%EB%B0%94%EB%9D%BC%EB%B3%B4%EB%8A%94-%EC%84%B8-%EA%B0%80%EC%A7%80-%EA%B4%80%EC%A0%90&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;행 관점에서의 행렬 변환에 대한 내용과 가우스 소거법을 이용한 역행렬을 구하는 법에 대해 정리해보았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;긴 글 읽어주셔서 감사합니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot;&gt;▼&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>선형 대수</category>
      <category>row addition</category>
      <category>row multiplication</category>
      <category>row switching</category>
      <category>가우시안소거법</category>
      <category>역행렬</category>
      <category>행 선형결합</category>
      <category>행렬변환</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/50</guid>
      <comments>https://everyday-tech.tistory.com/entry/%EA%B0%80%EC%9A%B0%EC%8A%A4%EC%86%8C%EA%B1%B0%EB%B2%95%EC%9C%BC%EB%A1%9C-%EC%97%AD%ED%96%89%EB%A0%AC-%EA%B5%AC%ED%95%98%EA%B8%B0#entry50comment</comments>
      <pubDate>Sat, 28 Jan 2023 21:23:33 +0900</pubDate>
    </item>
    <item>
      <title>correlation의 기하학적 의미</title>
      <link>https://everyday-tech.tistory.com/entry/correlation%EC%9D%98-%EA%B8%B0%ED%95%98%ED%95%99%EC%A0%81-%EC%9D%98%EB%AF%B8</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;팀원분께서 두 벡터의 correlation이 갖는 기하학적 의미에 대해 공유해주신 내용을 공부하여 정리해보았습니다 :)&lt;br /&gt;(팀원분께 무한한 감사를!  )&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;사전 지식&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;correlation을 기하학적으로 이해하기 위해서는 벡터의 사영(projection)에 대한 이해가 필요합니다 (&lt;a href=&quot;https://everyday-tech.tistory.com/entry/Orthogonal-벡터-만들기&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;Orthogonal 벡터 만들기&lt;/span&gt;&lt;/a&gt; 참고)&lt;br /&gt;두 벡터 $\vec{u} = (u_1, u_2, ..., u_n)$, $\vec{v} = (v_1, v_2, ..., v_n)$가 주어져 있고, 두 벡터의 각도가 $\theta$일 때,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정리1. 두 벡터 $\vec{u}$, $\vec{v}$가 이루는 각도 $\theta$의 코사인 값은 아래와 같다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$$ cos(\theta) = \frac{\vec{u} \cdot \vec{v}}{|\vec{u}| |\vec{v}|}$$&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정리2. 벡터 $\vec{u}$를 $\vec{v}$에 사영(projection)시킨 벡터는 아래와 같이 계산한다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$$ \vec{u}_{project \ to \ \vec{v}} = \frac{\vec{u} \cdot \vec{v}}{\vec{v} \cdot \vec{v}} \vec{v} $$&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;sampled correlation의 수식&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 sampled covariance 와 sampled correlation의 수식에 대해 살펴봅니다&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;sampled covariance&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$n$개의 샘플을 가진 두 변수 $\vec{x}= (x_1, x_2, ..., x_n) $, $\vec{y} = (y_1, y_2, ..., y_n) $의 sampled covariance는 아래와 같습니다&lt;br /&gt;범위 : -&amp;infin; ~ &amp;infin;&lt;br /&gt;$$Cov(\vec{x},\vec{y}) = \sum_{i=1}^{n}{ (x_i - \bar{x}) (y_i - \bar{y} ) } = (\vec{x} - \bar{x}) \cdot (\vec{y} - \bar{y})$$&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;sampled correlation&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 공분산을 normalize 한 것이 sampled correlation입니다&lt;br /&gt;범위 : -1 ~ 1&lt;br /&gt;$$Corr(\vec{x},\vec{y}) = \normalsize{\frac{\sum_{i=1}^{n}{ (x_i - \bar{x}) (y_i - \bar{y} ) }}{\sqrt{\sum_{i=1}^{n} {(x_i - \bar{x}})^2} \sqrt{\sum_{i=1}^{n} {(y_i - \bar{y}})^2}}} = \frac{(\vec{x} - \bar{x}) \cdot (\vec{y}- \bar{y})}{|\vec{x} - \bar{x}| |\vec{y} - \bar{y}|}$$&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;sample correlation의 기하학적 의미&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위의 &lt;b&gt;정리1의 수식&lt;/b&gt;을 보니 sampled correlation과 유사합니다 ($\vec{u}$가 $\vec{x} - \bar{x}$로, $\vec{v}$가 $\vec{y} - \bar{y}$ 인 경우가 sampled correlation이 됩니다!)&lt;br /&gt;즉, $\vec{x}$, $\vec{y}$의 sample correlation은 &lt;b&gt;두 벡터 ($\vec{x}$, $\vec{y}$)에 각각의 sampled mean ($\bar{x}$, &lt;b&gt;$\bar{y}$)&lt;/b&gt;을 빼서 구한 두 벡터 ($\vec{x} - \bar{x}$, $\vec{y} - \bar{y}$) 간 각도의 코사인 값과 같습니다&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;그렇다면 기하학적으로 sampled mean을 빼준다는 것은 어떤 의미일까요?&lt;br /&gt;바로, $\vec{1}$&lt;b&gt; (1벡터; 모든 요소 값이 1인 벡터)에 사영(projection) 시킨다는 의미입니다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5V8vE/btrToDi6WLS/kpGYahCBvLuDUF1QgcRTI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5V8vE/btrToDi6WLS/kpGYahCBvLuDUF1QgcRTI1/img.jpg&quot; data-alt=&quot;두 벡터를 1벡터에 사영&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5V8vE/btrToDi6WLS/kpGYahCBvLuDUF1QgcRTI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5V8vE%2FbtrToDi6WLS%2FkpGYahCBvLuDUF1QgcRTI1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;505&quot; height=&quot;260&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 벡터를 1벡터에 사영&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위의 &lt;b&gt;정리2의 수식&lt;/b&gt;을 적용하여 $\vec{x} = (x_1, x_2, ..., x_n) $와 $\vec{y} = (y_1, y_2, ..., y_n)$를 각각 1벡터에 사영시킨 벡터는 아래와 같이 계산됩니다. 각 sample mean ($\bar{x}$, $\bar{y}$) 이 모든 요소 값인 벡터가 되는 것이지요&lt;br /&gt;$$ \vec{x}_{project \ to \ \vec{1}} = \frac{\vec{x} \cdot \vec{1}}{\vec{1} \cdot \vec{1}} \vec{1} = \frac{\sum_{i=1}^{n}{x_i}}{\sum_{i=1}^{n}{1}} \vec{1} = \frac{\sum_{i=1}^{n}{x_i}}{n} \vec{1} = \bar{x} \vec{1} = (\bar{x}, \bar{x}, ..., \bar{x}) = \vec{\bar{x}}$$ &lt;br /&gt;$$ \vec{y}_{project \ to \ \vec{1}} = ... = (\bar{y}, \bar{y}, ..., \bar{y}) = \vec{\bar{y}}$$&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1711&quot; data-origin-height=&quot;889&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccytgo/btrTk3JrcuQ/aqTfKop4YdSWoynfbTtQPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccytgo/btrTk3JrcuQ/aqTfKop4YdSWoynfbTtQPk/img.jpg&quot; data-alt=&quot;두 벡터를 1벡터에 사영한 벡터의 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccytgo/btrTk3JrcuQ/aqTfKop4YdSWoynfbTtQPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccytgo%2FbtrTk3JrcuQ%2FaqTfKop4YdSWoynfbTtQPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;282&quot; data-origin-width=&quot;1711&quot; data-origin-height=&quot;889&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 벡터를 1벡터에 사영한 벡터의 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;이를 해석하자면, 벡터 $\vec{x}$, $\vec{y}$에서 각각의 평균의 효과를 뺀 벡터 ($\vec{x} - \vec{\bar{x}}$, $\vec{y} - \vec{\bar{y}}$)를 구하고, &lt;b&gt;두 벡터 간의 각도($\theta^{\prime}$)의 코사인 값&lt;/b&gt;이 두 벡터의 correlation입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;985&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpiB6r/btrTh5HZJ96/OH3zUAjyFyTKhdIt8qqNR1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpiB6r/btrTh5HZJ96/OH3zUAjyFyTKhdIt8qqNR1/img.jpg&quot; data-alt=&quot;두 벡터의 corrrelation의 기하학적 의미&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpiB6r/btrTh5HZJ96/OH3zUAjyFyTKhdIt8qqNR1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpiB6r%2FbtrTh5HZJ96%2FOH3zUAjyFyTKhdIt8qqNR1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;354&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;985&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 벡터의 corrrelation의 기하학적 의미&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;확장&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;각 벡터 $\vec{x}$, $\vec{y}$의 평균 효과를 뺀(통제한) 벡터 ($\vec{x} - \vec{\bar{x}}$, $\vec{y} - \vec{\bar{y}}$) 간 각도의 코사인 값이 두 벡터 간 correlation입니다.&lt;br /&gt;그리고 &lt;b&gt;평균의 효과를 계산하기 위해 $\vec{1}$에 사영(projection)하였습니다. &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;그럼 일반화 하여 $\vec{1}$이 아닌 다른 벡터 $\vec{z}$에 사영한 후 구한 correlation은 무엇일까요?&lt;br /&gt;해석하면 두 벡터 $\vec{x}$, $\vec{y}$에 $\vec{z}$의 효과를 제거(통제)하였다고 생각할 수 있습니다.&lt;br /&gt;이렇게 구한 correlation을 &lt;b&gt;partial correlation이라고 합니다&lt;/b&gt;&lt;br /&gt;다음 포스팅에서는 partial correlatoin에 대해 알아보겠습니다  &lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;변수 간의 상관성 등을 공부하다 보니 기하 공간에서의 이해는 정말 중요한 것 같습니다&lt;br /&gt;앞으로 기하 공간에서의 개념 이해를 위해 공부를 많이 해야겠다는 생각이 듭니다&lt;br /&gt;글 읽어주셔서 감사합니다&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot;&gt;▼&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>선형 대수</category>
      <category>correlation</category>
      <category>Geometry</category>
      <category>projection</category>
      <category>Vector</category>
      <category>기하학</category>
      <category>벡터</category>
      <category>사영</category>
      <category>상관계수</category>
      <category>선형대수</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/48</guid>
      <comments>https://everyday-tech.tistory.com/entry/correlation%EC%9D%98-%EA%B8%B0%ED%95%98%ED%95%99%EC%A0%81-%EC%9D%98%EB%AF%B8#entry48comment</comments>
      <pubDate>Sat, 10 Dec 2022 18:24:34 +0900</pubDate>
    </item>
    <item>
      <title>PSM(Propensity Score Matching)</title>
      <link>https://everyday-tech.tistory.com/entry/PSMPropensity-Score-Matching</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script type=&quot;text/x-mathjax-config&quot;&gt;
MathJax.Hub.Config({
  tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});
&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-MML-AM_CHTML&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;본 포스팅은 인과추론을 위한 sub sampling 기법 중 하나인 성향 점수 매칭(propensity score matching)에 대해 정리한 글입니다 :)&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처치가 결과에 미치는 영향을 추론(인과 추론)하기 위해서는 처치를 받은 집단(실험군)과 받지 않은 집단(대조군)을 비교해야 합니다. 그리고 반드시 &lt;b&gt;처치를 제외한 다른 조건은 두 집단 간 평균적으로 동일해야 합니다.&lt;/b&gt; 그래야 편향 없이 처치가 결과에 미치는 영향을 추론할 수 있습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 현실에서는 처치 자체가 특정 요인에 영향을 받으며, 특정 요인이 결과에도 영향을 미치는 경우가 많습니다. 이를 교란 요인 (&lt;a href=&quot;https://everyday-tech.tistory.com/entry/인과-추론을-어렵게-하는-요소와-해결-방법&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;교란 변수&lt;/a&gt;) 이라고 합니다. 이러한 경우 교란 요인이 처치 여부에 미치는 영향을 제거해야 올바른 인과 효과를 추정할 수 있습니다&lt;span style=&quot;color: #333333;&quot;&gt;. &lt;b&gt;즉, 처치 여부가 교란 요인에 의해 영향을 받지 않아야 하는 것이지요&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;교란 요인을 $C$, 처치 변수를 $T$(실험군을 1, 대조군을 0)라고 표현하면 교란 요인이 처치 여부에 미치는 영향은 $P(T|C)$로 표현할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여기서 어떤 &lt;b&gt;성향($C$)에 따라 처치($T$)를 받을 확률을 성향 점수&lt;/b&gt;라고 합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;$$\large{P(T|C)}$$&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P4qdJ/btrLQybQbfh/nkTBfyzdHbcKIf2MARfQnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P4qdJ/btrLQybQbfh/nkTBfyzdHbcKIf2MARfQnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P4qdJ/btrLQybQbfh/nkTBfyzdHbcKIf2MARfQnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP4qdJ%2FbtrLQybQbfh%2FnkTBfyzdHbcKIf2MARfQnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;270&quot; height=&quot;257&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BOqxw/btrLMzQmeyw/GIOTqYmekkF8LFRcdDicnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BOqxw/btrLMzQmeyw/GIOTqYmekkF8LFRcdDicnk/img.png&quot; data-alt=&quot;교란 요인으로 인해 두 집단 간 처치를 제외한 다른 조건이 동일하지 않습니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BOqxw/btrLMzQmeyw/GIOTqYmekkF8LFRcdDicnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBOqxw%2FbtrLMzQmeyw%2FGIOTqYmekkF8LFRcdDicnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;330&quot; data-origin-width=&quot;1619&quot; data-origin-height=&quot;926&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;교란 요인으로 인해 두 집단 간 처치를 제외한 다른 조건이 동일하지 않습니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 설명해보겠습니다. 우리는 프로모션을 진행하였고 프로모션이 매출에 미치는 영향을 추정하기 위해 프로모션을 구매한 집단, 구매하지 않은 집단의 매출을 비교하고자 합니다. 여기서 그림에서 보시는 것과 같이 &quot;충성도&quot;라는 교란 요인이 존재할 수 있습니다. &lt;b&gt;충성도가 높은 고객은 프로모션을 구매할 확률이 높은 것이지요.&lt;/b&gt; 따라서, 프로모션 구매 여부를 기준으로 두 집단을 나누면 그림과 같이 프로모션 구매 집단에는 충성도가 높은 고객의 비율이 높고, 미구매 집단에서는 충성도가 높은 고객의 비율이 낮습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로모션 구매가 매출에 미치는 인과 효과를 추정하기 위해서는 두 집단 간 프로모션 구매 여부를 제외한 나머지 요인의 분포는 평균적으로 동일해야하지만 교란 요인으로 인해 이를 위반하게 됩니다. 여기서 &lt;b&gt;교란 요인이 처치에 영향을 미치는 것(충성도에 따른 프로모션 구매 여부)이 위에서 설명드린 성향 점수입니다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\large{P(프로모션 구매 여부 = 1 | 충성도)}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;성향 점수 매칭&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 말씀드린 것처럼 교란 요인이 처치 여부에 영향을 미치는 상황에서는 두 집단(실험군, 대조군) 간 성향 점수의 분포가 다르게 나타납니다. 따라서 두 집단의 성향 점수 분포를 동일하게 만들어주는 작업이 필요합니다. &lt;b&gt;방법은 각 샘플에 대해서 성향 점수를 계산한 다음(샘플의 교란 요인의 값에 따라 처치를 받을 확률), 유사한 샘플끼리 매칭시켜 실험군, 대조군 그룹을 다시 구성하는 것입니다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;성향 점수 계산&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 &lt;b&gt;성향 점수 매칭은 두 집단 각각에서 유사한 샘플을 매칭시키는 sub sampling 방법이며, 매칭의 기준으로 성향 점수를 사용합니다.&lt;/b&gt; 두 집단에서 가장 유사한 샘플끼리 매칭시켜 처치를 제외한 다른 조건(교란 요인)을 통제하는 것이 목적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 &lt;b&gt;성향 점수를 추출하기 위해서는&lt;/b&gt; &lt;b&gt;로지스틱 회귀를 사용&lt;/b&gt;합니다&lt;span style=&quot;color: #333333;&quot;&gt;. 로지스틱 회귀는&amp;nbsp;결과 변수가&lt;/span&gt; binary class(1, 0)인 상황에서 특정 변수가 주어졌을 때 결과 변수가 1일 확률을 추정할 수 있기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ \large{P(결과변수 = 1 | 특정 변수)} $$&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성향 점수 매칭을 이용한 인과 추론을 예시 데이터를 통해 확인해보겠습니다&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이터 생성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 처치 여부가 교란 요인에 영향을 받는 예시 데이터를 생성합니다. 대조군이 실험군에 비해 샘플 수가 많습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 추정해야 하는 인과 효과(처치 변수$T$가 결과 변수 $Y$에 미치는 영향)은 $3$ 입니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot; data-darkreader-inline-color=&quot;&quot;&gt;참고로, uniform distribution의 값의 범위를 [0,2]로 한 이유는 대조군의 샘플 수가 실험군 보다 많게 설정하기 위해서입니다. (실제 현실에서는 대부분 실험군의 샘플 수가 대조군에 비해 적습니다)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662806905400&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels as sm
import statsmodels.formula.api as smf

np.random.seed(777)
N = 1000 # 샘플 수

# 인과 효과, 교란 요인이 결과 변수에 미치는 영향
treat_effect, confounding_effect = 3, 10
# 교란 요인
C = np.random.normal(0, 2, size = N)
C_minmax = (C - C.min()) / (C.max() - C.min()) # 0 ~ 1 사이로 minmax scaling

# 처치 변수
# uniform distribution에서 샘플 수 만큼 샘플을 추출
# C_minmax 값이 클 수록(C의 값이 클수록) Y=1일(처치를 받을) 확률이 높도록 설정
# 즉, 교란 요인(C)의 값이 클수록 처치를 받을 확률을 높임(교란 요인이 처치 여부에 영향을 주는 상태)
T = np.where(np.random.uniform(-1,1, size = N) &amp;lt;= C_minmax, 1, 0)

# 결과 변수
Y = confounding_effect*C + treat_effect*T + np.random.normal(0, 1, size = N)
# 데이터프레임 생성
df = pd.DataFrame({'C' : C, 'T' : T, 'Y' : Y})

print(df.groupby('T').size()) # 실험군, 대조군 수 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PTImR/btrLLZaHfQP/gKzPKMxuT5xoBNFY26T5wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PTImR/btrLLZaHfQP/gKzPKMxuT5xoBNFY26T5wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PTImR/btrLLZaHfQP/gKzPKMxuT5xoBNFY26T5wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPTImR%2FbtrLLZaHfQP%2FgKzPKMxuT5xoBNFY26T5wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;136&quot; height=&quot;102&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;분포 확인(매칭 없이)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실험군, 대조군 두 그룹 간에 처치 변수($T$)를 제외한 다른 요인의 분포는 평균적으로 동일해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림은 두 그룹 간 교란 요인에 대한 분포를 확인한 결과입니다. 보이는 것과 같이 교란 요인이 처치 여부에 영향을 미치기 때문에 두 그룹 간 교란 요인의 분포가 다르게 나타납니다 (교란요인의 CDF가 실험군이 대조군에 비해 낮게 깔려있기 때문에 실험군의 교란 요인 분포가 대조군에 비해 높은 값에 분포하고 있다는 것을 알 수 있습니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662807207717&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def plot_confounding_var_cdf_group(data, title):
    data[data['T'] == 1]['C'].hist(cumulative = True, histtype = 'step', bins = 100, density = True, linewidth = 2)
    data[data['T'] == 0]['C'].hist(cumulative = True, histtype = 'step', bins = 100, density = True, linewidth = 2)
    plt.legend(['treated group (1)', 'control group (0)'], fontsize = 20)
    plt.xlabel('C', fontsize = 20)
    plt.xticks(fontsize = 20)
    plt.ylabel('CDF', fontsize = 20)
    plt.yticks(fontsize = 20)
    plt.title(title, fontsize = 25)
plot_confounding_var_cdf_group(df, 'CDF of each group (not matched)')
plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxSKjs/btrLPc1cvGG/sJ5Me0Zlx7ImlKX08PuQl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxSKjs/btrLPc1cvGG/sJ5Me0Zlx7ImlKX08PuQl0/img.png&quot; data-alt=&quot;두 그룹 간 교란 요인의 분포가 다르게 나타남&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxSKjs/btrLPc1cvGG/sJ5Me0Zlx7ImlKX08PuQl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxSKjs%2FbtrLPc1cvGG%2FsJ5Me0Zlx7ImlKX08PuQl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;268&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 그룹 간 교란 요인의 분포가 다르게 나타남&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;두 그룹 단순 비교(매칭 없이)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처치 변수가 결과 변수에 미치는 영향으로 7.6810이 나왔습니다. &lt;b&gt;두 집단 간 교란 요인의 분포가 다르기 때문에&lt;/b&gt; 우리가 설정한 인과 효과 값인 3이 나오지 않습니다. &lt;b&gt;즉, 교란 요인으로 인해 편향이 추가된 영향이 나옵니다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662807383946&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 매칭 없이 Y ~ T 회귀식 fitting
smf.ols('Y ~ T', data = df).fit().summary().tables[1]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5my7/btrLOgCL72r/6376b5Gx6K6DdcDxDeTFX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5my7/btrLOgCL72r/6376b5Gx6K6DdcDxDeTFX1/img.png&quot; data-alt=&quot;교란 요인의 영향이 섞여 있는 추정 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5my7/btrLOgCL72r/6376b5Gx6K6DdcDxDeTFX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5my7%2FbtrLOgCL72r%2F6376b5Gx6K6DdcDxDeTFX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;453&quot; height=&quot;112&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;교란 요인의 영향이 섞여 있는 추정 값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;성향 점수 매칭&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 발생한 편향을 제거하기 위해서는 &lt;b&gt;두 집단 간 교란 요인의 분포를 동일하게 맞춰주는 작업이 필요합니다.&lt;/b&gt; 이제 두 집단 간 교란 요인 분포를 동일하게 맞춰주기 위해 성향 점수 매칭을 사용하여 실험군, 대조군을 다시 구성해봅시다&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662807683928&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pymatch.Matcher import Matcher

treated_data = df[df['T'] == 1] # 실험군 데이터
control_data = df[df['T'] == 0] # 대조군 데이터

m = Matcher(treated_data, control_data, yvar=&quot;T&quot;, exclude=['Y']) # 설험군 데이터, 대조군 데이터, 처치 변수
m.fit_scores(balance=True, nmodels=100) # 로지스틱 회귀 학습 
m.predict_scores() # 샘플별로 성향 점수 추출
m.match() # 추출된 성향 점수를 기준으로 실험군, 대조군 샘플 매칭 

df_matched = m.matched_data # 매칭된 데이터
print(df_matched.groupby(['T']).size())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성향 점수 매칭 결과입니다. 성향 점수($P(T|C)$)를 추정하는 모델을 학습하기 위해 회귀식을 T ~ C로 설정한 100개의 로지스틱 회귀 모델을 학습하였습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후 모델을 이용하여 각 샘플의 성향 점수를 예측 후, 두 집단 간 성향 점수가 유사한 샘플끼리 매칭하였습니다. 그 결과 실험군과 대조군의 샘플 수가 각각 215개가 되었습니다. 즉, 대조군에서 실험군의 샘플과 성향 점수가 유사한 샘플만은 sub sampling하여 재구성한 것입니다 (그 이외의 샘플들은 버려지게 됩니다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c17UX0/btrLLgYhEGR/0RlWeKKBrWNuicq3Uq8O2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c17UX0/btrLLgYhEGR/0RlWeKKBrWNuicq3Uq8O2k/img.png&quot; data-alt=&quot;성향 점수 매칭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c17UX0/btrLLgYhEGR/0RlWeKKBrWNuicq3Uq8O2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc17UX0%2FbtrLLgYhEGR%2F0RlWeKKBrWNuicq3Uq8O2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;237&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;성향 점수 매칭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리의 목적은 교란 요인이 처치 변수에 영향을 미치지 않도록 실험군, 대조군을 성향 점수 매칭을 통해 재구성하는 것이었습니다. 재구성된 데이터에서 실험군, 대조군의 교란 요인의 분포를 다시 비교해봅니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림에서 보시는 것과 같이 &lt;b&gt;두 그룹 간 교란 요인 분포는 동일합니다.&lt;/b&gt; &lt;b&gt;이제 이 데이터로 두 그룹을 비교하게 되면 교란 요인에 의한 편향 없이 실험군, 대조군의 결과 변수를 비교할 수 있습니다(처치 변수가 결과 변수에 미치는 인과 효과)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662808263925&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;plot_confounding_var_cdf_group(df_matched, 'CDF of each group (matched)')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cROWN6/btrLLiPkUeO/rUVacgE8snMGSFsJHNxOv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cROWN6/btrLLiPkUeO/rUVacgE8snMGSFsJHNxOv0/img.png&quot; data-alt=&quot;두 그룹 간 교란 요인 분포가 거의 동일 (성향 점수 매칭 후)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cROWN6/btrLLiPkUeO/rUVacgE8snMGSFsJHNxOv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcROWN6%2FbtrLLiPkUeO%2FrUVacgE8snMGSFsJHNxOv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;274&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;두 그룹 간 교란 요인 분포가 거의 동일 (성향 점수 매칭 후)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인과 효과 추정(매칭 후)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성향 점수 매칭으로 재구성된 데이터를 이용하여 처치 변수가 결과 변수에 미치는 인과 효과를 선형 회귀를 이용하여 추정합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 세팅한 인과 효과인 3과 유사한 값인 3.0187이 나왔습니다. 즉 편향이 없는 인과 효과를 추정할 수 있게 되었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1662808375902&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# PSM을 이용하여 매칭된 데이터를 사용하여 Y ~ T fitting
smf.ols('Y ~ T', data = df_matched).fit().summary().tables[1]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LJioI/btrLLAI0il8/uRoQ8CDO31dPWDchUvEyAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LJioI/btrLLAI0il8/uRoQ8CDO31dPWDchUvEyAk/img.png&quot; data-alt=&quot;성향 점수 매칭 후 올바르게 추정된 인과 효과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LJioI/btrLLAI0il8/uRoQ8CDO31dPWDchUvEyAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLJioI%2FbtrLLAI0il8%2FuRoQ8CDO31dPWDchUvEyAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;103&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;성향 점수 매칭 후 올바르게 추정된 인과 효과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;참고) 다른 방법&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 매칭 기법을 활용하지 않고 &lt;b&gt;회귀식에 교란 요인을 독립항으로 추가하여 통제하는 방법으로도 인과 효과를 추정할 수 있습니다.&lt;/b&gt;(&lt;a href=&quot;https://everyday-tech.tistory.com/entry/인과-추론을-어렵게-하는-요소와-해결-방법&quot;&gt;교란 변수&lt;/a&gt;&lt;span&gt;)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;두 방법 중 어떤 것이 더 좋다고 말할 수는 없으나 성향 점수 매칭을 사용하면 두 집단 간의 비교 결과에 대한 이해가 더 직관적이라는 장점이 있다고 생각합니다&lt;/p&gt;
&lt;pre id=&quot;code_1662824040066&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 매칭 없이 Y ~ T + C fitting (교란 변수 C를 독립항으로 추가하여 통제하려는 목적)
smf.ols('Y ~ T + C', data = df).fit().summary().tables[1]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AJhXx/btrLQmo44xF/r2icJLHZCvjZWkMYnWB0D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AJhXx/btrLQmo44xF/r2icJLHZCvjZWkMYnWB0D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AJhXx/btrLQmo44xF/r2icJLHZCvjZWkMYnWB0D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAJhXx%2FbtrLQmo44xF%2Fr2icJLHZCvjZWkMYnWB0D1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;120&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인과 효과 추정을 위해서 유사한 실험군, 대조군을 재구성하는 방법인 성향 점수 매칭에 대해 알아보았습니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;피드백은 언제나 환영합니다. 긴 글 읽어주셔서 감사합니다!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot; data-darkreader-inline-bgcolor=&quot;&quot;&gt;&lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;▼ &lt;/span&gt;글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 :) &lt;span style=&quot;color: #666666;&quot; data-darkreader-inline-color=&quot;&quot;&gt;▼&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>인과추론(Causal Inference)</category>
      <category>causal inference</category>
      <category>Propensity Score Matching</category>
      <category>PSM</category>
      <category>Sampling</category>
      <category>대조군</category>
      <category>성향점수매칭</category>
      <category>실험군</category>
      <category>인과추론</category>
      <category>통제</category>
      <category>편향</category>
      <author>호재 P.B</author>
      <guid isPermaLink="true">https://everyday-tech.tistory.com/47</guid>
      <comments>https://everyday-tech.tistory.com/entry/PSMPropensity-Score-Matching#entry47comment</comments>
      <pubDate>Sat, 10 Sep 2022 20:21:06 +0900</pubDate>
    </item>
  </channel>
</rss>