<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>통계하고가</title>
    <link>https://siuni.tistory.com/</link>
    <description>통계학과</description>
    <language>ko</language>
    <pubDate>Thu, 13 Aug 2026 16:07:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>김통계임</managingEditor>
    <item>
      <title>A Conformal Prediction Approach to Explore Functional Data 구현 (1)- EM 알고리즘</title>
      <link>https://siuni.tistory.com/5</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\((', '\))']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GMM을 구현하기에 앞서 EM 알고리즘에 대해 이해할 필요가 있다.&amp;nbsp;EM 알고리즘을 GMM의 parameter 추정에 사용하는 이유는 각 데이터가 어떤 Gaussian component로부터 생성되었는지를 알 수 없기 때문이다.&amp;nbsp;즉,&amp;nbsp;데이터에&amp;nbsp;대한&amp;nbsp;component&amp;nbsp;label이&amp;nbsp;관측되지&amp;nbsp;않는&amp;nbsp;latent&amp;nbsp;variable&amp;nbsp;형태로&amp;nbsp;존재한다.&lt;br /&gt;&lt;br /&gt;GMM에서는 각 Gaussian component의 평균과 공분산인 $\mu_k, \Sigma_k,\pi_k$를 추정해야 하며, 각 데이터가 특정 Gaussian component에 속할 확률인 responsibility 또한 함께 계산해야 한다. 그러나 관측된 데이터만으로는 각 sample이 어느 Gaussian component에 속하는지 직접 알 수 없기 때문에 바로 likelihood를 최대화하는 것이 어렵다.&lt;br /&gt;&lt;br /&gt;EM 알고리즘은 이러한 문제를 해결하기 위해 반복적으로 다음 과정을 수행한다. 먼저 E-step에서는 현재 parameter를 이용하여 각 데이터가 특정 Gaussian component에 속할 posterior probability, 즉 responsibility를 계산한다. 이후 M-step에서는 계산된 responsibility를 기반으로 $\mu_k,\Sigma_k,\pi_k$를 다시 업데이트한다. 이를 반복함으로써 GMM의 parameter를 점진적으로 추정할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;br /&gt;EM Algorithm: E-step&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Given Data:&lt;br /&gt;\[&lt;br /&gt;\{&amp;nbsp;X_i,&amp;nbsp;z_i&amp;nbsp;\}&amp;nbsp;\quad&amp;nbsp;\text{(latent&amp;nbsp;variable&amp;nbsp;\(&amp;nbsp;z_i&amp;nbsp;\)&amp;nbsp;not&amp;nbsp;observed)}&lt;br /&gt;\]&lt;br /&gt;\[&lt;br /&gt;X_i&amp;nbsp;|&amp;nbsp;z_i&amp;nbsp;=&amp;nbsp;k&amp;nbsp;\sim&amp;nbsp;\mathcal{N}(\mu_k,&amp;nbsp;\Sigma_k),&amp;nbsp;\quad&amp;nbsp;k&amp;nbsp;=&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3&lt;br /&gt;\]&lt;br /&gt;\[&lt;br /&gt;z_i:&amp;nbsp;\text{group&amp;nbsp;membership&amp;nbsp;(weight)}&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;Log-likelihood:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;\[&lt;br /&gt;lc(\theta)&amp;nbsp;=&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\sum_{k=1}^{K}&amp;nbsp;I(z_i&amp;nbsp;=&amp;nbsp;k)&amp;nbsp;\left(&amp;nbsp;\log&amp;nbsp;\pi_k&amp;nbsp;-&amp;nbsp;\frac{1}{2}&amp;nbsp;\log&amp;nbsp;|\Sigma_k|&amp;nbsp;-&amp;nbsp;\frac{1}{2}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\mu_k)^T&amp;nbsp;\Sigma_k^{-1}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\mu_k)&amp;nbsp;\right)&lt;br /&gt;\]&lt;br /&gt;\[&lt;br /&gt;\log&amp;nbsp;\text{likelihood}&amp;nbsp;=&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\log&amp;nbsp;\sum_{k=1}^{K}&amp;nbsp;\pi_k&amp;nbsp;\mathcal{N}(X_i&amp;nbsp;|&amp;nbsp;\mu_k,&amp;nbsp;\Sigma_k)&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;EM Algorithm: E-step&lt;br /&gt;Objective: We don't observe $z_i$, so we compute the expected log-likelihood based on $z_i$:&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;Q(\theta&amp;nbsp;|&amp;nbsp;\theta^{(t)})&amp;nbsp;=&amp;nbsp;\mathbb{E}[lc(\theta)&amp;nbsp;|&amp;nbsp;X_i;&amp;nbsp;\theta^{(t)}]&lt;br /&gt;\]&lt;br /&gt;\[&lt;br /&gt;P(z_i&amp;nbsp;=&amp;nbsp;k&amp;nbsp;|&amp;nbsp;X_i,&amp;nbsp;\theta^{(t)})&amp;nbsp;=&amp;nbsp;\frac{\pi_k^{(t)}&amp;nbsp;\mathcal{N}(X_i&amp;nbsp;|&amp;nbsp;\mu_k^{(t)},&amp;nbsp;\Sigma_k^{(t)})}{\sum_{j=1}^{K}&amp;nbsp;\pi_j^{(t)}&amp;nbsp;\mathcal{N}(X_i&amp;nbsp;|&amp;nbsp;\mu_j^{(t)},&amp;nbsp;\Sigma_j^{(t)})}&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;Responsibility: The above probability is known as the responsibility $\tilde{w}_{ik}^{(t)}$:&lt;br /&gt;\[&lt;br /&gt;\tilde{w}_{ik}^{(t)}&amp;nbsp;=&amp;nbsp;P(z_i&amp;nbsp;=&amp;nbsp;k&amp;nbsp;|&amp;nbsp;X_i,&amp;nbsp;\theta^{(t)})&lt;br /&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;br /&gt;EM Algorithm: M-step with Normalized Weights&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;Update parameters:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp; $\pi_k^{(t+1)}$:&lt;br /&gt;\[&lt;br /&gt;\hat{\pi}_k^{(t+1)}&amp;nbsp;=&amp;nbsp;&amp;nbsp;\frac{1}{n}&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\tilde{w}_{ik}^{(t)}&amp;nbsp;=&amp;nbsp;\frac{w_{ik}^{(t)}}{\sum_{k=1}^{K}&amp;nbsp;w_{ik}^{(t)}}&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp; $\mu_k^{(t+1)}$:&lt;br /&gt;\[&lt;br /&gt;\hat{\mu}_k^{(t+1)}&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;nbsp;\frac{1}{n}&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;X_i&amp;nbsp;\quad&amp;nbsp;\left(&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;=&amp;nbsp;1&amp;nbsp;\right)&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;3. $\Sigma_k^{(t+1)}$:&lt;br /&gt;\[&lt;br /&gt;\hat{\Sigma}_k^{(t+1)}&amp;nbsp;==&amp;nbsp;{\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\hat{\mu}_k^{(t+1)})(X_i&amp;nbsp;-&amp;nbsp;\hat{\mu}_k^{(t+1)})^T}&amp;nbsp;&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;Maximization step:&lt;br /&gt;\[&lt;br /&gt;\theta^{(t+1)}&amp;nbsp;=&amp;nbsp;\arg&amp;nbsp;\max_{\theta}&amp;nbsp;Q(\theta&amp;nbsp;|&amp;nbsp;\theta^{(t)})&lt;br /&gt;\]&lt;br /&gt;위 step으로 인해 iteration이 진행될수록 likelihood가 감소하지 않는다. 즉, EM 알고리즘은 매 iteration마다 likelihood를 증가(또는 유지)시키는 방향으로 parameter를 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;Proof of $\mu_k$ and $\Sigma_k$ Update&lt;br /&gt;&lt;br /&gt;1. Proof of $\mu_k$&lt;br /&gt;\[&lt;br /&gt;\frac{\partial}{\partial&amp;nbsp;\mu_k}&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;\left(&amp;nbsp;-&amp;nbsp;\frac{1}{2}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\mu_k)^T&amp;nbsp;\Sigma_k^{-1}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\mu_k)&amp;nbsp;\right)&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\sum_{i=1}^{n}&amp;nbsp;&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;\Sigma_k^{-1}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\mu_k)&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\hat{\mu}_k^{(t+1)}&amp;nbsp;=&amp;nbsp;{\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;X_i}&amp;nbsp;\quad&amp;nbsp;\left(&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;=&amp;nbsp;1&amp;nbsp;\right)&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;2. Proof of $\Sigma_k$:&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\frac{\partial}{\partial&amp;nbsp;\Sigma_k}&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;\left(&amp;nbsp;-&amp;nbsp;\frac{1}{2}&amp;nbsp;\log&amp;nbsp;|\Sigma_k|&amp;nbsp;-&amp;nbsp;\frac{1}{2}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\mu_k)^T&amp;nbsp;\Sigma_k^{-1}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\mu_k)&amp;nbsp;\right)&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\hat{\Sigma}_k^{(t+1)}&amp;nbsp;={\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;(X_i&amp;nbsp;-&amp;nbsp;\hat{\mu}_k^{(t+1)})(X_i&amp;nbsp;-&amp;nbsp;\hat{\mu}_k^{(t+1)})^T}&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;위 방법들 처럼 likelihood를 업데이트 하려는 변수로 편미분하면 아래 $\pi_k$같은 경우 해가 나오지 않는다. 그 이유는 $\sum_{k=1}^{K}\pi_k=1$이라는 제약 조건이 있기 때문이다. 이런 경우 Lagrange Multiplier를 사용해 $\pi_k$를 구한다.&lt;br /&gt;&lt;br /&gt;Lagrange Multiplier Method:&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\mathcal{L}(x,&amp;nbsp;\lambda)&amp;nbsp;=&amp;nbsp;f(x)&amp;nbsp;+&amp;nbsp;\lambda&amp;nbsp;g(x)&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;- $f(x)$: 최적화하려는 목적 함수.&lt;br /&gt;- $g(x) = 0$: 제약 조건.&lt;br /&gt;- $\lambda$: 라그랑주 승수(Lagrange multiplier).&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\nabla&amp;nbsp;f(x)&amp;nbsp;+&amp;nbsp;\lambda&amp;nbsp;\nabla&amp;nbsp;g(x)&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;\]&lt;br /&gt;\[&lt;br /&gt;g(x)&amp;nbsp;=&amp;nbsp;0&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Proof of $\pi_k$ Update using Lagrange Multiplier&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. Proof of $\pi_k$:&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\mathcal{L}(\pi_k,&amp;nbsp;\lambda)&amp;nbsp;=&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\sum_{k=1}^{K}&amp;nbsp;&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;\log&amp;nbsp;\pi_k&amp;nbsp;+&amp;nbsp;\lambda&amp;nbsp;\left(&amp;nbsp;1&amp;nbsp;-&amp;nbsp;\sum_{k=1}^{K}&amp;nbsp;\pi_k&amp;nbsp;\right)&lt;br /&gt;\]&lt;br /&gt;&lt;br /&gt;\[&lt;br /&gt;\frac{\partial}{\partial&amp;nbsp;\pi_k}&amp;nbsp;\mathcal{L}(\pi_k,&amp;nbsp;\lambda)&amp;nbsp;=&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;&amp;nbsp;\tilde{w}_{ik}^{(t)}&amp;nbsp;\frac{1}{\pi_k}&amp;nbsp;-&amp;nbsp;\lambda&amp;nbsp;=&amp;nbsp;0&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;\[&lt;br /&gt;\hat{\pi}_k^{(t+1)}&amp;nbsp;&amp;nbsp;=&amp;nbsp;\frac{1}{n}&amp;nbsp;\sum_{i=1}^{n}&amp;nbsp;\tilde{w}_{ik}^{(t)}&lt;br /&gt;\]&lt;/p&gt;</description>
      <category>논문/논문 구현하기</category>
      <author>김통계임</author>
      <guid isPermaLink="true">https://siuni.tistory.com/5</guid>
      <comments>https://siuni.tistory.com/5#entry5comment</comments>
      <pubDate>Tue, 21 Apr 2026 22:55:50 +0900</pubDate>
    </item>
    <item>
      <title>np.searchsorted</title>
      <link>https://siuni.tistory.com/4</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;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\((', '\))']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&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;span style=&quot;background-color: #ffffff; color: #222832; text-align: start;&quot;&gt;Numpy에 있는 함수인 searchsorted에 대해 알아보자.&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: #222832; text-align: start;&quot;&gt;Numpy 기술 문서에 따르면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222832; text-align: start;&quot;&gt;'Find indices where elements should be inserted to maintain order.' 즉, 순서를 유지하면서 해당 요소가 삽입될 위치를 찾는 함수이다.&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: #222832; text-align: start;&quot;&gt;이 함수를 쓰게 된 경위는 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222832; text-align: start;&quot;&gt;$e_{i,j} = \frac{K(n_{\mathrm{cal}}+1) I(S_{n+i,j} \ge T_{i}^{+})}{\sum_{l=1}^{n_{\mathrm{cal}}}\sum_{j^{\prime}=1}^{K} I(S_{n_{\mathrm{tr}} + l,j^{\prime}} \ge T_{i}^{-}) + K}$을 구하기 위해서인데 이때 $T_i^{+}$와 $T_i^{-}$는 stopping times로 다음과 같다.&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: #222832; text-align: start;&quot;&gt;$T_i^{+} = \inf \left\{ t \in \mathbb{R} : \widehat{\text{FDP}}_i^+(t) \leq \tilde{\alpha} \right\}, \text{ where } &lt;br /&gt;\widehat{\mathrm{fdp}}_{i}^{+} (t) = \frac{m-1}{n_{\mathrm{cal}}+1} \frac{ \sum_{k=1}^{n_{\mathrm{cal}}} \sum_{j=1}^{K} I(S_{n_{\mathrm{tr}} + k,j} \ge t) + K}{1 \vee \sum_{l \in [m]\setminus \{i\}} \sum_{j=1}^{K} I(S_{n + l,j} \ge t)}$,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #222832; 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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222832; text-align: start;&quot;&gt;$T_i^{-} = \inf \left\{t \in \mathbb{R} : \widehat{\text{FDP}}_i^-(t) \leq \tilde{\alpha} \right\}, \text{ where } &lt;br /&gt;\widehat{\mathrm{FDP}}_{i}^{-} (t) = \frac{m-1}{n_{\mathrm{cal}}+1} \frac{ \sum_{k=1}^{n_{\mathrm{cal}}} \sum_{j=1}^{K} I(S_{n_{\mathrm{tr}} + k,j} \ge t)}{1 \vee \sum_{l \in [m]\setminus \{i\}} \sum_{j=1}^{K} I(S_{n + l,j} \ge t)}$&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;여기서 왜 우리가 &lt;b&gt;searchsorted&lt;/b&gt;함수를 사용해야하는 이유에 대해 알 수 있다. 위 Stopping times인 $T_i^{+}$와 $T_i^{-}$를 구하기 위해서는 실수 범위 내에서 특정 조건을 만족하는 값을 찾아야 한다. 실제 계산 과정에서는 관측된 수많은 점수(Scores)를 후보군으로 두고 비교 연산을 수행하게 되는데 이때 일반적인 반복문(Loop) 대신 &lt;b data-index-in-node=&quot;195&quot; data-path-to-node=&quot;3&quot;&gt;Numpy의 searchsorted&lt;/b&gt; 함수를 사용하면 연산 효율을 극대화할 수 있다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;왜냐하면 np.searchsorted는 내부적으로 &lt;b data-index-in-node=&quot;23&quot; data-path-to-node=&quot;4&quot;&gt;이진 탐색(Binary Search)&lt;/b&gt; 알고리즘을 사용하기 때문에, 이미 정렬된 배열에서 특정 값의 위치를 $O(\log n)$의 시간 복잡도로 매우 빠르게 찾아내기때문이다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size20&quot;&gt;side=&quot;left&quot; 옵션과 Infimum의 관계&lt;/h4&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 위 수식에서 $T_i^{+}$는 다음과 같이 인피멈(Infimum, 하한)으로 정의된다.&lt;/p&gt;
