<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>뛰는 놈 위에 나는 공대생</title>
    <link>https://normal-engineer.tistory.com/</link>
    <description>수학,프로그래밍,기계항공우주 등 공부하는 기록들을 남깁니다.</description>
    <language>ko</language>
    <pubDate>Sat, 15 Aug 2026 12:43:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>보통의공대생</managingEditor>
    <image>
      <title>뛰는 놈 위에 나는 공대생</title>
      <url>https://tistory1.daumcdn.net/tistory/4205388/attach/f2ce53988b2a4e7ca91ee2e5d3cf30c5</url>
      <link>https://normal-engineer.tistory.com</link>
    </image>
    <item>
      <title>[데이터분석] t-SNE</title>
      <link>https://normal-engineer.tistory.com/532</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t-SNE는 PCA와 UMAP과 더불어 고차원 데이터를 시각화할 때 많이 사용하는 방법이다.&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;이 글은 Journal of Machine Learning Research에 실린 Visualizing Data using t-SNE 논문을 정리한 것이다. (검색하기 쉽게 복사 가능한 코드 블럭에 인용을 넣어놓는다)&lt;/p&gt;
&lt;pre id=&quot;code_1783446201111&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;van der Maaten, L. &amp;amp; Hinton, G. Visualizing data using t-SNE. Journal of Machine Learning Research 9, 2579&amp;ndash;2605 (2008).&lt;/code&gt;&lt;/pre&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Dimensionality reduction&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dimensionality reduction 문제 : high-dimensional data set $X=\left\{ x_1,x_2,\ldots,x_n \right\}$를 two or three-dimensional data $Y=\{y_1,y_2,\ldots,y_n\}$으로 변환하는 것을 dimensionality reduction이라고 한다.&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;Principal Components Analysis (PCA)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Classicial multidimensional scaling (MDS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 방법이 대표적인 Linear technique다. 이 방법은 비슷하지 않은 데이터 포인트들의 저차원 표현을 멀리 떨어뜨려놓는 데에 집중한다.&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;그러나 nonlinear manifold에 있는 고차원 데이터들의 경우, 비슷한 데이터일지라도 linear mapping으로 저차원으로 변환할 때 해당하는 데이터포인트들이 가까이 있게 할 수 없다고 한다.&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;그래서 제안된 nonlinear dimensionality reduction은 다음과 같다.&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. Sammon mapping&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Curvilinear components analysis&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Stochastic Neighbor Embedding (SNE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Isomap&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Maximum Variance Unfolding (MVU)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Locally Linear Embedding (LLE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Laplacian Eigenmaps&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;이 논문에서는 당연히 새로운 방법인 t-SNE를 소개한다. 이 방법과 위의 일곱 가지 방법들과도 비교한다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; In this paper, we describe a way of converting a high-dimensional data set into a matrix of pairwise similarities and we introduce a new technique, called &amp;ldquo;t-SNE&amp;rdquo;, for visualizing the resulting similarity data. t-SNE is capable of capturing much of the local structure of the high-dimensional data very well, while also revealing global structure such as the presence of clusters at several scales. &lt;/span&gt;&lt;/blockquote&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;위의 방법들에서 눈치챘을 수도 있는데 3번 방법이 SNE고 제시한 방법은 t-SNE다. (그리고 저자도 같다.) 즉, SNE 방법을 먼저 설명하고 여기서 더 발전된 형태가 t-SNE 라고 할 수 있다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Stochastic Neighbor Embedding (SNE)&lt;/b&gt;&lt;/h2&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$에 대한 $x_j$의s similarity를 conditional probability로 표현해서 정의한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Sshc/dJMcag7bPeo/VvkRVPusEMd3c5aVNPRtyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Sshc/dJMcag7bPeo/VvkRVPusEMd3c5aVNPRtyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Sshc/dJMcag7bPeo/VvkRVPusEMd3c5aVNPRtyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Sshc%2FdJMcag7bPeo%2FVvkRVPusEMd3c5aVNPRtyk%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;628&quot; height=&quot;139&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;139&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;p data-ke-size=&quot;size16&quot;&gt;또한 우리가 변환한 저차원 데이터 $y_i$와 $y_j$에 대해서도 다음과 같이 conditional probability $q_{j|i}$를 정의한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccEHuH/dJMcaiDYATM/YBEXWh3VLYbJg9CJJ5aDmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccEHuH/dJMcaiDYATM/YBEXWh3VLYbJg9CJJ5aDmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccEHuH/dJMcaiDYATM/YBEXWh3VLYbJg9CJJ5aDmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccEHuH%2FdJMcaiDYATM%2FYBEXWh3VLYbJg9CJJ5aDmK%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;141&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;141&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;p data-ke-size=&quot;size16&quot;&gt;우리가 만들 mapping은 오리지널 데이터인 $x_i,x_j$의 similarity를 보존하고 싶기 때문에 다음과 같은 Kullback-Leibler divergences를 모든 데이터 포인트에 대해 합산한 값을 최소화하고자 한다. 즉, $p_{j|i}$와 $q_{j|i}$ 분포를 동일하게 만들고 싶은 것이다.&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;694&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uxryh/dJMcad3Flyh/n96XXZ3S2FahfQX7k2j2u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uxryh/dJMcad3Flyh/n96XXZ3S2FahfQX7k2j2u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uxryh/dJMcad3Flyh/n96XXZ3S2FahfQX7k2j2u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUxryh%2FdJMcad3Flyh%2Fn96XXZ3S2FahfQX7k2j2u1%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;694&quot; height=&quot;133&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;133&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;p data-ke-size=&quot;size16&quot;&gt;문제는 이 KL divergence가 symmetry가 아니기 때문에 데이터에 따라 가중치가 달라지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 원래는 굉장히 가까운 데이터인데 멀리 떨어지게 mapping된 포인트들은 훨씬 큰 cost 값을 갖고, 원래는 멀리 있는 데이터는 mapping된 포인트가 가까운 경우에는 작은 cost를 갖게 된다. 즉, 원래 가까운 데이터들을 mapping에서도 가깝게 있도록 하는 데에 집중된 목적 함수라고 볼 수 있다. (그래서 저자는 local structure of the data in the map을 retain하는 데에 집중한다고 설명)&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;467&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5aJoY/dJMcaa0dHBC/oxNaBdDtQs2uluwlsykv8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5aJoY/dJMcaa0dHBC/oxNaBdDtQs2uluwlsykv8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5aJoY/dJMcaa0dHBC/oxNaBdDtQs2uluwlsykv8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5aJoY%2FdJMcaa0dHBC%2FoxNaBdDtQs2uluwlsykv8k%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;467&quot; height=&quot;95&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;95&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;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 그래디언트를 구하면 이 값이 spring force와 비슷하다고 볼 수 있다. $y_i-y_j$가 힘의 방향이고 앞에 곱해진 값이 스프링계수 같은 것이다. $y_i$와 $y_j$ 사이의 스프링이 당기는지 미는지는 두 데이터 포인트의 similarities에 따라 결정된다.&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;최적화 관점에서는 다음과 같이 gradient 값과 모멘텀 $\alpha(t)$가 결합된 형태로 mapping points를 업데이트한다.&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;859&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqJRpH/dJMcaaTsNmj/P2fanbjtID1WaMiKa3gEJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqJRpH/dJMcaaTsNmj/P2fanbjtID1WaMiKa3gEJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqJRpH/dJMcaaTsNmj/P2fanbjtID1WaMiKa3gEJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqJRpH%2FdJMcaaTsNmj%2FP2fanbjtID1WaMiKa3gEJK%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;859&quot; height=&quot;130&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;130&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;p data-ke-size=&quot;size16&quot;&gt;위 formulation에서 알 수 있듯이 $\sigma_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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. t-Distributed Stochastic Neighbor Embedding&lt;/b&gt;&lt;/h2&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.1. Symmetric SNE&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conditional probability 대신 a single KL divergence between a joint probability distribution $P$와 $Q$를 사용하고자 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lzPXe/dJMcaccFoDs/36eBpB8nMH8WUSIjJj6Zg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lzPXe/dJMcaccFoDs/36eBpB8nMH8WUSIjJj6Zg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lzPXe/dJMcaccFoDs/36eBpB8nMH8WUSIjJj6Zg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlzPXe%2FdJMcaccFoDs%2F36eBpB8nMH8WUSIjJj6Zg0%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;586&quot; height=&quot;120&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;120&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;p data-ke-size=&quot;size16&quot;&gt;pairwise similarity는 다음과 같이 정의된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nAU4J/dJMcabrjE3X/dYUUaeSKNcXZtiQttE8790/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nAU4J/dJMcabrjE3X/dYUUaeSKNcXZtiQttE8790/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nAU4J/dJMcabrjE3X/dYUUaeSKNcXZtiQttE8790/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnAU4J%2FdJMcabrjE3X%2FdYUUaeSKNcXZtiQttE8790%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;351&quot; height=&quot;87&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;87&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;409&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1iTFr/dJMcaf8fuvb/VzCx19L5tw2LznCWDHjtZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1iTFr/dJMcaf8fuvb/VzCx19L5tw2LznCWDHjtZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1iTFr/dJMcaf8fuvb/VzCx19L5tw2LznCWDHjtZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1iTFr%2FdJMcaf8fuvb%2FVzCx19L5tw2LznCWDHjtZK%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;409&quot; height=&quot;91&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;91&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;p data-ke-size=&quot;size16&quot;&gt;그런데 이렇게 정의할 경우에 문제가 생길 수 있는 상황이 있다. $x_i$가 outlier일 경우에 p_{ij}가 너무 크게 나온다는 것이다. 그래서 $y_i$ 값이 cost function에 거의 영향을 주지 않게 된다. 그래서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$p_{ij}=\frac{p_{j|i}+p_{i|j}}{2}$$로 정의해서 문제를 해결하고자 하였다. 이러면 $\sum_j p_{ij}&amp;gt; 1/2n$이 보장된다.&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;그러나 이 방법은 asymmetric SNE에 비해 그렇게 크게 좋아지는 것은 아니다.&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;346&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4QRw/dJMcajizGgd/SLbIpVgJy4P58PJkFievV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4QRw/dJMcajizGgd/SLbIpVgJy4P58PJkFievV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4QRw/dJMcajizGgd/SLbIpVgJy4P58PJkFievV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4QRw%2FdJMcajizGgd%2FSLbIpVgJy4P58PJkFievV1%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;93&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;93&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;p data-ke-size=&quot;size16&quot;&gt;다음 수식을 이용해서 $y_i$를 업데이트할 수 있다.&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.2 The Crowding Problem&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 저자는 다음 문제를 제기한다. Dimensionality mismatch문제이다. 우리가 10차원에서 2차원으로 압축한다고 하자. 10차원에서 11 equidistant point가 존재한다. 그러나 2차원에서는 이를 모두 표현할 수 없다. 따라서 SNE는 원래 차원에서 적당히 떨어진 두 점이 저차원에서 너무 멀리 떨어져있게 되는 상황에서 그 작은 거리를 모사하기 위해 너무 크게 저차원에서 잡아당기는 효과가 생긴다. 따라서 이 문제를 해결하기 위해 t-SNE를 도입하였다.&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.3 Mistmatched Tails can Compensate for Mismatched Dimensionalities&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 문제를 해결하기 위해 제시된 것이 t-SNE다.&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;기존의 SNE는 고차원 거리를 가우시안 분포를 이용한 확률로 표현했다. t-SNE는 대신 student t-distribution with one degree of freedom (Cauchy distribution)을 저차원에 활용했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hvkcn/dJMcahE0WCY/HNlLiXkoAyHSuHoRrzMXZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hvkcn/dJMcahE0WCY/HNlLiXkoAyHSuHoRrzMXZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hvkcn/dJMcahE0WCY/HNlLiXkoAyHSuHoRrzMXZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHvkcn%2FdJMcahE0WCY%2FHNlLiXkoAyHSuHoRrzMXZ0%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;355&quot; height=&quot;100&quot; data-origin-width=&quot;355&quot; data-origin-height=&quot;100&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KagTL/dJMcaicX0oJ/6hxGSUK8nOllwjlz1k6bEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KagTL/dJMcaicX0oJ/6hxGSUK8nOllwjlz1k6bEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KagTL/dJMcaicX0oJ/6hxGSUK8nOllwjlz1k6bEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKagTL%2FdJMcaicX0oJ%2F6hxGSUK8nOllwjlz1k6bEk%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;480&quot; height=&quot;335&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;335&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가우시안 분포와 Cauchy 분포를 비교해보면 후자의 tail이 더 무겁다는 것을 알 수 있다. 이 특성 때문에 고차원의 moderate distance가 저차원에서 아주 큰 거리여도 괜찮도록 허용한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buMwKP/dJMcacReuqz/ID0cnjR8ivr92X4kJcwRuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buMwKP/dJMcacReuqz/ID0cnjR8ivr92X4kJcwRuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buMwKP/dJMcacReuqz/ID0cnjR8ivr92X4kJcwRuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuMwKP%2FdJMcacReuqz%2FID0cnjR8ivr92X4kJcwRuK%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;1054&quot; height=&quot;460&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;460&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;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;885&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ACrYp/dJMcahZkefJ/QWt15DfSl324fBa7BfPxLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ACrYp/dJMcahZkefJ/QWt15DfSl324fBa7BfPxLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ACrYp/dJMcahZkefJ/QWt15DfSl324fBa7BfPxLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FACrYp%2FdJMcahZkefJ%2FQWt15DfSl324fBa7BfPxLK%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;885&quot; height=&quot;465&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;465&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;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 업데이트 알고리즘고 기술했으나 실제로는 좀 더 테크닉이 들어가긴 한다. (strong long-range forces라고 해서 비슷한 포인트들의 클러스터가 갑자기 초기에 멀어지면 이를 당기기 위한 force를 추가한다.)&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Experiments&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MNIST data (0부터 9 숫자로 이루어진 그림데이터셋)을 다음과 같이 저차원으로 보일 수 있다.&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;706&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AF2dy/dJMcab5UJ9W/HACEvEjjGB7VVakYzy2Xr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AF2dy/dJMcab5UJ9W/HACEvEjjGB7VVakYzy2Xr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AF2dy/dJMcab5UJ9W/HACEvEjjGB7VVakYzy2Xr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAF2dy%2FdJMcab5UJ9W%2FHACEvEjjGB7VVakYzy2Xr1%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;706&quot; height=&quot;607&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;607&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤에 다른 dimensionality reduction 과 비교한 것도 있고 (t-SNE 퍼포먼스가 가장 좋음) discussion도 있는데 그건 관심있는 분들이 참고하시길!&lt;/p&gt;</description>
      <category>연구 Research/인공지능 Artificial Intelligent</category>
      <category>데이터과학</category>
      <category>인공지능</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/532</guid>
      <comments>https://normal-engineer.tistory.com/532#entry532comment</comments>
      <pubDate>Wed, 8 Jul 2026 10:24:38 +0900</pubDate>
    </item>
    <item>
      <title>[코드] JAX-FEM 설명</title>
      <link>https://normal-engineer.tistory.com/530</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2023년에 배포된 라이브러리인 JAX-FEM에서 Sensitivity analysis를 어떻게 하는지 설명하고자 한다.&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;div&gt;
&lt;div&gt;Xue, T. &lt;i&gt;et al.&lt;/i&gt; JAX-FEM: A differentiable GPU-accelerated 3D finite element solver for automatic inverse design and mechanistic data science. &lt;i&gt;Computer Physics Communications&lt;/i&gt; &lt;b&gt;291&lt;/b&gt;, 108802 (2023).&lt;/div&gt;
&lt;/div&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;Inverse design 문제를 푸는 것은 주로 topology optimization (TO)이라고도 표현하는데, 이 때 목적함수에 대한 gradient 값을 계산해야한다. 일반적으로 TO 문제는 Adjoint method를 통해 forward simulation &amp;amp; backward simulation 두 번으로 gradient 값을 효율적으로 계산하게 된다.&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;1. Problem formulation of topology optimization&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\min \quad J(U,\theta) \text{ s.t. } C(U,\theta)=0$$&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;문제 정의는 다음과 같이 $U\in R^N$가 &lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;finite element solution vector (the physical response)이고 $\theta \in R^M$가 design parameters일 때 PDE constraint $C(U,\theta)=0$ 하에서 $J(U,\theta)$를 최대화 (또는 최소화)하는 문제이다.&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;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;2. Adjoint method + JAX-FEM의 방식&lt;/span&gt;&lt;/b&gt;&lt;/h2&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: #ffffff; color: #303030; text-align: start;&quot;&gt;다음 문제에서 $U(\theta)$는 PDE를 풀면 나오는 implicit function이라고 볼 수 있다. 따라서,&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;&lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;$$\min \hat{J}(\theta) \quad \text{s.t.} \hat{J}(\theta)=(U(\theta),\theta)$$ 문제를 푸는 것이라고 할 수 있다. 우리가 원하는 gradient를 알기 위해서 다음과 같이 total derivative를 구한다.&lt;/span&gt;&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;316&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q8zAh/dJMcadPHrpT/MY5CrbghwEf3JeSfnUpZTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q8zAh/dJMcadPHrpT/MY5CrbghwEf3JeSfnUpZTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q8zAh/dJMcadPHrpT/MY5CrbghwEf3JeSfnUpZTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ8zAh%2FdJMcadPHrpT%2FMY5CrbghwEf3JeSfnUpZTK%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;316&quot; height=&quot;100&quot; data-origin-width=&quot;316&quot; data-origin-height=&quot;100&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;p data-ke-size=&quot;size16&quot;&gt;$\frac{dU}{d\theta}$는 implicit function thoerem으로 존재한다고 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 앞서 보인 constraint $C(U,\theta)=0$를 양변에 미분을 취하면 다음 식을 얻을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZkTTp/dJMcacQPm4S/XPFXBaAPbe2NNQVKoDwoLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZkTTp/dJMcacQPm4S/XPFXBaAPbe2NNQVKoDwoLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZkTTp/dJMcacQPm4S/XPFXBaAPbe2NNQVKoDwoLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZkTTp%2FdJMcacQPm4S%2FXPFXBaAPbe2NNQVKoDwoLK%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;369&quot; height=&quot;90&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;위 두 식을 종합하면&lt;/span&gt;&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;493&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXeHGr/dJMcaaZNevR/ZKxALDQEg2Ayx7kufjIsJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXeHGr/dJMcaaZNevR/ZKxALDQEg2Ayx7kufjIsJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXeHGr/dJMcaaZNevR/ZKxALDQEg2Ayx7kufjIsJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXeHGr%2FdJMcaaZNevR%2FZKxALDQEg2Ayx7kufjIsJK%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;493&quot; height=&quot;171&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;171&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;다음과 같이 식이 유도된다. 일반적인 adjoint method는 위 식에서 adjoint PDE라고 표시된 부분을 어떤 변수 $\lambda$라고 두고 adjoint PDE를 시뮬레이션 하면 $\lambda$를 구할 수 있고, $\partial C/\partial \theta$는 원래 의도했던 시뮬레이션을 통해 구할 수 있다. 따라서 둘을 결합해서 최종적으로 좌변 결과($d\hat{J}/d\theta$)를 구하게 된다. (마지막 term인 $\partial J/\partial \theta$는 $J$의 definition을 통해 구할 수 있다.)&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;&lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;이 논문에서는 tangent linear PDE로 언급을 하는데, adjoint PDE를 풀어서 구하나, tangent linear PDE를 풀어서 구하나 결과는 동일하지만 computation 관점에서 뭐가 더 유리한지는 다르다. Design parameters의 수가 클 수록 adjoint PDE 방법을 쓰는 게 낫다.&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;&lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;다음과 같은 adjoint variable $\lambda \in R^N$를 정의한다.&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;237&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkO4ML/dJMcagFLtmy/oK0TMwav5BdmbhkHiVGD70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkO4ML/dJMcagFLtmy/oK0TMwav5BdmbhkHiVGD70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkO4ML/dJMcagFLtmy/oK0TMwav5BdmbhkHiVGD70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkO4ML%2FdJMcagFLtmy%2FoK0TMwav5BdmbhkHiVGD70%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;237&quot; height=&quot;103&quot; data-origin-width=&quot;237&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;이 PDE는 linear PDE이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #303030;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;일반적으로는 $\partial C/\partial \theta$에 대한 expression을 직접 구하는데 이 과정이 지루하고 실수할 가능성이 많아 JAX-FEM에서는 JAX의 VJP 기능으로 자동으로 계산하도록 했다.&amp;nbsp;&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;&lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;다음과 같은 알고리즘을 적용할 때 result로 나오는 것이 $\lambda^* \frac{\partial C}{\partial \theta}$(위 식에서 Hermitian 적용한 것)&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;1252&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wMasL/dJMcajvFyE1/vbUCXymTYjzx40pOD3WwGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wMasL/dJMcajvFyE1/vbUCXymTYjzx40pOD3WwGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wMasL/dJMcajvFyE1/vbUCXymTYjzx40pOD3WwGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwMasL%2FdJMcajvFyE1%2FvbUCXymTYjzx40pOD3WwGK%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;1252&quot; height=&quot;258&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;258&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;p&gt;&lt;span style=&quot;color: #303030;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;위 코드에서 v가 adjoint 값이고 vec_jac_prod에 adjoint 값을 넣으면 JAX 내에서 효율적으로 $\lambda^* \frac{\partial C}{\partial \theta}$를 계산한다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #303030;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;누군가는 이렇게 물어볼 수 있다. 어차피 adjoint 값($\lambda$)이 있고 $\frac{\partial C}{\partial \theta}$가 있으면 따로따로 계산해서 곱하면 되지 않을까? 이는 컴퓨터 계산과 관련이 있다. &lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;$\lambda^* \frac{\partial C}{\partial \theta}$는 사실 상 $R^M$ 벡터이다. 개별적으로 두 값을 곱하면 Explicit하게 $R^N$ 크기의 $\lambda$와 Matrix인 $\frac{\partial C}{\partial \theta}$를 곱해야한다. 이 때 matrix를 구하기 위한 컴퓨터 계산에서 비효율이 발생한다. 모든 계산에서 matrix 계산을 반복해야하기 때문이다. 따라서 벡터와 행렬 계산으로 이루어질 수 있도록 $\lambda^* \frac{\partial C}{\partial \theta}$를 다이렉트로 계산하는 게 빠르다.&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&gt;&lt;span style=&quot;color: #303030;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #303030; text-align: start;&quot;&gt;하여튼 이러한 workflow로 $\partial \hat{J}/\partial \theta$를 구해 최적화 문제에 활용할 수 있다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lqS10/dJMcaaZNeIj/ip5MXSe5WAYwFLEsZ4X1X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lqS10/dJMcaaZNeIj/ip5MXSe5WAYwFLEsZ4X1X1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lqS10/dJMcaaZNeIj/ip5MXSe5WAYwFLEsZ4X1X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlqS10%2FdJMcaaZNeIj%2Fip5MXSe5WAYwFLEsZ4X1X1%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;1372&quot; height=&quot;400&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;400&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;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;3. 정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAX-FEM은 Adjoint method를 통해 TO를 하는 게 맞으나, 이 Adjoint 방정식을 풀 때 JAX의 기능을 활용해 자동으로 푼다고 할 수 있다. 이는 직접적인 수식 유도에 비해 효율적이라는 장점이 있다.&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;(이 코드를 직접 써본 분 말로는 JIT을 활용할 수 없는 구조라서 좀 느리다고 하던데 내가 직접 해보지는 않아서 모르겠다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>연구 Research/최적화 Optimization</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/530</guid>
      <comments>https://normal-engineer.tistory.com/530#entry530comment</comments>
      <pubDate>Tue, 2 Jun 2026 03:30:01 +0900</pubDate>
    </item>
    <item>
      <title>[인공지능] Generative AI (1) Normalizing flows</title>
      <link>https://normal-engineer.tistory.com/529</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generative modeling에서 GAN 이후로 다양한 모델이 나왔는데 현재도 그 모델 안에서 발전 중이다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 이야기는 Normalizing flows에 대한 이야기이다. 정확히 이게 뭔지를 알아야 나중에 discrete normalizing flows에서 continuous normalizing flows로 넘어가는 걸 이해할 수 있다. 사실 이전에 Variational autoencoder를 또 이해해야하는 문제인데 그건 나중에 작성해서 여기에 링크를 남길 예정이다.&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;b&gt;흐름&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;normalizing flows (Ordinary differential equation model) (2016) - diffusion models (Stochastic differential equation models) - flow matching (how to train scalable continuous models) (2023)&lt;/blockquote&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;br /&gt;&lt;b&gt;0. Generative model이란 무엇인가? &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Generative&amp;nbsp;model은&amp;nbsp;sample을&amp;nbsp;생성하는&amp;nbsp;machine&amp;nbsp;learning&amp;nbsp;model이다. &lt;br /&gt;&lt;br /&gt;Dataset&amp;nbsp;(z_1,\ldots,z_N&amp;nbsp;\sim&amp;nbsp;p_{data})가&amp;nbsp;주어졌을&amp;nbsp;때, &lt;br /&gt;&lt;br /&gt;$$ &lt;br /&gt;z&amp;nbsp;\sim&amp;nbsp;p_{data} &lt;br /&gt;$$ &lt;br /&gt;&lt;br /&gt;를&amp;nbsp;생성하는&amp;nbsp;것이&amp;nbsp;목표이다. &lt;br /&gt;&lt;br /&gt;만약&amp;nbsp;text&amp;nbsp;prompt와&amp;nbsp;같은&amp;nbsp;conditioning&amp;nbsp;variable&amp;nbsp;(y)가&amp;nbsp;존재한다면, &lt;br /&gt;&lt;br /&gt;$$ &lt;br /&gt;z&amp;nbsp;\sim&amp;nbsp;p_{data}(\cdot|y) &lt;br /&gt;$$ &lt;br /&gt;&lt;br /&gt;를&amp;nbsp;생성하는&amp;nbsp;conditional&amp;nbsp;generative&amp;nbsp;model이&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&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;br /&gt;Normalizing&amp;nbsp;flow는&amp;nbsp;&amp;ldquo;invertible&amp;nbsp;transformation을&amp;nbsp;이용한&amp;nbsp;change&amp;nbsp;of&amp;nbsp;variables&amp;rdquo;로&amp;nbsp;설명할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;그렇다면&amp;nbsp;왜&amp;nbsp;variable을&amp;nbsp;바꾸어야&amp;nbsp;할까? &lt;br /&gt;&lt;br /&gt;생성&amp;nbsp;모델은&amp;nbsp;정답이&amp;nbsp;하나로&amp;nbsp;정해져&amp;nbsp;있지&amp;nbsp;않은&amp;nbsp;문제와&amp;nbsp;유사하다.&amp;nbsp;우리는&amp;nbsp;다양한&amp;nbsp;sample들을&amp;nbsp;생성하고&amp;nbsp;싶기&amp;nbsp;때문에,&amp;nbsp;일반적인&amp;nbsp;noise&amp;nbsp;distribution으로부터&amp;nbsp;우리가&amp;nbsp;원하는&amp;nbsp;복잡한&amp;nbsp;data&amp;nbsp;distribution으로&amp;nbsp;변환하는&amp;nbsp;과정이&amp;nbsp;필요하다. &lt;br /&gt;&lt;br /&gt;즉,&amp;nbsp;랜덤하게&amp;nbsp;sampling한&amp;nbsp;(x)를&amp;nbsp;우리가&amp;nbsp;원하는&amp;nbsp;데이터&amp;nbsp;분포를&amp;nbsp;따르는&amp;nbsp;(z)로&amp;nbsp;변환하고&amp;nbsp;싶은&amp;nbsp;것이다. &lt;br /&gt;&lt;br /&gt;$$ &lt;br /&gt;x&amp;nbsp;\sim&amp;nbsp;p_{init} &lt;br /&gt;\quad&amp;nbsp;\rightarrow&amp;nbsp;\quad &lt;br /&gt;\text{(generative&amp;nbsp;model)} &lt;br /&gt;\quad&amp;nbsp;\rightarrow&amp;nbsp;\quad &lt;br /&gt;z&amp;nbsp;\sim&amp;nbsp;p_{data} &lt;br /&gt;$$ &lt;br /&gt;&lt;br /&gt;우리는&amp;nbsp;이미&amp;nbsp;(p_{init})을&amp;nbsp;알고&amp;nbsp;있다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;(\mathcal{N}(0,I_d))와&amp;nbsp;같은&amp;nbsp;단순한&amp;nbsp;distribution이며&amp;nbsp;sampling도&amp;nbsp;쉽다. &lt;br /&gt;&lt;br /&gt;반면,&amp;nbsp;(p_{data})는&amp;nbsp;매우&amp;nbsp;복잡한&amp;nbsp;distribution이고,&amp;nbsp;우리는&amp;nbsp;dataset&amp;nbsp;(z_1,\ldots,z_N)와&amp;nbsp;같은&amp;nbsp;일부&amp;nbsp;sample만&amp;nbsp;알고&amp;nbsp;있는&amp;nbsp;상황이다. &lt;br /&gt;&lt;br /&gt;따라서 normalizing flow를 학습하여 이러한 distribution을 modeling한다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;&lt;b&gt;2. &amp;ldquo;Discrete&amp;rdquo; normalizing flow의 formulation &lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;더&amp;nbsp;자세한&amp;nbsp;내용: &lt;br /&gt;Rezende&amp;nbsp;and&amp;nbsp;Mohamed&amp;nbsp;2016;&amp;nbsp;Dinh,&amp;nbsp;Krueger,&amp;nbsp;and&amp;nbsp;Bengio&amp;nbsp;2015;&amp;nbsp;Dinh,&amp;nbsp;Sohl-Dickstein,&amp;nbsp;and&amp;nbsp;Bengio&amp;nbsp;2017 &lt;br /&gt;&lt;br /&gt;모델은 다음과 같이 주어진다. $x=f_i(z), \quad z=f_i^{-1}(x)$와 같이 변수를 변환하는 mapping $f$가 있다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 mapping이 계속 모여서 $f$를 만들 때 이 mapping의 누적으로 만들어지는 확률 분포는 다음과 같다.&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;br /&gt;$$ &lt;br /&gt;p(x) &lt;br /&gt;=p(z) &lt;br /&gt;\left| &lt;br /&gt;\det &lt;br /&gt;\frac{\partial&amp;nbsp;f^{-1}}{\partial&amp;nbsp;x} &lt;br /&gt;\right| &lt;br /&gt;$$ &lt;br /&gt;&lt;br /&gt;여기서 &lt;br /&gt;&lt;br /&gt;$$ &lt;br /&gt;f&amp;nbsp;=&amp;nbsp;f_K&amp;nbsp;\circ&amp;nbsp;\cdots&amp;nbsp;\circ&amp;nbsp;f_1 &lt;br /&gt;$$ &lt;br /&gt;&lt;br /&gt;이다. &lt;br /&gt;&lt;br /&gt;이는&amp;nbsp;invertible&amp;nbsp;transformation들의&amp;nbsp;chain이다.&amp;nbsp;각&amp;nbsp;layer는&amp;nbsp;invertible해야&amp;nbsp;하며&amp;nbsp;tractable한&amp;nbsp;Jacobian&amp;nbsp;determinant를&amp;nbsp;가져야&amp;nbsp;한다.또한&amp;nbsp;log-density는&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;표현된다. &lt;br /&gt;&lt;br /&gt;$$ &lt;br /&gt;\log&amp;nbsp;p(x) &lt;br /&gt;= \log p(z_0)&lt;br /&gt;\sum_{k=1}^{K} &lt;br /&gt;\log &lt;br /&gt;\left| &lt;br /&gt;\det&amp;nbsp;J_{f_k}(z_{k-1}) &lt;br /&gt;\right| &lt;br /&gt;$$ &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;모델은&amp;nbsp;다음&amp;nbsp;조건들을&amp;nbsp;만족해야&amp;nbsp;한다. &lt;br /&gt;&lt;br /&gt;*&amp;nbsp;Input과&amp;nbsp;output의&amp;nbsp;dimension이&amp;nbsp;동일해야&amp;nbsp;한다. &lt;br /&gt;*&amp;nbsp;Transformation이&amp;nbsp;invertible해야&amp;nbsp;한다. &lt;br /&gt;*&amp;nbsp;Jacobian&amp;nbsp;determinant&amp;nbsp;계산이&amp;nbsp;efficient하고&amp;nbsp;differentiable해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 $x,z$ 변수들이 deterministic하게 정해진다는 것도 특징이다.&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;3. normalizing flow 예시&lt;/b&gt;&lt;/h2&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;br /&gt;(f_k)를&amp;nbsp;modeling하는&amp;nbsp;방법은&amp;nbsp;매우&amp;nbsp;다양하다.&amp;nbsp;Neural&amp;nbsp;network&amp;nbsp;기반으로는&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;mapping&amp;nbsp;(f)를&amp;nbsp;modeling할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;&lt;br /&gt;$$ &lt;br /&gt;z_k &lt;br /&gt;= f_{\theta}(z_{k-1})=&lt;br /&gt;z_{k-1} &lt;br /&gt;+ &lt;br /&gt;u&amp;nbsp;h\left( &lt;br /&gt;\mathbf{w}^{\top}&amp;nbsp;z_{k-1}&amp;nbsp;+&amp;nbsp;b &lt;br /&gt;\right) &lt;br /&gt;$$ &lt;br /&gt;&lt;br /&gt;여기서&amp;nbsp;(u,w,b)는&amp;nbsp;trainable&amp;nbsp;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 다양한 모델링 방법이 있지만 현재 주로 쓰이는 것은 diffusion model과 flow matching이므로 빠르게 넘어가도록 한다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://deepgenerativemodels.github.io/notes/flow/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://deepgenerativemodels.github.io/notes/flow/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1778517571783&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Normalizing Flow Models&quot; data-og-description=&quot;If , then the mappings is volume preserving, which means that the transformed distribution will have the same &amp;ldquo;volume&amp;rdquo; compared to the original one .&quot; data-og-host=&quot;deepgenerativemodels.github.io&quot; data-og-source-url=&quot;https://deepgenerativemodels.github.io/notes/flow/&quot; data-og-url=&quot;https://deepgenerativemodels.github.io/notes/flow/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://deepgenerativemodels.github.io/notes/flow/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://deepgenerativemodels.github.io/notes/flow/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Normalizing Flow Models&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;If , then the mappings is volume preserving, which means that the transformed distribution will have the same &amp;ldquo;volume&amp;rdquo; compared to the original one .&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;deepgenerativemodels.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>연구 Research/인공지능 Artificial Intelligent</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/529</guid>
      <comments>https://normal-engineer.tistory.com/529#entry529comment</comments>
      <pubDate>Tue, 12 May 2026 01:43:54 +0900</pubDate>
    </item>
    <item>
      <title>[논문] Nature format 정리</title>
      <link>https://normal-engineer.tistory.com/528</link>
      <description>&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;Nature materials format 기준으로 설명한다. : &lt;a href=&quot;https://www.nature.com/nmat/submission-guidelines/aip-and-formatting&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nature.com/nmat/submission-guidelines/aip-and-formatting&lt;/a&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Document type&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LaTeX 기준 a&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;rticle.cls, revtex.cls or amsart.cls와 같은 class file 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- Computer Modern fonts를 사용할 것. Computer modern fonts : &lt;a href=&quot;https://www.fontsquirrel.com/fonts/computer-modern&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.fontsquirrel.com/fonts/computer-modern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- graphicx.sty 사용 - package graphicx를 import하면 됨.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- number로만 인용할 것. manuscript 안에 references가 포함되어야 함.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- bibtex를 쓰고 싶으면 \bibliography나 \bibliographystyle를 사용하지 말고 .bbl file을 사용할 것&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LaTeX support : &lt;a href=&quot;https://www.springernature.com/gp/authors/campaigns/latex-author-support&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.springernature.com/gp/authors/campaigns/latex-author-support&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775166104924&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;LaTeX author support | Publish your research | Springer Nature&quot; data-og-description=&quot;Still having problems? If you cannot find the answer you need here, or in the FAQs, please contact the editorial office for the journal you are submitting to in the first instance. To help them help you please try and include the following information with&quot; data-og-host=&quot;www.springernature.com&quot; data-og-source-url=&quot;https://www.springernature.com/gp/authors/campaigns/latex-author-support&quot; data-og-url=&quot;https://www.springernature.com/gp/authors/campaigns/latex-author-support&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.springernature.com/gp/authors/campaigns/latex-author-support&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.springernature.com/gp/authors/campaigns/latex-author-support&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;LaTeX author support | Publish your research | Springer Nature&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Still having problems? If you cannot find the answer you need here, or in the FAQs, please contact the editorial office for the journal you are submitting to in the first instance. To help them help you please try and include the following information with&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.springernature.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;2. Table&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- Table은 맨 뒤에 첨부&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- Complex tables은 별도의 엑셀파일로 제출&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- 데이터에 대한 통계적 분석이 포함된 경우 standards of error analysis and range를 table legend에 설명해야한다. (이게 무슨 말이지?)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- chemical structure가 포함된 table은 문서 끝에 native ChemDraw 파일을 포함할 것&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;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;3. Figures&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;figure는 따로 guideline이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;&lt;a href=&quot;https://www.nature.com/documents/NRJs-guide-to-preparing-final-artwork.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nature.com/documents/NRJs-guide-to-preparing-final-artwork.pdf&lt;/a&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;이 글에 대한 거는 따로 작성한다.&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;Images&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 figures들은 Fig.1, Fig.2와 같은 형태로 순서대로 인용되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Figure panels들은 minimum resolution이 300dpi이다. maximum width 180mm. (벡터 이미지면 문제 없다. 어차피 png로 export할 때 dpi를 정할 수 있기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 5-7pt san serif 폰트 사용 / Greek 문자는 Symbol font로 사용. - 보통 Arial 사용하면 문제 없다.&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;1500&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBLkFe/dJMcaiCOlf4/dDSQzkTIcrElX3s4ASHB81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBLkFe/dJMcaiCOlf4/dDSQzkTIcrElX3s4ASHB81/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBLkFe/dJMcaiCOlf4/dDSQzkTIcrElX3s4ASHB81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBLkFe%2FdJMcaiCOlf4%2FdDSQzkTIcrElX3s4ASHB81%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;1500&quot; height=&quot;901&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222; letter-spacing: 0px;&quot;&gt;- scale bars를 사용하라. error bars가 필요하면 사용 가능.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- labelling이나 scale/error bars를 flatten하지 말라는데 무슨 말이지?&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Figure legends&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 각 figure마다 brief title + a short description of each panel 포함&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- legend가 article type의 word limit을 넘기면 안됨.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- methodological detail은 쓰지 마라.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;- 심볼이나 visual cue를 쓰지 말고 오직 말로만 설명해라.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외 이미지에 대한 내용은 화학쪽이나 high resolution image가 많이 쓰이는 분야에 대한 내용이다.&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;4는 colour charges라 해서 실물로 출판되는 저널에 한해서 컬러로 출력하고 싶으면 돈을 더 내라는 얘기다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;5. References&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Main text&lt;/li&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Figure legends&lt;/li&gt;
&lt;li&gt;Box&lt;/li&gt;
&lt;li&gt;Methods&lt;/li&gt;
&lt;li&gt;Data Availability Section&lt;/li&gt;
&lt;li&gt;Extended data&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 순서대로 references 순서가 매겨져야 한다.&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;- each reference 당 하나의 출판물만 제시되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 연구 출판물의 경우 DOI가 있으므로 이것도 같이 적어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 출판되지 않은 미팅 초록이나 리뷰 중인 논문은 레퍼런스 목록에 없어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- URLs은 괄호 안에 넣어서 인용하고 레퍼런스 목록에는 제외한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- grant details이나 acknowledgements은 레퍼런스 목록에 넣지 마라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- footnotes는 지원하지 않음.&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;&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 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;For long-form manuscripts such as Articles, Letters, Review Articles, Perspectives and Progress Articles, titles of cited articles are required.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Example:&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Eigler, D. M. &amp;amp; Schweizer, E. K. Positioning single atoms with a scanning tunnelling microscope.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Nature&lt;span&gt;&amp;nbsp;&lt;/span&gt;344, 524&amp;ndash;526 (1990).&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;For shorter article types such as Commentaries or News &amp;amp; Views, titles of cited articles are not included.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Example:&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Iijima, S.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Nature&lt;span&gt;&amp;nbsp;&lt;/span&gt;354, 56&amp;ndash;58 (1991).&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;For book citations, the publisher is required.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Example:&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Jones, R. A. L.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Soft Machines: Nanotechnology and Life&lt;span&gt;&amp;nbsp;&lt;/span&gt;Ch. 3 (Oxford Univ. Press, 2004).&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Data and code may be cited in the reference list if they have been assigned DOIs and should include authors, title, publisher (repository name) and&amp;nbsp;DOI expressed as a URL.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Example:&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Hao, Z., AghaKouchak, A., Nakhjiri, N. &amp;amp; Farahmand, A. Global Integrated Drought Monitoring and Prediction System (GIDMaPS) data sets. figshare&amp;nbsp;&lt;a href=&quot;http://dx.doi.org/10.6084/m9.figshare.853801&quot;&gt;http://dx.doi.org/10.6084/m9.figshare.853801&lt;/a&gt;&amp;nbsp;(2014).&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;To cite a preprint&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Example:&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Babichev, S. A., Ries, J. &amp;amp; Lvovsky, A. I. Quantum scissors: teleportation of single-mode optical states by means of a nonlocal single photon. Preprint at &lt;a href=&quot;https://arXiv.org/quant-ph/0208066&quot;&gt;https://arXiv.org/quant-ph/0208066&lt;/a&gt; (2002).&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. Methods&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;methods는 short, bold headings으로 분리되어야 한다. 추가적인 reference가 필요할 경우 main paper 레퍼런스의 뒤에 들어가게 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;좀 신기한 것은 protocol을 다음 웹사이트에 제출하라고 한다. &lt;a href=&quot;https://www.protocols.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.protocols.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1775167340713&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Bring structure to your research - protocols.io&quot; data-og-description=&quot;A secure platform for developing and sharing reproducible methods.&quot; data-og-host=&quot;www.protocols.io&quot; data-og-source-url=&quot;https://www.protocols.io/&quot; data-og-url=&quot;https://www.protocols.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kILbw/dJMb8RRSgH5/uzRMtvZZBFFQmTaRPjvuKK/img.jpg?width=1920&amp;amp;height=1550&amp;amp;face=0_0_1920_1550,https://scrap.kakaocdn.net/dn/lOkTi/dJMb8XR53eK/Eai978qKnWonubrQpuDbok/img.jpg?width=1920&amp;amp;height=1550&amp;amp;face=0_0_1920_1550,https://scrap.kakaocdn.net/dn/AeuFI/dJMb8Rj2i5q/Aa9BIeygI3G78WFfoQU2sK/img.jpg?width=600&amp;amp;height=751&amp;amp;face=242_124_394_290&quot;&gt;&lt;a href=&quot;https://www.protocols.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.protocols.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kILbw/dJMb8RRSgH5/uzRMtvZZBFFQmTaRPjvuKK/img.jpg?width=1920&amp;amp;height=1550&amp;amp;face=0_0_1920_1550,https://scrap.kakaocdn.net/dn/lOkTi/dJMb8XR53eK/Eai978qKnWonubrQpuDbok/img.jpg?width=1920&amp;amp;height=1550&amp;amp;face=0_0_1920_1550,https://scrap.kakaocdn.net/dn/AeuFI/dJMb8Rj2i5q/Aa9BIeygI3G78WFfoQU2sK/img.jpg?width=600&amp;amp;height=751&amp;amp;face=242_124_394_290');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bring structure to your research - protocols.io&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A secure platform for developing and sharing reproducible methods.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.protocols.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 bio, chem 분야에서 필요한 듯하다.&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;7. Acknowledgements&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧게 작성. referees 나 editors에 대한 감사는 제외. Grant나 contribution numbers는 괜찮음.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8. Extended data figures&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main paper에 포함된 data에 필요한 background를 제공해주는 figures들.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #222222; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;62&quot; data-start=&quot;0&quot; data-section-id=&quot;96eqcv&quot;&gt;최대 10개의 Extended Data 표시용 그림(display figures)까지 허용&lt;/li&gt;
&lt;li data-end=&quot;183&quot; data-start=&quot;63&quot; data-section-id=&quot;1d12bei&quot;&gt;&lt;b&gt;Extended Data 그림은&lt;/b&gt; Nature Materials에서 복사 편집(copy-edit)이나 스타일 편집을 하지 않으므로, 그림을 준비할 때 &lt;b&gt;가능한 한 저널 스타일로 그리기&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;271&quot; data-start=&quot;184&quot; data-section-id=&quot;1ynwckf&quot;&gt;필요할 경우 그림은 여러 패널(multi-paneled)로 구성할 수 있으며, &lt;b&gt;단일 PDF 페이지에 들어가도록 크기를 조정&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;405&quot; data-start=&quot;272&quot; data-section-id=&quot;1mionr7&quot;&gt;Extended Data 그림의 범례(legend)는 본문 그림과 동일한 방식으로 작성해야 하며, &lt;b&gt;&amp;lsquo;Inventory of Supporting Information&amp;rsquo; 문서 포함되어야 함&lt;/b&gt;&lt;/li&gt;
&lt;li data-is-last-node=&quot;&quot; data-end=&quot;475&quot; data-start=&quot;406&quot; data-section-id=&quot;3zl7um&quot;&gt;모든 &lt;b&gt;Extended Data 그림은 본문(main text)에서 적절한 위치에 개별 항목으로 참조&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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;10. Supplementary information (SI)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SI는 제출된 그대로 게시되므로 명확하고 간결하게, 논리적으로 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 용어가 본문과 일관되어야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SI는 모든 항목이 순차적으로 번호를 매기고 본문이나 Extended data와 별도로 번호를 매긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Supplementary figure는 해당 결과를 extended data로 제시하는 게 적절하지 않을 경우에만 사용한다. 범례 포함 하나의 pdf 페이지 안에 들어가도록 만들고, 다른 supplementary information을 포함할 경우 최소한으로만 넣어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Figures, Tables, Videos에 제목과 캡션이 있어야하고 이 제목, 캡션은 본문의 룰과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방법론적인 정보는 가능한 본문에 포함한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- (이건 좀 중요한 부분!) SI 항목은 본문 또는 Methods 섹션에서 최소 한 번 이상 반드시 참조되어야 한다. 반드시 Supplementary라는 단어를 포함해야하며 순서대로 인용해야 한다. 첨언하자면 이럴 경우에는 supplementary 내용을 그냥 본문 인용을 기준으로 배치하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 통합된 pdf로 제출하되, 복잡한 표나 데이터는 csv 형식으로 제출하는 것도 허용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소프트웨어는 zip 또는 tar 파일로 제출&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;p data-ke-size=&quot;size16&quot;&gt;나머지는 좀 분야 specific하다. (bio, chem 분야는 링크 들어가서 다시 확인하는 게 좋을 듯)&lt;/p&gt;</description>
      <category>기타/논문작성 Writing</category>
      <category>논문</category>
      <category>연구</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/528</guid>
      <comments>https://normal-engineer.tistory.com/528#entry528comment</comments>
      <pubDate>Fri, 3 Apr 2026 07:17:46 +0900</pubDate>
    </item>
    <item>
      <title>[Acoustics] Dispersion relation</title>
      <link>https://normal-engineer.tistory.com/527</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계진동학을 공부했지만 acoustics를 전혀 몰라서 작성하는 글.&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;dispersion relation in acoustics는 wave frequency가 어떻게 wave number와 연관이 되어있느냐, 주파수에 따라 sound waves가 어떻게 빨리 전달되느냐에 대한 정보이다.&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;나는 항상 wave frequency = wave number라고 생각했기 때문이다.&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;dispersion relation은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\omega = \omega(k)$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 $\omega$는 angular frequency, $k$는 wave number이다. 이를 wave propagation behavior라고 한다.&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;phase velocity(speed of individual wave crests) 는 $c_p=\omega/k$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;group velocity(speed of energy)는 $c_g=d\omega/dk$&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) Non-dispersive acoustics&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Non-dispersive acoustics, 예를 들면 공기 중 소리 전파는 다음과 같은 관계를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\omega=ck$$&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;즉, wave number와 angular frequency가 선형관계를 갖는다. 따라서 나의 기존 생각은 일반적인 공기 중 소리 전파를 생각했기 때문이다. 공기 중에서 소리의 wave velocity는 어느 주파수에서든 동일하다. 위에서 정의한 대로 $c_p$를 구하든, $c_g$를 구하든 위 관계식에서는 $c_p=c_g=c$로 계산할 수 있다.&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;2) Dispersive acoustics&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dispersive acoustics의 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\omega \neq ck$$의 관계를 갖는다. 즉, wave number에 따라 frequency가 달라진다.&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;373&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBKQbZ/dJMcaiCHEkT/rerOEHiXKkpJALZ5oXtkq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBKQbZ/dJMcaiCHEkT/rerOEHiXKkpJALZ5oXtkq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBKQbZ/dJMcaiCHEkT/rerOEHiXKkpJALZ5oXtkq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBKQbZ%2FdJMcaiCHEkT%2FrerOEHiXKkpJALZ5oXtkq0%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;373&quot; height=&quot;349&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;349&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;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 data-end=&quot;1518&quot; data-start=&quot;1493&quot; data-section-id=&quot;loui4t&quot;&gt;slope &amp;rarr; wave velocity&lt;/li&gt;
&lt;li data-end=&quot;1545&quot; data-start=&quot;1519&quot; data-section-id=&quot;9m5ra5&quot;&gt;flat band &amp;rarr; slow waves&lt;/li&gt;
&lt;li data-end=&quot;1575&quot; data-start=&quot;1546&quot; data-section-id=&quot;10e0vaa&quot;&gt;band gap &amp;rarr; no propagation&lt;/li&gt;
&lt;li data-end=&quot;1620&quot; data-start=&quot;1576&quot; data-section-id=&quot;kuglzr&quot;&gt;negative slope &amp;rarr; negative group velocity&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>기계공학 Mechanical engineering</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/527</guid>
      <comments>https://normal-engineer.tistory.com/527#entry527comment</comments>
      <pubDate>Thu, 26 Mar 2026 00:10:32 +0900</pubDate>
    </item>
    <item>
      <title>[PCA] Principal Component Analysis (PCA) example code</title>
      <link>https://normal-engineer.tistory.com/526</link>
      <description>&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;Iris dataset (2d feature)로 PCA를 적용한 예시이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773261559637&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
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

# 1. Load sample data (Iris dataset)
data = load_iris()
X = data.data

# 2. Standardize the data (Mean=0, Variance=1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 3. Apply PCA (reduce to 2 components)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 4. Check results
print(f&quot;Original shape: {X.shape}&quot;)
print(f&quot;Reduced shape: {X_pca.shape}&quot;)
print(f&quot;Explained variance ratio: {pca.explained_variance_ratio_}&quot;)


import numpy as np

def pca_from_scratch(X, n_components):
    # Step 1: Mean Centering
    X_meaned = X - np.mean(X, axis=0)
    
    # Step 2: Compute Covariance Matrix
    cov_mat = np.cov(X_meaned, rowvar=False)
    
    # Step 3: Compute Eigenvalues and Eigenvectors
    eigen_values, eigen_vectors = np.linalg.eigh(cov_mat)
    
    # Step 4: Sort Eigenvalues and Eigenvectors in descending order
    sorted_index = np.argsort(eigen_values)[::-1]
    sorted_eigenvectors = eigen_vectors[:, sorted_index]
    
    # Step 5: Select top N components
    eigenvector_subset = sorted_eigenvectors[:, 0:n_components]
    
    # Step 6: Transform the data
    X_reduced = np.dot(X_meaned, eigenvector_subset)
    return X_reduced

# Example usage
X_scratch = pca_from_scratch(X, 2)&lt;/code&gt;&lt;/pre&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;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;640&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tEtA5/dJMcaa5zNnj/n3GUKiCgKy86FgKLAY5350/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tEtA5/dJMcaa5zNnj/n3GUKiCgKy86FgKLAY5350/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tEtA5/dJMcaa5zNnj/n3GUKiCgKy86FgKLAY5350/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtEtA5%2FdJMcaa5zNnj%2Fn3GUKiCgKy86FgKLAY5350%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;640&quot; height=&quot;502&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;502&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;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;pre id=&quot;code_1773261586842&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Visualize Principal Axes
plt.figure(figsize=(8, 6))

# Plot the data points
for color, i, target_name in zip(colors, [0, 1, 2], data.target_names):
    plt.scatter(X_pca[data.target == i, 0], X_pca[data.target == i, 1], 
                color=color, alpha=.8, lw=2, label=target_name)

# Plot principal axes
origin = [0, 0]
scale = np.sqrt(pca.explained_variance_)  # Scale by explained variance

for i, (component, var) in enumerate(zip(pca.components_, scale)):
    plt.arrow(origin[0], origin[1], 
              component[0] * var * 3, component[1] * var * 3,
              head_width=0.2, head_length=0.2, fc=f'C{i}', ec=f'C{i}', 
              linewidth=2.5, alpha=0.7, label=f'PC{i+1}')

plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA of IRIS Dataset with Principal Axes')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color='k', linewidth=0.5)
plt.axvline(x=0, color='k', linewidth=0.5)
plt.savefig(&quot;pca_iris_with_axes.eps&quot;)
plt.show()&lt;/code&gt;&lt;/pre&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;689&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FkW0K/dJMcagLvnE0/uAlCJ9RcsWQZZwLMh94Ia0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FkW0K/dJMcagLvnE0/uAlCJ9RcsWQZZwLMh94Ia0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FkW0K/dJMcagLvnE0/uAlCJ9RcsWQZZwLMh94Ia0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFkW0K%2FdJMcagLvnE0%2FuAlCJ9RcsWQZZwLMh94Ia0%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;689&quot; height=&quot;545&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>연구 Research/데이터과학 Data Science</category>
      <category>PCA</category>
      <category>머신러닝</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/526</guid>
      <comments>https://normal-engineer.tistory.com/526#entry526comment</comments>
      <pubDate>Thu, 12 Mar 2026 05:42:54 +0900</pubDate>
    </item>
    <item>
      <title>[클로드코드] Claude.code 자료 모음</title>
      <link>https://normal-engineer.tistory.com/525</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 AI를 활용한 코딩을 어떻게 할 것인가에 대한 논의가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode 내에서도 copilot을 이용할 수 있고, CURSOR라는 소프트웨어도 IDE와 AI를 통한 코드 작성을 합친 편한 기능을 제공했다.&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;Cursor의 등장 후에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI (chatGPT)에서는 &lt;a href=&quot;https://chatgpt.com/codex?utm_source=google&amp;amp;utm_medium=paid_search&amp;amp;utm_campaign=GOOG_M_SEM_GBR_Codex_TEM_BAU_ACQ_PER_MIX_ALL_NAMER_US_EN_111325&amp;amp;c_id=23226110534&amp;amp;c_agid=188421385415&amp;amp;c_crid=795598970763&amp;amp;c_kwid={keywordid}&amp;amp;c_ims=&amp;amp;c_pms=9199231&amp;amp;c_nw=g&amp;amp;c_dvc=c&amp;amp;gad_source=1&amp;amp;gad_campaignid=23226110534&amp;amp;gbraid=0AAAAA-I0E5dZ_5lFCKpMd5vbbrmG9b8Ii&amp;amp;gclid=Cj0KCQiA2bTNBhDjARIsAK89wlGj0_numPFN928KezHSf4emmBZ8WcyHXejY6Uu_uXFcJu7lPBAf2QAaAmuTEALw_wcB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CODEX&lt;/a&gt;를 출시하고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNGm2/dJMcafMzksx/dkRXuHCt3MtRRxe6FV6b1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNGm2/dJMcafMzksx/dkRXuHCt3MtRRxe6FV6b1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNGm2/dJMcafMzksx/dkRXuHCt3MtRRxe6FV6b1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNGm2%2FdJMcafMzksx%2FdkRXuHCt3MtRRxe6FV6b1k%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;1405&quot; height=&quot;856&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;856&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글(Gemini)에서는 &lt;a href=&quot;https://antigravity.google/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google antigravity&lt;/a&gt;를 출시했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uFwKS/dJMcafTjCbe/tKSTg5xjdaZo9GurasRBnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uFwKS/dJMcafTjCbe/tKSTg5xjdaZo9GurasRBnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uFwKS/dJMcafTjCbe/tKSTg5xjdaZo9GurasRBnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuFwKS%2FdJMcafTjCbe%2FtKSTg5xjdaZo9GurasRBnk%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;1646&quot; height=&quot;765&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;765&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 코드 편집을 위한 IDE와 AI를 같이 쓸 수 있는 프로그램이다.&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;color: #333333; text-align: start;&quot;&gt;이미 Cursor를 쓰고 있었고 꽤 만족하고 있었다.&lt;/span&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;클로드 코드는 터미널에서 코드를 편집할 수 있도록 한 프로그램으로, 현재 기준 pro 버전을 구독해야 쓸 수 있다. 보통은 IDE에서 코드를 편집하니, VSCODE나 CURSOR 등에서도 사용할 수 있다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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. Anthropic 회사에서 직접 만든 클로드 코드 강의 : &lt;a href=&quot;https://anthropic.skilljar.com/claude-code-in-action/303233&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://anthropic.skilljar.com/claude-code-in-action/303233&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Claude code 101 : &lt;a href=&quot;https://m1zz.github.io/ClaudeCode101/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://m1zz.github.io/ClaudeCode101/index.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772993469382&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Claude Code 101 &amp;mdash; 완전 입문 가이드&quot; data-og-description=&quot;설치부터 실전 프로젝트까지, AI 에이전틱 코딩 완전 정복&quot; data-og-host=&quot;m1zz.github.io&quot; data-og-source-url=&quot;https://m1zz.github.io/ClaudeCode101/index.html&quot; data-og-url=&quot;https://m1zz.github.io/ClaudeCode101/index.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ujst2/dJMb83SgSqg/uVV0DIVyjZKUBkD2sgkDEK/img.jpg?width=1125&amp;amp;height=1386&amp;amp;face=0_0_1125_1386&quot;&gt;&lt;a href=&quot;https://m1zz.github.io/ClaudeCode101/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://m1zz.github.io/ClaudeCode101/index.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ujst2/dJMb83SgSqg/uVV0DIVyjZKUBkD2sgkDEK/img.jpg?width=1125&amp;amp;height=1386&amp;amp;face=0_0_1125_1386');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code 101 &amp;mdash; 완전 입문 가이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;설치부터 실전 프로젝트까지, AI 에이전틱 코딩 완전 정복&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;m1zz.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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. &lt;a href=&quot;https://cc101.axwith.com/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cc101.axwith.com/ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772993720459&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;CC101 &amp;mdash; Claude Code 한국어 입문 가이드&quot; data-og-description=&quot;Claude Code 설치부터 CLAUDE.md, MCP, Skills, Hooks까지 &amp;mdash; 공식 문서 기반으로 쉽게 정리한 한국어 입문 가이드&quot; data-og-host=&quot;cc101.axwith.com&quot; data-og-source-url=&quot;https://cc101.axwith.com/ko&quot; data-og-url=&quot;https://cc101.axwith.com/ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BFXmN/dJMb9hCZmRV/zSsKSpYMxK8NeWdH0KtHsk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/rgLIS/dJMb9eTNJJq/s4lNgL21jHE5yctS3zkMf1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://cc101.axwith.com/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cc101.axwith.com/ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BFXmN/dJMb9hCZmRV/zSsKSpYMxK8NeWdH0KtHsk/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/rgLIS/dJMb9eTNJJq/s4lNgL21jHE5yctS3zkMf1/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;CC101 &amp;mdash; Claude Code 한국어 입문 가이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Claude Code 설치부터 CLAUDE.md, MCP, Skills, Hooks까지 &amp;mdash; 공식 문서 기반으로 쉽게 정리한 한국어 입문 가이드&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cc101.axwith.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍 Programming</category>
      <category>AI</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/525</guid>
      <comments>https://normal-engineer.tistory.com/525#entry525comment</comments>
      <pubDate>Mon, 9 Mar 2026 03:15:50 +0900</pubDate>
    </item>
    <item>
      <title>[Graphics] Signed distance fields / functions (SDFs)</title>
      <link>https://normal-engineer.tistory.com/524</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Signed distance fields (SDFs) / Signed distance functions&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;특정 점의 position을 입력으로 받으면 그 shape에서 가장 가까운 점으로부터의 거리를 알려주는 함수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 함수는 Finite element method에서처럼 explicit하게 어떤 위치에 어떤 점이 있는지를 나타내는 것이 아니기 때문에 implicit curves or surfaces라고 표현하기도 한다.&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;a href=&quot;https://numfactory.upc.edu/web/Geometria/signedDistances.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://numfactory.upc.edu/web/Geometria/signedDistances.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1772395074531&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Signed Distance Function (SDF): Implicit curves or surfaces&quot; data-og-description=&quot;Signed Distance Function (SDF): Implicit curves or surfaces A mathematical equation usually involves the relationship between several unknowns. For exemple: In this case, the relation between is implicit because none of then are expressed in terms of the o&quot; data-og-host=&quot;numfactory.upc.edu&quot; data-og-source-url=&quot;https://numfactory.upc.edu/web/Geometria/signedDistances.html&quot; data-og-url=&quot;https://numfactory.upc.edu/web/Geometria/signedDistances.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://numfactory.upc.edu/web/Geometria/signedDistances.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://numfactory.upc.edu/web/Geometria/signedDistances.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Signed Distance Function (SDF): Implicit curves or surfaces&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Signed Distance Function (SDF): Implicit curves or surfaces A mathematical equation usually involves the relationship between several unknowns. For exemple: In this case, the relation between is implicit because none of then are expressed in terms of the o&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;numfactory.upc.edu&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 사이트에서 SDFs의 예시를 가져왔다.&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;1. 2 Dimensional 일 때&lt;/b&gt;&lt;/h2&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-1. Circle&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;우리가 2d 공간에서 원을 정의할 때 다음과 같이 implicit function으로 나타낸다.&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-a)^2 + (y-b)^2 -1=0$$&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;이 원을 그리면 원점이 $(a,b)$이고 반지름이 1인 원임을 알 수 있다. 우리가 만약 d를 다음과 같이 정의한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$d(x,y) = (x-a)^2 + (y-b)^2 -1 $$&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;특정 점이 주어질 때 거리 $d$를 계산할 수 있다. 입력 점 좌표가 원 내부이면 음수, 외부이면 양수가 나온다.&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;560&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXTgI0/dJMcaih7EqI/uBEJAcA4VkLqKh6k2RSmm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXTgI0/dJMcaih7EqI/uBEJAcA4VkLqKh6k2RSmm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXTgI0/dJMcaih7EqI/uBEJAcA4VkLqKh6k2RSmm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXTgI0%2FdJMcaih7EqI%2FuBEJAcA4VkLqKh6k2RSmm1%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;560&quot; height=&quot;420&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;420&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;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;560&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yuUAK/dJMcahDveTu/jJru0UpFga245WsDBk2jkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yuUAK/dJMcahDveTu/jJru0UpFga245WsDBk2jkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yuUAK/dJMcahDveTu/jJru0UpFga245WsDBk2jkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyuUAK%2FdJMcahDveTu%2FjJru0UpFga245WsDBk2jkk%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;560&quot; height=&quot;420&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;420&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2. Segment&lt;/b&gt;&lt;/h3&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_{AB}$)이 주어질 때 어떠한 포인트 $(x,y)$를 주면 그 선분에 가장 가까운 거리를 구해야 한다.&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;$$S_{AB} : (x,y)=\lambda A+(1-\lambda)B \quad \lambda \in [0,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-origin-width=&quot;628&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A69HB/dJMcaiWHn1T/YKAZJ8VZdB7Q6NknTSPV9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A69HB/dJMcaiWHn1T/YKAZJ8VZdB7Q6NknTSPV9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A69HB/dJMcaiWHn1T/YKAZJ8VZdB7Q6NknTSPV9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA69HB%2FdJMcaiWHn1T%2FYKAZJ8VZdB7Q6NknTSPV9K%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;628&quot; height=&quot;554&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;554&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;p data-ke-size=&quot;size16&quot;&gt;1번 영역에서는 $d(P,S_{AB})=d(P,Q)$ - P와 그 선분에 Projection한 점 Q 사이의 거리를 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 영역에서는 $d(P,S_{AB})=d(P,A)$ - P와 선분의 끝 A 사이의 거리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 영역에서는 $d(P,S_{AB})=d(P,B)$ - P와 선분의 끝 B 사이의 거리&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 코드 상에서는 SDF를 정의할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\lambda=\frac{\langle P-A, B-A \rangle}{ \langle B-A,B-A \rangle }$$를 계산한 다음에 이 $\lambda$를 $[0,1]$ 안으로 clipping한 $lambda$값을 선분 방정식에 넣은 점과의 거리로 정의한다.&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;$\lambda$가 0보다 작을 경우에는 점 A에 projection되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\lambda$가 1보다 클 경우에는 점 B에 projection하기 위해서이다.&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;따라서 SDF를 다음과 같이 정의할 수 있다.&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;$$d(P,S_{AB})=d(P,Q)&amp;nbsp;\quad&amp;nbsp;{such&amp;nbsp;that}&amp;nbsp;Q=\lambda&amp;nbsp;A&amp;nbsp;+(1-\lambda)B&amp;nbsp;\text[&amp;nbsp;where&amp;nbsp;}\lambda=&amp;nbsp;\min\left(1,&amp;nbsp;\max&amp;nbsp;\left(&amp;nbsp;\frac{&amp;nbsp;\langle&amp;nbsp;P-A,&amp;nbsp;B-A&amp;nbsp;\rangle&amp;nbsp;}{&amp;nbsp;\langle&amp;nbsp;B-A,B-A&amp;nbsp;\rangle&amp;nbsp;}\right)\right)$$&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 3 Dimensional일 때&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. Cube&lt;/b&gt;&lt;/h3&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ESs5R/dJMcac9ZSED/iPEc7e1yP3f4TfCpPfLpXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ESs5R/dJMcac9ZSED/iPEc7e1yP3f4TfCpPfLpXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ESs5R/dJMcac9ZSED/iPEc7e1yP3f4TfCpPfLpXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FESs5R%2FdJMcac9ZSED%2FiPEc7e1yP3f4TfCpPfLpXk%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;687&quot; height=&quot;604&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;604&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;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 cube 거리를 계산할 때는 선분 거리 계산 때와 같이 영역을 나눠서 계산할 수 있다.&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 $d=P_x -R_x$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영역 2 $d=P_y - R_y$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영역 3 $d=\sqrt{ (P_x - R_x)^2 + (P_y - R_y)^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;내부에 점이 있는 경우까지 고려하면 다음과 같이 정리할 수 있다.&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;$$d = \left\lVert \max\left( \lvert P \rvert - R,\, 0 \right) \right\rVert&amp;nbsp;&amp;nbsp; &amp;nbsp; -&amp;nbsp;\min\left(&amp;nbsp;\left\lVert&amp;nbsp;\lvert&amp;nbsp;P&amp;nbsp;\rvert&amp;nbsp;-&amp;nbsp;R&amp;nbsp;\right\rVert_{\infty},\,&amp;nbsp;0&amp;nbsp;\right)$$&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xsbKo/dJMcabpNH2C/yLbYvVH150EK4uGO70ohD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xsbKo/dJMcabpNH2C/yLbYvVH150EK4uGO70ohD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xsbKo/dJMcabpNH2C/yLbYvVH150EK4uGO70ohD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxsbKo%2FdJMcabpNH2C%2FyLbYvVH150EK4uGO70ohD1%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;703&quot; height=&quot;630&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;630&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;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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDFs는 mesh를 만들어야한다는 제약이 덜하기 때문에 유용하게 쓸 수 있을까 싶어서 공부 중이다.&lt;/p&gt;</description>
      <category>Signed Distance Functions</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/524</guid>
      <comments>https://normal-engineer.tistory.com/524#entry524comment</comments>
      <pubDate>Mon, 2 Mar 2026 06:21:33 +0900</pubDate>
    </item>
    <item>
      <title>[추정] Maximum likelihood estimator (MLE), Maximum a posterior Estimator(MAP)</title>
      <link>https://normal-engineer.tistory.com/523</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Estimation에 대해 알기 전에 읽어두면 도움이 되는 글 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://normal-engineer.tistory.com/191&quot;&gt;https://normal-engineer.tistory.com/191&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;&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;Estimation을 공부하다보면 무조건 나오는 것이 Maximum Likelihood Estimator와 Maximum A-Posterior Estimator다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 개 개념을 정확히 해놓으면 나중에 칼만 필터와 같은 이론을 공부할 때도 매우 도움이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추정 이론을 공부하려면 수학과의 probability &amp;amp; statistics 내용을 기본적으로 알고 있어야 한다.&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;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;0. Estimation for what?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추정론을 할 때 가장 기본적인 생각은 &quot;무엇&quot;을 추정하고자 하는지 명확하게 해야한다는 것이다. 대부분은 데이터가 있고, 그 데이터를 예측하기 위한 모델의 &quot;파라미터&quot;를 추정하겠다, 라는 것이 그 골자이다.&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;머신러닝에서 처음 시작할 때 확률론적인 가정이 없다면 linear regression을 할 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$y = w^{\top}x + b$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 모델에서 $w,b$가 deterministic하다고 생각하고 $w,b$를 추정하는 문제를 만든다.&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;그러나 우리가 얻는 결과값이 정해지는 게 아니라 확률적인 것이라 생각하면 그 문제의 formulation이 조금 달라진다. - 결론적으로는 최적화 문제로 귀결되어 최적화 알고리즘을 적용하게 되는 경우가 많지만, 문제의 가정과 모델링에 따라 그 formulation이 달라진다.&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;i&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;random variable&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;이라 하자. (Random variable이 무엇인가? 확률론에 기반한 설명보다는 여기서는 간단하게 특정 확률 분포를 갖는 어떤 스칼라값이라고 하자.) 그러면 그 random variable에 대해 알고 싶다할 때 그 random variable의 확률 분포를 특정 파라미터가 포함된 모델이라 가정하고 데이터를 기반으로 파라미터를 추정할 수 있다. 예를 들어 random variable이 가우시안 분포라고 가정한다면 평균과 분산을 추정함으로써 그 random variable의 분포를 예상할 수 있다.&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;그렇다면 우리가 알고 싶은 파라미터를 가장 &quot;그럴 듯한&quot; 값으로 추정해보고 싶은데 어떻게 해야할까?&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;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Maximum likelihood estimator (MLE)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가는 주어진 데이터를 보고 어떤 파라미터를 적용하면 그 데이터가 나올 확률이 가장 높은 것이 가장 좋은 파라미터라고 생각할 수 있다. 직관적이고 그럴 듯하다. 이 방법을 Maximum likelihood estimator라고 한다.&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{\theta}_{mle}=\arg\max_\theta L(\theta;x_1, \ldots, x_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;다음과 같이 Likelihood를 정의하고 그 값이 최대가 되는 파라미터 $\theta$를 구한다. 일반적으로는 log를 씌워서 log-likelihood로 만들어서 구하기도 한다. log는 단조증가함수이기 때문에 함수의 최대값이 변하지 않기 때문이다.&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{\theta}_{mle}=\arg\max_\theta \log L(\theta;x_1, \ldots, x_N)= \arg\max_\theta \ell(\theta;x_1, \ldots, x_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;이 때 데이터가 $x_1, x_2, \ldots, x_N$가 존재하므로 joint distribution를 구해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MLE는 사실 예시가 두 개 정도 정해져있고 직관적으로 이해하기도 편하다. 왜냐하면 솔루션을 수식으로 표현할 수 있기 때문이다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Example : free throw shooting&lt;/b&gt;&lt;/h3&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)가 나올 확률이 $\theta$, 뒷면(Tail)이 나올 확률이 $1-\theta$이라고 하자. N번의 observations이 주어질 때 ($x_1,x_2,\ldots,x_N$) MLE로 $\theta$를 추정해보자.&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;처음 Likelihood를 작성하면서 시작한다. 앞면일 때의 observation을 $x=1$, 뒷면일 때 $x=0$이라 한다면 각 observation의 확률은 $\theta^x \times (1-\theta)^x$가 된다. $x=1$일 때 $\theta$, $x=0$일 때 $1-\theta$로 확률이 일치한다.&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;$$L(\theta; x_1,\ldots,x_N) = \prod_{n=1}^{N} \theta^{x_n} (1-\theta)^{1-x_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;각 observation이 독립이라고 가정한다면 $x_1$부터 $x_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;$S_N=\sum_{n=1}^{N}x_n$라고 둔다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$L(\theta;x_1,\ldots,x_N) =\theta^{S_N} (1-\theta)^{N-S_N}$$&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;$$\ell(\theta; x_1, \ldots, x_N)= S_N \log \theta + (N - S_N)\log(1 - \theta)$$&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;여기서 최대값을 구하기 위해 $\theta$에 대해 미분한다.&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;$$\frac{d\ell(\theta; \cdot)}{d\theta} = \frac{S_N}{\theta} - \frac{N - S_N}{1 - \theta}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\frac{d^2\ell(\theta; \cdot)}{d\theta^2}= -\frac{S_N}{\theta^2} - \frac{N - S_N}{(1 - \theta)^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;첫 번째 식이 0이 되는 $\theta$가 곧 MLE다. 대신 최대값인지 확인하기 위해 Second derivative까지 확인해야한다.&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;$$\theta_{mle} = \frac{S_N}{N}=\frac{1}{N}\sum_{n=1}^{N}x_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;즉, 내가 나온 Head의 개수의 평균이 곧 $\theta$라는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. Maximum A-posterior Estimator&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MLE는 굉장히 유용한 방법이기는 하지만 우리가 어느정도 사전지식을 갖고 있을 때는 이를 반영해줄 필요가 있다. 예를 들어 위의 예시에서 코인이 있는데 어느정도 코인이 살짝 구부러져있어서 앞면이 더 나올 가능성이 높다는 걸 알고 있다해보자. 그렇다면 MLE를 적용하기보다는 이를 고려한 추정기가 훨씬 그럴 듯할 것이다.&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;사실 칼만 필터 역시 우리가 dynamics를 알고 있을 때, 이전 스텝의 state가 이후 스텝의 state에 영향을 준다는 사실을 알고 있다. 그래서 이전 정보를 활용해서 정확한 현재 state를 추정할 수 있는 것이다. 따라서 우리는 Bayesian estimator를 사용함으로써 더 정확한 추정치를 알 수 있다. 그래서 이번 장에서는 Bayesian estimator를 적용함으로써 추정 결과가 어떻게 바뀌는지를 확인할 것이다.&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;A-posterior를 구하기 위해 우리는 궁금한 파라미터 $\theta$가 a random variable이라고 가정한다. 따라서 $\theta$를 추정하는 문제가 deterministic이 아니라 probabilistic 문제로 바뀌는 것이다. $\theta$가 고정된 값이 아니기 때문에 $\theta$에 대한 확률 분포가 필요하다.&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;$\Theta \~ f_{\Theta}(\theta)$&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;보통 $\Theta$를 random variable이라고 한다면 $\theta$는 그 realization이다. 즉, $\Theta=1$일 때 $\theta$는 1이라는 값을 대변하기 위한 변수이다.&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$는 $Theta$에 따라 확률이 달라진다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$X \~ f_{X}(x|\Theta=\theta).$$&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$가 주어질 때 우리가 궁금한 파라미터 $\Theta$가 $\theta$일 확률은 다음과 같이 구할 수 있다.&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;$$f_{\Theta}(\theta | X=x) =\frac{f_{X}(x|\Theta=\theta) f_{\Theta}(\theta)}{f_{X}(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;우리가 구하고자 하는 $f_{\Theta}(\theta)$은 관찰 결과가 있기 전에 존재하는 확률 분포이므로 prior, 관찰값 $x$를 보고 추정하는 확률 분포 $f_{\Theta}(\theta|x)$는 posterior라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 maximum a-posterior estimator는 posterior 확률을 극대화하는 $\theta$를 구하는 추정 문제를 풀어야 한다.&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;참고로 normalizing factor인 $f_{X}(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;$$f_{X}(x)=\int_{\theta \in \mathcal{T}} f_{X}(x|\Theta=\theta)f_{\Theta}(\theta)d\theta$$와 같이 적분으로 구해줘야한다.&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;$\Theta$가 discrete variable인 경우에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f_{X}(x)= \sum_{\theta \in \mathcal{T}} f_{X}(x|\Theta=\theta)P(\Theta=\theta) $$&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Example : free throw shooting&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이전과 동일한 free throw shooting 문제를 $\theta$에 대한 확률분포 $f_{\Theta}(\theta)$를 도입해서 풀어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 알고 싶은 것은 동전이 앞면이 나올 확률($\theta$)이다. (뒷면이 나올 확률은 자연히 $1-\theta$가 된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 우리가 동전을 만드는 공정을 다 알고 있어서 동전의 확률이 $\theta=1/2$에서 1이고 나머지는 0이라는 것을 안다면 maximum a-posterior estimator는 어떠한 observations이 있어도 $\theta=1/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금은 $f_{\Theta}(\theta)=\text{Uniform}([0,1])=1 \; \forall \theta=[0,1]$라고 하자.&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_1 =1$일 때 posterior를 구해보자.&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;$$f_{\Theta}(\theta \mid X_1 = 1)=\frac{f_X(X_1 = 1 \mid \Theta = \theta)\, f_{\Theta}(\theta)}{f_X(X_1 = 1)}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f_X(X_1 = 1)=\int_{0}^{1} \theta \, f_{\Theta}(\theta)\, d\theta= &lt;br /&gt;\int_{0}^{1} \theta \, d\theta= &lt;br /&gt;\left[&amp;nbsp;\frac{\theta^2}{2}&amp;nbsp;\right]_{0}^{1} &lt;br /&gt;= &lt;br /&gt;\frac{1}{2} &lt;br /&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;$$f_{\Theta}(\theta&amp;nbsp;\mid&amp;nbsp;X_1&amp;nbsp;=&amp;nbsp;1) &lt;br /&gt;= &lt;br /&gt;\frac{\theta&amp;nbsp;\cdot&amp;nbsp;1}{1/2} &lt;br /&gt;= &lt;br /&gt;2\theta &lt;br /&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;따라서 $f_{\Theta}(\theta \mid X_1=1)$을 최대화하기 위한 $\theta$는 1이 된다. ($\theta \in[0,1]$)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 우리가 더 많은 관찰 결과를 가진다면 ($X_1, X_2, X_3, X_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;예를 들어 $ X_1=1,X_2=0,X_3=1,X_4=1$일 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$f_{\Theta}(\theta|X_1=1,X_2=0,X_3=1,X_4=1)=\frac{f_{X}(X_1=1,X_2=0,X_3=1,X_4=1|\Theta=\theta)}{f_{X}(X_1=1,X_2=0,X_3=1,X_4=1)}$$&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;분자의 경우 $\theta^3(1-\theta)$로 쉽게 나오지만 분모를 구하려면 $$\int_0^1 \theta^3(1-\theta)d\theta$$를 계산해야하므로 좀 더 복잡하다. 이 경우 감마함수를 사용하면 구할 수 있다. 하지만 MAP를 적용하는 관점에서 $f_X$는 $\theta$와 무관한 값이기 때문에 구할 필요가 없다. 즉, 분자만 따졌을 때는 이전에 구했던 MLE 문제와 크게 다르지 않다는 결론이 나온다.&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;왜 이런 결론이 나왔을까? 우리가 $\theta$의 분포를 uniform하다고 가정했기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, $\theta$에 대한 사전 정보에 따라서 MAP 결과가 달라질 수 있다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 종합&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MLE와 MAP 외에도 MMSE 등 다른 Estimator가 있는데 이는 나중에 기회가 되면 더 설명하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 MLE와 MAP에서 $\theta$에 대한 가정을 달리함으로써 다르게 추정할 수 있음을 이해하는 것이다.&lt;/p&gt;</description>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/523</guid>
      <comments>https://normal-engineer.tistory.com/523#entry523comment</comments>
      <pubDate>Thu, 12 Feb 2026 11:46:16 +0900</pubDate>
    </item>
    <item>
      <title>[JAX] JAX 최신버전(0.8.0~0.9.0) GPU 체크</title>
      <link>https://normal-engineer.tistory.com/521</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 컴퓨터나 노트북에 NVIDIA GPU가 있고 CUDA가 이미 설치되어있는 것을 전제로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 가상환경을 conda에서 만들어서 그 안에서 최신 버전의 JAX를 설치하는 과정이다. (일반적으로 JAX를 pip으로 설치하면 무조건 최신버전을 설치하도록 된다.)&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;설치한 JAX 버전은 현재 기준으로 가장 최신인 0.9.0이다. 이전 버전을 설치하고 싶다면 &lt;a href=&quot;https://normal-engineer.tistory.com/313&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1768&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSaroJ/dJMcagRRxol/vQUKqbpGtWXUTwKqokFAZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSaroJ/dJMcagRRxol/vQUKqbpGtWXUTwKqokFAZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSaroJ/dJMcagRRxol/vQUKqbpGtWXUTwKqokFAZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSaroJ%2FdJMcagRRxol%2FvQUKqbpGtWXUTwKqokFAZk%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;1768&quot; height=&quot;826&quot; data-origin-width=&quot;1768&quot; data-origin-height=&quot;826&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나는 주로 Linux x86_64, Windows WSL2 환경을 사용한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 커맨드를 실행하면 JAX GPU 버전이 설치가 되는데 여기서 가정하는 것은 CUDA가 적절하게 설치되어있다는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1769441975546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install --upgrade &quot;jax[cuda12]&quot;&lt;/code&gt;&lt;/pre&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;최근에는 JAX installation 문서가 잘 업데이트되어서 설치하는 데에 크게 어려움은 없다. 다만 설치하고 gpu를 잘 사용되는지 확인하고자 한다면 다음 처럼 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1769441848244&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python # ubuntu 환경에서 python 실행
&amp;gt;&amp;gt; import jax
&amp;gt;&amp;gt; print( jax.default_backend() )&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;1738&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckYJUP/dJMb99ZvfA7/6iACqggmToKsupJvXCO2YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckYJUP/dJMb99ZvfA7/6iACqggmToKsupJvXCO2YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckYJUP/dJMb99ZvfA7/6iACqggmToKsupJvXCO2YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckYJUP%2FdJMb99ZvfA7%2F6iACqggmToKsupJvXCO2YK%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;1738&quot; height=&quot;591&quot; data-origin-width=&quot;1738&quot; data-origin-height=&quot;591&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 CPU를 사용한다고 나온다. 이런 문제는 보통 CUDA가 전체 컴퓨터에 설치되어있다하더라도 내가 셋업하고 있는 환경 안에서 CUDA를 읽어들이지 못하는 경우이다. 따라서 환경의 안정성을 위해서는 각 가상환경마다 NVIDIA CUDA를 설치해주는 게 좋긴 하다. (다만 이런 환경이 많이 늘어난 상태라 용량이 문제가 된다면 언젠가는 정리해야할 것 같기도...) 다음 커맨드가 가상환경 내에서 CUDA를 사용하기 위한 library까지 포함해서 설치하는 것이다.&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;(Note : 옛날에 윈도우 자체에서 CUDA 버전을 여러 개 설치해서 사용을 했었는데 이러면 각 CUDA와 가상환경 사이에 읽어들이는 게 꼬이기 쉬웠었다.)&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;CUDA를 사용하는지 확실하게 하기 위해서는 다음 Command도 다시 설치해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ySOZF/dJMcaia4rcD/GMuDjZBj5FY9v1pIzK6E4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ySOZF/dJMcaia4rcD/GMuDjZBj5FY9v1pIzK6E4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ySOZF/dJMcaia4rcD/GMuDjZBj5FY9v1pIzK6E4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FySOZF%2FdJMcaia4rcD%2FGMuDjZBj5FY9v1pIzK6E4k%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;1197&quot; height=&quot;421&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;421&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;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 cudnn을 비롯한 CUDA를 사용하기 위한 많은 라이브러리들을 설치하도록 되어있다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7supZ/dJMcahDcMRw/e7G8Fcn9elQxkmkNgRCPo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7supZ/dJMcahDcMRw/e7G8Fcn9elQxkmkNgRCPo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7supZ/dJMcahDcMRw/e7G8Fcn9elQxkmkNgRCPo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7supZ%2FdJMcahDcMRw%2Fe7G8Fcn9elQxkmkNgRCPo1%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;1022&quot; height=&quot;288&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;288&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제는 GPU를 인식하는 것을 확인할 수 있다.&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;</description>
      <category>프로그래밍 Programming</category>
      <category>GPU</category>
      <category>JAX</category>
      <author>보통의공대생</author>
      <guid isPermaLink="true">https://normal-engineer.tistory.com/521</guid>
      <comments>https://normal-engineer.tistory.com/521#entry521comment</comments>
      <pubDate>Tue, 27 Jan 2026 00:47:41 +0900</pubDate>
    </item>
  </channel>
</rss>