&lt;div data-path-to-node=&quot;7&quot;&gt;
&lt;div data-math=&quot;T_i^{+} = \inf \left\{ t \in \mathbb{R} : \widehat{\text{FDP}}_i^+(t) \leq \tilde{\alpha} \right\}&quot;&gt;$$T_i^{+} = \inf \left\{ t \in \mathbb{R} : \widehat{\text{FDP}}_i^+(t) \leq \tilde{\alpha} \right\}$$&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;이는 조건을 만족하는 &lt;span data-index-in-node=&quot;12&quot; data-math=&quot;t&quot;&gt;$t$&lt;/span&gt; 값들 중 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;8&quot;&gt;가장 작은 값&lt;/b&gt;을 찾겠다는 의미이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;가장 왼쪽 위치 탐색:&lt;/b&gt; side=&quot;left&quot; 옵션은 찾고자 하는 값이 삽입될 수 있는 가장 왼쪽 인덱스를 반환한다. 즉, 배열이 오름차순으로 정렬되어 있을 때 FDP 조건을 만족하기 시작하는 &lt;b data-index-in-node=&quot;107&quot; data-path-to-node=&quot;9,0,0&quot;&gt;'가장 첫 번째'&lt;/b&gt; 지점을 즉시 찾아낸다.&lt;/li&gt;
&lt;li&gt;결과적으로 조건을 만족하는 가장 작은 인덱스를 찾는 것은, 집합의 하한(Infimum)을 찾는 것과 논리적으로 동일하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기능 응용:&lt;/b&gt; a=[1,2,2,3,3,4,5]의 순서를 망치지 않고 b=[3,4]가 들어갈 index를 찾아보자. 아래 코드에서 index는 각각 3,5가 위와 같이 나온다. `len(a)-&lt;span style=&quot;color: #267f99;&quot;&gt;np&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;searchsorted&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;side&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&quot;left&quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)`을 사용하면 리스트 a의 원소들 중에 리스트 b에 있는 원소들 보다 크거나 같은 원소들의 갯수가 list형식으로 반환된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1769432438138&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a=[1,2,2,3,3,4,4,5]
b=[3,4]

np.searchsorted(a,b,side=&quot;left&quot;)

#array([3, 5])

len(a)-np.searchsorted(a,b,side=&quot;left&quot;)

#array([5, 3])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1769428476856&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;all_scores = np.sort(np.unique(np.concatenate([s_ref_flat, s_te_flat])))[::-1]
            
# 각 그룹 i별로 '나를 제외한 다른 그룹의 점수'를 빠르게 계산하기 위해
# 전체 s_te에 대한 카운트 테이블을 미리 만듭니다.
count_ref = (len(s_ref_flat) - np.searchsorted(s_ref_flat, all_scores, side='left'))
count_te_total = (len(s_te_flat) - np.searchsorted(np.sort(s_te_flat), all_scores, side='left'))

T_plus = np.full(m, all_scores[0])
T_minus = np.full(m, all_scores[0])

# 각 그룹별로 최적의 t를 찾기 위해 벡터화된 연산 수행
# s_te[i]의 값들이 all_scores의 어디에 위치하는지 인덱스 맵 생성
for i in range(m):
    s_te_i = s_te[i]
    # count_other_te(t) = count_te_total(t) - count_in_group_i(t)
    count_in_i = (len(s_te_i) - np.searchsorted(np.sort(s_te_i), all_scores, side='left'))
    count_other_te = count_te_total - count_in_i
    denom = np.maximum(1, count_other_te)

    # FDP 조건 만족하는 인덱스 찾기
    fdp_plus = ((m - 1) / (n_cal + 1)) * (count_ref + self.K) / denom
    fdp_minus = ((m - 1) / (n_cal + 1)) * count_ref / denom

    plus_idx = np.where(fdp_plus &amp;lt;= self.alpha_tilde)[0]
    minus_idx = np.where(fdp_minus &amp;lt;= self.alpha_tilde)[0]

    if plus_idx.size &amp;gt; 0: T_plus[i] = all_scores[plus_idx[0]]
    if minus_idx.size &amp;gt; 0: T_minus[i] = all_scores[minus_idx[0]]

# e-values 계산 (벡터화)
e_values = np.zeros((m, self.K))
# T_minus에 따른 분모 계산 최적화
denoms = (len(s_ref_flat) - np.searchsorted(s_ref_flat, T_minus, side='left')) + self.K

for i in range(m):
    mask = (s_te[i] &amp;gt;= T_plus[i])
    e_values[i, mask] = (self.K * (n_cal + 1)) / denoms[i]&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;h4 data-path-to-node=&quot;10&quot; data-ke-size=&quot;size20&quot;&gt;Supremum과 side=&quot;right&quot;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;반대로 만약 슈프리멈(Supremum, 상한)을 찾아야 하는 경우에는 side=&quot;right&quot; 옵션을 사용하면 된다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;출처 : 넘파이 기술문서 내 searchsorted함수&lt;a href=&quot;https://numpy.org/doc/2.2/reference/generated/numpy.searchsorted.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://numpy.org/doc/2.2/reference/generated/numpy.searchsorted.html&lt;/a&gt;,gemini&lt;/p&gt;</description>
      <category>이것저것공부하다가메모</category>
      <author>김통계임</author>
      <guid isPermaLink="true">https://siuni.tistory.com/4</guid>
      <comments>https://siuni.tistory.com/4#entry4comment</comments>
      <pubDate>Sun, 25 Jan 2026 19:55:21 +0900</pubDate>
    </item>
    <item>
      <title>A Conformal Prediction Approach to Explore Functional Data</title>
      <link>https://siuni.tistory.com/1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://polyfill.io/v3/polyfill.min.js?features=es6&quot;&gt;&lt;/script&gt;
&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\((', '\))']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js&quot;&gt;&lt;/script&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;논문 선정 배경 및 Introduction&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 논문은 Functional Data Analysis(FDA)와 Conformal Prediction이라는 두 가지 중요한 통계적 방법론을 결합한 연구이다. 특히 FDA에 Conformal Prediction을 적용함으로써, 함수형 데이터에 대한 신뢰구간과 예측집합을 구축하고 이를 통해 예측의 불확실성을 체계적으로 정량화했다는 점에서 주목할 만하다. 이러한 방법론의 융합은 함수형 데이터 분석의 신뢰성을 높이는 새로운 접근법을 제시했다는 점에서 의미가 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.Introduction&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수형 데이터는 그 무한 차원적 특성으로 인해 시각화와 데이터 특성 파악에 어려움이 있다. 특히 어떤 곡선이 전체 데이터를 대표하는지, 혹은 어떤 곡선이 이상치인지를 판단하는 것이 쉽지 않다. 본 논문은 이러한 문제를 해결하기 위해 두 가지 접근법을 제시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째는 함수의 차원을 축소하는 방법이다. 이는 곡선의 주요 구조적 특징을 파악하는 데 효과적이다. 그러나 이 방법은 클러스터링 수행 시 중요한 밀도 수준 정보가 손실될 수 있다는 한계를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째는 유사 밀도$(\text{pseudo density})$를 활용하는 방법이다. 이는 무한 차원 함수 공간에서 특별한 의미를 갖는다. 함수 공간에서는 유한 지배 측도(&amp;sigma;-finite dominating measure)가 존재하지 않아 일반적인 의미의 확률 밀도 함수를 정의할 수 없기 때문이다. 유사 밀도는 이러한 한계를 극복하고 밀도와 유사한 역할을 수행함으로써, 함수형 데이터의 분포 특성을 효과적으로 분석할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 기본적인 conformal predcition와 FDA의 개념은 후에 기록하겠다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 함수 공간 차원 축소&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수형 데이터 분석(FDA)에서는 함수 데이터가 고차원 무한 차원 공간 $L^2[0,1]$에 속하기 때문에 직접적인 분석이 어려운 경우가 많다. 이에 따라 차원 축소 방법을 통해 유한 차원 공간으로 투영하여 데이터를 표현하는 것이 일반적이다. 본 보고서는 차원 축소를 기반으로 한 예측 밴드 정의와, 경계 개선을 통해 밴드의 효율성을 높이는 방법을 논의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 Gaussian Mixture Model (GMM)을 사용하여 함수형 데이터의 예측 밴드를 정의하기 전에, 데이터가 Mixture of Gaussian Processes (MGP)를 따른다는 전제를 기반으로 차원 축소와 투영 과정을 수행했다.데이터가 MGP를 따른다고 가정한 것은 Gaussian Mixture Model (GMM)을 활용하여 밀도 기반 예측 밴드를 정의하기 위함이다. 하지만 CP 자체는 이러한 분포 가정이 없어도 사용 가능하다. 즉, MGP 가정은 GMM 모델링의 적합성을 보장하기 위한 것이며, Conformal Prediction은 분포에 독립적으로 작동할 수 있는 유연성을 제공한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-1.차원 축소와 투영함수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공간 $L^2[0,1]$의 데이터를 유한 차원 $p$-공간으로 축소하기 위해 다음과 같은 투영 연산자 $\Pi_p$를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;\Pi_p(X) = \sum_{j=1}^p \langle X, \phi_j \rangle \phi_j&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 $\{\phi_j\}_{j=1}^p$는 $L^2[0,1]$의 직교 기저로, Fourier 기저, wavelet 기저 또는 함수 주성분 분석(FPCA) 기반 고유 함수로 선택될 수 있다. 차원 축소의 결과, 데이터 $X_i(t)$ 는 유한 차원 벡터 $\xi_i$로 표현된다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;\xi_i = (\langle X_i, \phi_1 \rangle, \dots, \langle X_i, \phi_p \rangle)&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 원본 데이터가 MGP를 따른다고 가정하였으므로 $\xi$은 GMM을 따른다고 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서 데이터 분석을 할때 데이터의 기저 함수를 함수 주성분 분석 기반 고유함수로 정의하였다. 기저 함수의 개수를 증가시킬 경우 원본 함수 공간에 대한 재구성 결과가 기저 함수의 선택과 무관하게 수렴하게 된다. 따라서 FPCA를 활용한 기저 함수 정의는 함수 공간 투영 과정에서의 일반성을 보장할 뿐 아니라, 차원을 제한된 수로 축소하더라도 데이터의 주요 정보를 효과적으로 유지할 수 있다는 점에서 적합하다고 본 논문은 주장하였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-2.경험적 예측 밴드 정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차원 축소된 데이터를 기반으로 예측 밴드를 정의한다. $B_n(t)$는 $L^2[0,1]$에서 다음과 같은 형태를 가진다:&lt;br /&gt;\[&lt;br /&gt;B_n = \{ X(t) \in L^2[0,1] : X(t) \in B_n(t), \forall t \in [0,1] \}&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 $B_n(t)$는 투영 계수 $\xi$의 밀도를 활용하여 정의된다.이때 투영 계수는 $\xi$는 위에서도 언급했듯이 GMM을 따른다고 가정한다.:&lt;br /&gt;\[&lt;br /&gt;T_n = \{ \xi : f(\xi) \geq \lambda \}, \quad B_n(t) = \bigcup_k [\ell_k(t), u_k(t)]&lt;br /&gt;\]&lt;br /&gt;\[&lt;br /&gt;\ell_k(t) = \inf_{\xi \in T_{n,k}} \xi^\top \phi(t), \quad u_k(t) = \sup_{\xi \in T_{n,k}} \xi^\top \phi(t)&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 위 방법으로 예측 밴드를 계산하면 GMM의 밀도 자체에서 계산해야해서 계산 부담량도 크고 각 성분간 중첩문제도 해결 할 수 없다.따라서 아래 방법처럼 GMM을 각 성분 별로 나누어서 밀도 계산을 하여 합쳐 근사적으로 예측밴드를 정의할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-3.근사적 예측 밴드 정의&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_n$은 다음과 같이 정의된다:&lt;br /&gt;\[&lt;br /&gt;T_n = \{\xi : f(\xi) \geq \lambda\} \subseteq \bigcup_{k=1}^K \{\xi : \varphi(\xi; \mu_k, \Sigma_k) \geq \lambda / (K \pi_k)\} := \bigcup_{k=1}^K T_{n,k}.&lt;br /&gt;\]&lt;br /&gt;여기서 $\xi \sim GMM$이므로 $\varphi(\xi; \mu_k, \Sigma_k)$는 가우시안 밀도를 나타내며, 각 성분의 경계 $T_{n,k}$는 단순한 타원체 형태를 가진다. 이 정의를 통해 예측 밴드의 경계 계산이 효율적으로 수행될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 가우시안 혼합 모델(GMM) 기반 밀도 추정에서 성분 간 중첩이 클 경우,즉 가우시안 혼합모델을 구성하는 가우시안 분포들끼리 겹치는 부분이 크면 밴드가 지나치게 넓어진다는 것이다. 또 성분 분리가 명확하지 않을 때도 마찬가지로 불필요하게 큰 밴드로 인해 예측 정확도가 감소한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2-4. 개선된 경계 정의&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-4-1.성분 분리 기반 개선&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 함수 예측 밴드의 경계 정의를 개선하고자 혼합 성분 간 중첩을 줄이기 위해 다른 성분들과 얼마나 겹치는지를 나타내는 지표로써 $\delta_k$를 정의한다. :&lt;br /&gt;\[&lt;br /&gt;\delta_k = \sum_{s \neq k} \sup_{\xi} \left( \pi_k \varphi(\xi; \mu_k, \Sigma_k) \cap \pi_s \varphi(\xi; \mu_s, \Sigma_s) \right)&lt;br /&gt;\]&lt;br /&gt;위 값이 작을수록 모든 성분들이 잘 분리되어있다는 것이라 예측 밴드가 좁아져 더 정확한 $T_n$을 구할 수 있다.&lt;br /&gt;이를 기반으로 $T_n$을 다음과 같이 재정의한다:&lt;br /&gt;\[&lt;br /&gt;T_n = \bigcup_k \{ \xi : \varphi(\xi; \mu_k, \Sigma_k) \geq (\lambda - \delta_k)/\pi_k \}&lt;br /&gt;\]&lt;br /&gt;새로운 예측 밴드는 다음과 같이 계산된다:&lt;br /&gt;\[&lt;br /&gt;\tilde{B}_n(t) = \bigcup_k [\tilde{\ell}_k(t), \tilde{u}_k(t)], \quad \tilde{\ell}_k(t) = \inf_{\xi \in T_{n,k}} \xi^\top \phi(t), \tilde{u}_k(t) = \sup_{\xi \in T_{n,k}} \xi^\top \phi(t)&lt;br /&gt;\]&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2-4-2.최대 성분 기반 개선&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위 방법으로 경계를 정의해도 여전히 혼합 성분들이 잘 분리되지 않을 수 있다. 따라서 성분 중 최대 기여 성분만을 고려하여 밴드를 단순화한다:&lt;br /&gt;\[&lt;br /&gt;f(\xi) = \max_k \pi_k \varphi(\xi; \mu_k, \Sigma_k)&lt;br /&gt;\]&lt;br /&gt;\[&lt;br /&gt;B^\ast_n(t) = \bigcup_k [\ell^\ast_k(t), u^\ast_k(t)], \quad \ell^\ast_k(t) = \inf_{\xi \in T_{n,k}} \xi^\top \phi(t), u^\ast_k(t) = \sup_{\xi \in T_{n,k}} \xi^\top \phi(t)&lt;br /&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-filename=&quot;Fig_3.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qdd8G/dJMcae63ZwU/V80KfiUbDFxUgjlOnjAqLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qdd8G/dJMcae63ZwU/V80KfiUbDFxUgjlOnjAqLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qdd8G/dJMcae63ZwU/V80KfiUbDFxUgjlOnjAqLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQdd8G%2FdJMcae63ZwU%2FV80KfiUbDFxUgjlOnjAqLK%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;1502&quot; height=&quot;850&quot; data-filename=&quot;Fig_3.png&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gaussian Mixture Model (GMM)을 기반으로 한 예측 밴드 구성에서는 각 컴포넌트에 대한 영역을 단순히 합집합으로 표현할 수 있으며, 이는 통계적 효율성의 손실이 없다는 점에서 매우 유리하다. 이는 근사적 예측 밴드로 정의된 방식으로, 모든 가우시안 분포 컴포넌트의 밀도 합을 사용하여 경계를 구성하였을 때, 전체적인 예측 밴드의 성능이 보장됨을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, 최대 성분 기반 개선 방법처럼 max 함수와 같은 비-밀도 형태의 적합성 점수(non-density conformity scores)를 사용할 경우, 약간의 통계적 효율성  손실이 발생할 가능성이 있다.(*통계적 효율성: 같은 정보를 가지고 얼마나 정확하게 추정하느냐 말하는 지표) 이는 밀도를 합산하지 않고, 각 가우시안 컴포넌트에서 가장 큰 기여를 하는 밀도를 기반으로 경계를 정의하기 때문이다. 그러나 특정 함수에서 가장 큰 기여를 하는 가우시안 분포의 밀도가 높다면, 전체 밀도 역시 높게 유지되는 경향이 있다. 따라서 max 함수 기반의 적합성 점수 방식은 정확성 손실이 제한적이며, 계산의 단순성과 효율성 면에서 실질적인 이점을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 각 가우시안 분포의 밀도의 최대값으로 순위를 매기는 방식(Ranking max component density)은 모든 가우시안 분포의 밀도 합으로 순위를 매기는 방식(Ranking density)과 유사한 결과를 도출한다. 이는 max 함수 방식이 밀도 합산 방식에 비해 커버리지를 크게 손상시키지 않으며, 예측 밴드의 정확성을 일정 수준 유지한다는 것을 보여준다. 결과적으로, GMM 기반 예측 밴드는 데이터 분포를 효율적으로 표현하며, 두 가지 접근법 모두 실용적인 해법으로 간주될 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3.유사밀도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 함수의 차원을 축소하여 FDA를 하여 CP를 수행하는 분석을 하였다. 하지만 차원 축소를 사용하면 원본 데이터의 복잡성을 모두 반영하기 어렵다. 특히 클러스터링 기법은 데이터 포인트가 밀도가 높은 영역에서 그룹을 형성한다는 가정에 기반한다. 그런데 함수 공간에서는 일반적인 확률 밀도 함수(density function)를 정의하기 어렵다. 이는 $L^2[0,1]$와 같은 무한 차원 공간에서 유한 지배 측도($\sigma$-finite dominating measure)가 존재하지 않기 때문이다. 이에 따라 밀도를 대체할 수 있는 방법으로 유사 밀도(pseudo-density)가 제안되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유사 밀도는 데이터 간 거리를 바탕으로 밀도 수준을 계산하므로, 함수 데이터에서 원본 정보를 보존하면서 밀도를 추정하여 보다 정확한 클러스터링을 할 수 있다. 이를 통해 고밀도 영역(high-density regions)과 이상치(anomalies)를 효과적으로 탐지할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1.유사 밀도 추정 방법&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;유사 밀도는 다음과 같은 커널 밀도 추정 방식을 따른다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;\hat{p}_h(u) = \frac{1}{n} \sum_{i=1}^n K\left(\frac{d(u, X_i)}{h}\right)&lt;br /&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;$K$: 커널 함수로, 일반적으로 가우시안 커널을 사용한다.&lt;br /&gt;$h$: 대역폭(bandwidth)으로, 데이터 간 거리 계산에 영향을 미친다.&lt;br /&gt;$d(f, g) = \sqrt{\int (f(t) - g(t))^2 dt}$: 함수 간 거리(Euclidean distance)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$h$ 값이 클수록 밀도가 넓게 계산되어 데이터의 전체적인 구조를 파악하는 데 유리하며, $h$가 작을수록 데이터의 세부적인 패턴을 탐지할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3-1-1.예측 집합 근사 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;유사 밀도를 기반으로 예측 집합을 구성할 때, 직접적인 계산은 어렵기 때문에 근사 방법을 활용한다. 예측 집합은 다음과 같이 정의된다:&lt;br /&gt;\[&lt;br /&gt;C_{n,\alpha} = \{ f : \pi(f) &amp;gt; \alpha \}, \quad \pi(f) = \frac{1 + \sum_{i=1}^n \mathbb{I}(\hat{p}_h(X_i) \leq \hat{p}_h(f))}{n+1}&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 실제 계산에서 $C_{n,\alpha}$는 데이터 수가 많거나 함수 간 거리가 복잡할 경우 계산 부담이 크다. 이를 해결하기 위해 근사 집합 $C_{n,\alpha}^+ $를 정의하여 사용한다:&lt;br /&gt;\[&lt;br /&gt;C_{n,\alpha} \subseteq C_{n,\alpha}^+ = \{ f : \hat{p}_h(f) \geq \lambda - \frac{n^{-1} K(0)}{h} \}&lt;br /&gt;\]&lt;br /&gt;이 근사 집합은 $C_{n,\alpha}$의 성능을 유지하면서 계산 효율성을 크게 향상시킨다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 결과 분석: 이상치, 중앙값, 고밀도 곡선&lt;/li&gt;
&lt;li&gt;Neuron 데이터를 기반으로 Conformal Prediction을 적용한 결과, 다음과 같은 세 가지 곡선을 도출하였다:&lt;/li&gt;
&lt;li&gt;이상치 (Anomalies): $\alpha$ 값이 0에 가까운 곡선으로, 데이터에서 드물게 나타나는 비정상적인 패턴이다.&lt;br /&gt;중앙값 곡선 (Median Set): $\alpha = 0.5$에서 데이터의 대표적인 구조적 특징을 나타내는 곡선이다.&lt;br /&gt;고밀도 영역 (High Density): $\alpha$ 값이 1에 가까운 곡선으로, 데이터에서 가장 빈번하게 관찰되는 구조적 패턴이다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sets.png&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buJDxj/dJMcaiaytyh/Q9rz5Ibbz8jYG0kloKOCZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buJDxj/dJMcaiaytyh/Q9rz5Ibbz8jYG0kloKOCZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buJDxj/dJMcaiaytyh/Q9rz5Ibbz8jYG0kloKOCZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuJDxj%2FdJMcaiaytyh%2FQ9rz5Ibbz8jYG0kloKOCZK%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;1217&quot; height=&quot;793&quot; data-filename=&quot;sets.png&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;793&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 결과 분석 : Conformal Cluster Tree의 활용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Conformal Cluster Tree는 $\alpha$값을 기반으로 데이터의 계층적 구조를 시각화하는 데 사용된다. 이는 데이터의 분포 구조와 고밀도 영역을 명확히 이해하는 데 유용하다. 클러스터 트리는 다음과 같은 단계로 구성된다:&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\alpha$ 값을 기준으로 예측 집합 $C_{n,\alpha}$를 정의한다.&lt;br /&gt;함수 간 거리 $d(f, g)$가 특정 임계값 $\epsilon$ 이하인 경우 노드 간 연결을 형성한다.&lt;br /&gt;$\alpha$값이 증가할수록 클러스터가 세분화되며, 최종적으로 각 노드는 하나의 데이터 포인트로 축소된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cluster_tree.png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C4Gxg/dJMcaiO94Cj/rGHpk2w6z4daTNwyHpmcn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C4Gxg/dJMcaiO94Cj/rGHpk2w6z4daTNwyHpmcn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C4Gxg/dJMcaiO94Cj/rGHpk2w6z4daTNwyHpmcn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC4Gxg%2FdJMcaiO94Cj%2FrGHpk2w6z4daTNwyHpmcn0%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;1233&quot; height=&quot;820&quot; data-filename=&quot;cluster_tree.png&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.결론 및 향후 연구&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서는 Conformal Prediction 방법을 함수형 데이터에 확장하여 분포에 구애받지 않는 예측 밴드를 구성하였다. 이러한 예측 밴드는 제한된 데이터 샘플에서도 신뢰할 수 있는 성능을 보장하며, 새로운 데이터가 속할 가능성이 가장 높은 영역을 나타낸다. 특히, 이 예측 밴드는 분위수 집합(quantile sets)으로 해석될 수 있어 데이터의 분포 구조를 직관적으로 이해하는 데 기여한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 의사 밀도(pseudo-density)를 기반으로 한 적합 예측을 통해 데이터의 계층적 특징(hierarchical features)을 효과적으로 드러낼 수 있었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 향후 연구 방향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 논문에서 제시한 방법을 고도화하기 위해 다음과 같은 연구 방향을 제시하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 고차원 설정으로의 확장이 필요하다. Conformal Prediction 방법을 다양한 고차원 함수형 데이터에 적용하고, 이를 위한 적합 점수(conformity scores)를 확장하는 연구가 요구된다. 둘째, 적합 점수의 최적화가 중요한 과제로 남아 있다. 데이터의 특성에 맞는 적합 점수를 정의하고, 이를 최적화함으로써 예측 밴드의 성능을 더욱 향상시킬 수 있다. 마지막으로, 튜닝 매개변수의 최적화를 통해 예측 성능을 개선해야 한다. Conformal Prediction에서 사용되는 튜닝 매개변수(tuning parameters)를 체계적으로 최적화하는 방법론을 마련하는 것이 필요하다.&lt;/p&gt;</description>
      <category>논문</category>
      <author>김통계임</author>
      <guid isPermaLink="true">https://siuni.tistory.com/1</guid>
      <comments>https://siuni.tistory.com/1#entry1comment</comments>
      <pubDate>Tue, 7 Oct 2025 23:40:50 +0900</pubDate>
    </item>
  </channel>
</rss>