<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title/><link>https://chaeniverse.github.io/</link><atom:link href="https://chaeniverse.github.io/index.xml" rel="self" type="application/rss+xml"/><description/><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Mon, 05 Jan 2026 00:00:00 +0000</lastBuildDate><image><url>https://chaeniverse.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title/><link>https://chaeniverse.github.io/</link></image><item><title>MBTI Persona Priming prompt research</title><link>https://chaeniverse.github.io/projects/kpop-virtual-idol-mbti/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/kpop-virtual-idol-mbti/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;p&gt;K-Pop 가상 아이돌 앱 프로젝트의 일부로 진행한 &lt;strong&gt;챗봇 persona 사전조사&lt;/strong&gt; 입니다. LLM에 일관된 성격을 부여하기 위한 출발점으로, 심리 프로필 priming 방식의 framework — &lt;strong&gt;arXiv 논문 &lt;em&gt;Psychologically Enhanced AI Agents&lt;/em&gt;&lt;/strong&gt; (
) 와 그 official 구현
를 검토하고, 검증 흐름·prompt 변종 비교를 정리했습니다.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;보안 안내.&lt;/strong&gt; 본 프로젝트는 일부 대외비 작업이 포함되어, 실제 가상 아이돌에 사용될 priming 전문·생성 결과·내부 도식은 공개하지 않습니다. 본 페이지는 적용한 &lt;strong&gt;공개 framework와 실험 설계&lt;/strong&gt;를 중심으로 기술합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="1-framework"&gt;1. Framework&lt;/h2&gt;
&lt;h3 id="11-검증-방법--사용-모델"&gt;1.1 검증 방법 — 사용 모델&lt;/h3&gt;
&lt;p&gt;검증 단계 LLM: &lt;strong&gt;GPT-4o-mini&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="12-flow-예-enfj"&gt;1.2 Flow (예: ENFJ)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;priming.json&lt;/code&gt; — 16개 MBTI 유형 각각에 대한 priming prompt가 정의돼 있다. 챗봇에 system prompt로 주입한다.&lt;/li&gt;
&lt;li&gt;한 유형(예: ENFJ)에 대해 &lt;strong&gt;16Personalities 공식 설문 기반 60문항&lt;/strong&gt;을 던진다. 60문항은 E/I, S/N, F/T, J/P 네 축을 결정짓는 항목들로 구성.&lt;/li&gt;
&lt;li&gt;각 문항에 대해 동일한 priming + 동일한 질문을 &lt;strong&gt;15회 반복&lt;/strong&gt; 한다 (응답 일관성 검증).
&lt;ul&gt;
&lt;li&gt;Temperature = 1.0이라 매번 약간씩 다른 응답이 나올 수 있음.&lt;/li&gt;
&lt;li&gt;일관성이 높으면 priming 성공, 낮으면 실패.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="13-likert-환산"&gt;1.3 Likert 환산&lt;/h3&gt;
&lt;p&gt;15번 응답을 7점 척도(score)로 환산한다 — 16Personalities 공식 테스트가 7점 척도를 사용하기 때문.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;score_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;agree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;generally agree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;partially agree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;neither agree nor disagree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;partially disagree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;generally disagree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;disagree&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;15회의 score를 평균해 한 문항의 응답값으로 삼고, 60문항에 대해 같은 절차를 수행.&lt;/p&gt;
&lt;h3 id="14-결과-시각화"&gt;1.4 결과 시각화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;60문항 중 E/I 축을 결정하는 약 10개 문항을 모아 그 sample 평균을 좌표에 찍고 BoxPlot으로 분포를 본다.&lt;/li&gt;
&lt;li&gt;ENFJ로 priming한 LLM이 E축 문항에서 외향적인 응답(예: 평균 −3 근처)을 일관되게 보이는지 검증.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;결론: &lt;strong&gt;이 priming을 prompt로 썼을 때 LLM이 MBTI 특성을 분명히 구분해 응답한다&lt;/strong&gt; 는 가설을 BoxPlot으로 시각적으로 검증.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="2-prompt-변종--3종-비교"&gt;2. Prompt 변종 — 3종 비교&lt;/h2&gt;
&lt;p&gt;priming 구조의 어느 부분이 효과를 내는지 확인하기 위해 3종의 변종을 비교했다.&lt;/p&gt;
&lt;h3 id="a-only-mbti"&gt;A. Only MBTI&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You are an {MBTI_TYPE}.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;→ MBTI 유형 라벨만 주는 가장 짧은 형태.&lt;/p&gt;
&lt;h3 id="b-mbti--description-structured-priming"&gt;B. MBTI + Description (Structured Priming)&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;MBTI 라벨&lt;/code&gt; + 다음 6개 카테고리로 구조화된 description 을 함께 부여한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Communication Style&lt;/strong&gt; (소통 방식)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leadership and Management Style&lt;/strong&gt; (리더십)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problem-Solving Approach&lt;/strong&gt; (문제 해결)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interpersonal Relationships&lt;/strong&gt; (대인 관계)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handling Change and Stress&lt;/strong&gt; (스트레스 대처)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application in Various Contexts&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;description 은 MBTI 공식 문헌 (&lt;em&gt;Myers and Myers, 1980, &amp;ldquo;Gifts Differing&amp;rdquo;&lt;/em&gt;) 기반으로 LLM 요약을 거쳐 작성.&lt;/p&gt;
&lt;h3 id="c-only-description"&gt;C. Only Description&lt;/h3&gt;
&lt;p&gt;위 6개 카테고리만 두고 &lt;strong&gt;MBTI 라벨은 제거&lt;/strong&gt;. 라벨이 priming 효과를 내는지, 설명이 효과를 내는지 분리해 보기 위함.&lt;/p&gt;
&lt;h2 id="3-추가-검증--writingprompt-태스크"&gt;3. 추가 검증 — WritingPrompt 태스크&lt;/h2&gt;
&lt;p&gt;성격 priming이 &lt;strong&gt;창작 응답&lt;/strong&gt;에서도 일관되게 나타나는지 확인하기 위한 별도 검증.&lt;/p&gt;
&lt;h3 id="flow"&gt;Flow&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;priming(예: INFJ prompt)을 LLM에 주입.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reddit r/WritingPrompts&lt;/strong&gt; 에서 100개 글쓰기 프롬프트를 LLM에게 제공 → 각 prompt에 대해 짧은 스토리 생성.
&lt;ul&gt;
&lt;li&gt;Story generator: &lt;strong&gt;Qwen3-235B-A22B&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;생성된 스토리를 &lt;strong&gt;LLM-as-judge&lt;/strong&gt; 가 1–5점으로 평가.
&lt;ul&gt;
&lt;li&gt;Judge: &lt;strong&gt;Qwen2.5-14B-Instruct&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;평가 기준: PersonaLLM 등 선행 연구의 persona consistency 지표.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;→ 동일한 LLM이 다른 MBTI priming 하에서 글쓰기 스타일이 일관되게 달라지는지를 정량 평가.&lt;/p&gt;
&lt;h2 id="stack"&gt;Stack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt; — 실험 파이프라인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLMs&lt;/strong&gt; — GPT-4o-mini (검증), Qwen3-235B-A22B (story generation), Qwen2.5-14B-Instruct (judge)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt; — system prompt 설계, priming 구조화, score 환산&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Psychologically Enhanced AI Agents&lt;/em&gt; —
&lt;/li&gt;
&lt;li&gt;Reference code —
&lt;/li&gt;
&lt;li&gt;Myers, I. B., &amp;amp; Myers, P. B. (1980). &lt;em&gt;Gifts Differing: Understanding Personality Type&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;16Personalities 공식 설문 (60문항, 7점 Likert)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Long-term Opioid Use in Newly Diagnosed Multiple Myeloma</title><link>https://chaeniverse.github.io/projects/mm-opioid-longterm/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/mm-opioid-longterm/</guid><description>&lt;h4 id="개요"&gt;개요&lt;/h4&gt;
&lt;p&gt;신규 진단(newly diagnosed) 다발골수종(multiple myeloma, MM) 환자가 오피오이드 진통제를 시작했을 때, 얼마나 자주 장기 사용으로 이어지는지, 어떤 베이스라인 인자가 이를 예측하는지를 규명하는 전국 단위 후향적 코호트 연구입니다.&lt;/p&gt;
&lt;h4 id="배경"&gt;배경&lt;/h4&gt;
&lt;p&gt;다발골수종은 진단 시점에 70–80% 환자가 골 통증을 호소할 정도로 통증 부담이 큰 질환입니다. 오피오이드는 중등도 이상 통증의 표준 치료지만, 약 6개월 이상 사용하면 내성·의존·부작용 등으로 중단이 어려워집니다. 기존 연구는 주로 단일 기관 또는 서구 코호트 기반이며, 한국과 같이 엄격한 처방 환경에서의 인구 단위 근거는 제한적인 편입니다.&lt;/p&gt;
&lt;h4 id="데이터"&gt;데이터&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;출처&lt;/strong&gt;: 건강보험심사평가원(HIRA) 데이터베이스 — 한국 인구의 97% 이상 커버&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;포함 기준&lt;/strong&gt;: 2009.01.01 – 2023.08.31에 신규 MM으로 진단되고, 진단 후 3개월 이내 ≥ 14일 누적 오피오이드 처방을 받은 성인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;추적&lt;/strong&gt;: 2024.08.31까지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분석 코호트&lt;/strong&gt;: &lt;strong&gt;3,621명&lt;/strong&gt; (중위 연령 66.0세 [IQR 59.0–73.0], 여성 47.1%)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="노출-exposures"&gt;노출 (Exposures)&lt;/h4&gt;
&lt;p&gt;진단 후 3개월 이내 오피오이드 강도를 다음 3군으로 분류 — equianalgesic dose ratio와 WHO analgesic ladder에 따라:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Weak only&lt;/li&gt;
&lt;li&gt;Strong only&lt;/li&gt;
&lt;li&gt;Weak and strong&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="결과-변수-outcome"&gt;결과 변수 (Outcome)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;장기 오피오이드 사용&lt;/strong&gt; — MM 진단 후 6개월을 초과해 처방이 지속된 경우.&lt;/p&gt;
&lt;h4 id="결과"&gt;결과&lt;/h4&gt;
&lt;p&gt;전체 3,621명 중 **2,377명(65.6%)**이 장기 오피오이드 사용으로 진행했습니다. 강도가 높을수록 장기 사용 비율이 증가했습니다:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;초기 강도&lt;/th&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;th&gt;장기 사용률&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Weak only&lt;/td&gt;
&lt;td&gt;1,535&lt;/td&gt;
&lt;td&gt;52.4% (804)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong only&lt;/td&gt;
&lt;td&gt;1,049&lt;/td&gt;
&lt;td&gt;70.7% (742)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weak and strong&lt;/td&gt;
&lt;td&gt;1,037&lt;/td&gt;
&lt;td&gt;80.1% (831)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;(P &amp;lt; 0.001)&lt;/p&gt;
&lt;p&gt;다변량 로지스틱 회귀에서 &lt;strong&gt;오피오이드 강도가 가장 강한 예측 인자&lt;/strong&gt;였습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strong only vs weak only: aOR &lt;strong&gt;2.25&lt;/strong&gt; (95% CI, 1.90–2.66)&lt;/li&gt;
&lt;li&gt;Weak and strong vs weak only: aOR &lt;strong&gt;3.64&lt;/strong&gt; (95% CI, 3.02–4.38)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 외에도 고연령, 기분/수면 장애 동반, bortezomib 기반 치료, 사전 오피오이드 사용 등이 독립적 예측 인자였습니다.&lt;/p&gt;
&lt;h4 id="위험-점수-모형"&gt;위험 점수 모형&lt;/h4&gt;
&lt;p&gt;베이스라인 인자들로 위험 점수 모형을 개발해 환자를 저/중/고위험군으로 분류했습니다. 군별 장기 사용률은 다음과 같습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;저위험: &lt;strong&gt;55.1%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;중위험: &lt;strong&gt;65.0%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;고위험: &lt;strong&gt;74.3%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="결론"&gt;결론&lt;/h4&gt;
&lt;p&gt;전국 인구 단위 데이터로 본 결과, 신규 진단 MM 환자가 오피오이드를 시작하면 &lt;strong&gt;약 2/3가 6개월 이상 장기 사용&lt;/strong&gt;으로 이어졌습니다. 보수적 처방 환경에서도 이 양상이 지속된다는 점은 &lt;strong&gt;오피오이드 시작 시점에서의 위험 기반 통증 관리 계획&lt;/strong&gt;의 임상적 필요성을 보여줍니다.&lt;/p&gt;
&lt;h4 id="진행-상황"&gt;진행 상황&lt;/h4&gt;
&lt;p&gt;논문 작성 중 (Manuscript in Preparation, 1저자).&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Chaehyeon Lee, Suein Choi, Sung-Soo Park, &amp;ldquo;Patterns and Predictors of Long-term Opioid Use in Patients with Newly Diagnosed Multiple Myeloma: A Nationwide Real-world Study&amp;rdquo; (제출 준비 중).&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Casting Image Generation</title><link>https://chaeniverse.github.io/projects/kpop-virtual-idol-casting-image/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/kpop-virtual-idol-casting-image/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;p&gt;K-Pop 가상 아이돌 앱의 캐릭터를 캐스팅하기 위한 이미지 생성 프로젝트. &lt;strong&gt;얼굴·스타일·분위기 일관성&lt;/strong&gt; 을 만족하는 트레이니 후보군을 prompt 설계 + 반복 생성 + 정성 평가로 좁혀나갔습니다.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;보안 안내.&lt;/strong&gt; 본 프로젝트는 일부 대외비 작업이 포함되어, 실제 prompt 전문·생성 이미지·캐릭터 식별 정보는 공개하지 않습니다. 본 페이지는 &lt;strong&gt;실험 단계와 방법론&lt;/strong&gt; 중심으로 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="단계별-진화"&gt;단계별 진화&lt;/h2&gt;
&lt;h3 id="step-1--초기-캐스팅-prompt-설계"&gt;Step 1 — 초기 캐스팅 prompt 설계&lt;/h3&gt;
&lt;p&gt;목표: 가상 아이돌 트레이니의 변수 축을 prompt 변수로 정의하고, 그 격자로 후보 군을 만드는 것.&lt;/p&gt;
&lt;p&gt;변수 축 (공개 가능 범위):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;인종 (Race)&lt;/li&gt;
&lt;li&gt;성별 (Gender)&lt;/li&gt;
&lt;li&gt;분위기 (Mood)&lt;/li&gt;
&lt;li&gt;(그 외 축은 비공개)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;각 조합을 prompt template에 끼워 여러 조합을 만들고, trial 2회씩 반복해 안정성을 봤습니다.&lt;/p&gt;
&lt;p&gt;Prompt 구조 (요약):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;핵심 묘사: 변수 축 조합&lt;/li&gt;
&lt;li&gt;스타일 지침: photorealistic K-pop trainee profile photo&lt;/li&gt;
&lt;li&gt;구도: chest-up, front-facing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-2--id-사진-정제"&gt;Step 2 — ID 사진 정제&lt;/h3&gt;
&lt;p&gt;Step 1 결과에서 발견된 문제 (배경 색감이 인물 식별을 방해, 메이크업 표현 일관성 부족) 를 해결하기 위해 prompt 변종을 비교하고, 정체성을 깨는 요소를 막기 위한 &lt;strong&gt;negative constraints&lt;/strong&gt; 를 추가했습니다.&lt;/p&gt;
&lt;p&gt;→ 흰 배경 + 메이크업 무관 + 부정 제약으로 &lt;strong&gt;ID 사진의 정체성 일관성&lt;/strong&gt; 확보.&lt;/p&gt;
&lt;h3 id="step-3--visual-upgrade"&gt;Step 3 — Visual Upgrade&lt;/h3&gt;
&lt;p&gt;Step 2의 ID 사진을 reference로 두고, 같은 인물성을 유지하면서 &lt;strong&gt;사진 품질을 끌어올리는&lt;/strong&gt; prompt 변종을 비교. 채택된 best 버전이 후속
단계의 기본 reference로 사용됨.&lt;/p&gt;
&lt;h2 id="대규모-캐스팅-런-casting-runs"&gt;대규모 캐스팅 런 (Casting Runs)&lt;/h2&gt;
&lt;p&gt;Prompt 설계가 어느 정도 안정화된 후, 후보 다양성 확보를 위한 &lt;strong&gt;대규모 반복 생성&lt;/strong&gt; — 총 12회 캐스팅 런으로 &lt;strong&gt;약 800장&lt;/strong&gt; 생성. 각 런마다 약간씩 다른 prompt seed / 변수 조합 / 모델 파라미터로 결과 분포를 확장하고, 결과를 정성 검수해 &lt;strong&gt;최종 prompt&lt;/strong&gt; 를 확정.&lt;/p&gt;
&lt;h2 id="결과-분석-관점-정성-요약"&gt;결과 분석 관점 (정성 요약)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;prompt 변수 축의 분리도&lt;/strong&gt; — 인상·분위기는 잘 구분되지만, &lt;strong&gt;헤어 (특히 색상) 와 메이크업이 서로 영향을 주고받는 경향&lt;/strong&gt; 이 있었음 (예: 헤어 색만 바꿨는데 메이크업 톤도 같이 변함). 두 축을 독립적으로 제어하려면 명시적 negative constraint 가 필요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;스케일 효과&lt;/strong&gt; — 여러 번의 반복 실험을 거쳐 안정적인 후보를 확보. &lt;strong&gt;prompt 설계만으로는 한계가 있고, 양적 탐색이 동반돼야 함.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="자동화-파이프라인"&gt;자동화 파이프라인&lt;/h2&gt;
&lt;p&gt;각 런은 다음 자동화 위에서 실행:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prompt template + 변수 격자&lt;/strong&gt; — Python으로 모든 조합을 펼침&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API 호출&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML report 자동 생성&lt;/strong&gt; — combo·trial 단위로 시각적으로 비교 가능한 리포트 자동 출력 (정성 검수용)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="stack"&gt;Stack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini Flash Image Preview&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt; — 5축 변수 정의, system prompt, negative constraints&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="다음-단계--관련"&gt;다음 단계 / 관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;확정된 companion profile 을 reference로 →
(다양한 scene 의 콘텐츠 컷)&lt;/li&gt;
&lt;li&gt;특정 포즈 정제 →
&lt;/li&gt;
&lt;li&gt;챗봇 persona 결합 →
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Future DaTScan Synthesis for Parkinson's Progression with Conditional Wavelet Diffusion</title><link>https://chaeniverse.github.io/projects/ppmi-cwdm-progression/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/ppmi-cwdm-progression/</guid><description>&lt;h4 id="개요"&gt;개요&lt;/h4&gt;
&lt;p&gt;파킨슨병(Parkinson&amp;rsquo;s disease, PD) 환자의 도파민 신경 퇴행 진행을 예측하기 위한 딥러닝 프레임워크입니다. 초기(screening) DaTScan SPECT 영상 한 장을 조건으로 2년 후(V04) 시점의 DaTScan 영상을 합성해, 반복 촬영 없이 개인 수준의 진행 양상을 시각적으로 예측합니다.&lt;/p&gt;
&lt;p&gt;기존 연구는 미래 UPDRS 점수 등 &lt;strong&gt;수치 예측&lt;/strong&gt;에 그쳤지만, 본 연구는 &lt;strong&gt;영상 자체를 생성&lt;/strong&gt;해 도파민 손실의 공간적 분포를 정성적으로도 보여줍니다. 임상에서 의사가 영상을 직접 판독해 진단하는 현실을 고려하면 정량 + 정성 모두 의미가 있습니다.&lt;/p&gt;
&lt;h4 id="배경"&gt;배경&lt;/h4&gt;
&lt;p&gt;DaTScan은 파킨슨병 진단의 핵심 영상 바이오마커지만, 방사선 피폭, 추적자 주입 후 3–6시간 대기, 핵의학 장비 접근성, 운동 증상이 진행된 환자의 SPECT 자세 유지 어려움 등으로 종단적(longitudinal) 추적 촬영에 실질적 제약이 따릅니다. 초기 영상만으로 미래 시점의 도파민 분포 패턴을 예측할 수 있다면, 불필요한 반복 촬영 없이 개인화된 예후 예측과 조기 예방적 권고가 가능해집니다.&lt;/p&gt;
&lt;h4 id="데이터"&gt;데이터&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;출처&lt;/strong&gt;: Parkinson&amp;rsquo;s Progression Markers Initiative (PPMI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;구성&lt;/strong&gt;: 스크리닝(SC) 시점과 2년 후(V04) 시점의 DaTScan SPECT 영상 쌍, 품질 관리 후 &lt;strong&gt;746쌍&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전처리&lt;/strong&gt;: 공간 정규화 + 강도 정규화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분할&lt;/strong&gt;: train / validation / test = 7 : 1.5 : 1.5&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="방법론"&gt;방법론&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;조건부 웨이블릿 확산 모델 (cWDM).&lt;/strong&gt; Friedrich et al. (2024)의 cWDM 프레임워크를 적용했습니다. 학습 기반 오토인코더와 달리 웨이블릿 변환은 &lt;strong&gt;정보 손실 없이&lt;/strong&gt; 영상을 저주파(전체 구조)와 고주파(세밀한 디테일) 성분으로 분해하고, 역변환으로 완벽 복원합니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3D Haar Wavelet.&lt;/strong&gt; 128³ 복셀 영상을 64³ × 8채널의 웨이블릿 계수로 분해해 모든 정보를 보존하면서 연산량을 크게 줄였습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;손실 함수.&lt;/strong&gt; 표준 DDPM noise prediction loss:&lt;/p&gt;
$$\mathcal{L} = \mathbb{E}_{t, \mathbf{x}_0, \boldsymbol{\epsilon}} \big[\, \|\boldsymbol{\epsilon} - \boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t, \mathbf{c})\|^2 \,\big]$$&lt;p&gt;조건 변수 &lt;strong&gt;c&lt;/strong&gt; 는 baseline (SC 시점) DaTScan 영상입니다.&lt;/p&gt;
&lt;h4 id="평가-지표"&gt;평가 지표&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;영상 품질&lt;/strong&gt;: PSNR, SSIM, RMSE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;임상적 유효성&lt;/strong&gt;: Striatal Binding Ratio (SBR) — 미상핵(caudate), 피각(putamen), 피각/미상핵 비율(P/C ratio)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정성 평가&lt;/strong&gt;: 임상용 color lookup table을 적용해 baseline · 실제 V04 · 합성 V04 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="결과"&gt;결과&lt;/h4&gt;
&lt;p&gt;테스트 세트(n = 112)에서 합성된 V04 영상의 정량 성능:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PSNR&lt;/strong&gt;: 21.99 ± 2.40 dB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSIM&lt;/strong&gt;: 0.6452 ± 0.065&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;부위별 SBR은 실제 추적 영상과 강한 상관을 보였습니다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;전체 선조체(striatum)&lt;/strong&gt;: r = 0.676, p &amp;lt; 0.001&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;미상핵(caudate)&lt;/strong&gt;: r = 0.699, p &amp;lt; 0.001&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;피각(putamen)&lt;/strong&gt;: r = 0.660, p &amp;lt; 0.001&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;피각/미상핵 비율 (P/C ratio)&lt;/strong&gt;: r = 0.670, p &amp;lt; 0.001&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;임상용 color scale을 적용한 정성적 비교에서, 합성 영상은 선조체 영역의 전반적 섭취 위치를 반영하였으나 세부 구조의 선명도에는 한계가 있었습니다.&lt;/p&gt;
&lt;h4 id="결론"&gt;결론&lt;/h4&gt;
&lt;p&gt;단일 초기 DaTScan 영상으로부터 2년 후 영상을 합성하는 딥러닝 프레임워크를 제시했고, 피각/미상핵 비율을 포함한 부위별 진행 지표에서 실제 추적 영상과 유의한 상관관계를 확인했습니다. 향후 임상 변수와의 결합을 통해 개인화된 파킨슨병 진행 예측 모델로 확장될 수 있습니다.&lt;/p&gt;
&lt;h4 id="성과"&gt;성과&lt;/h4&gt;
&lt;p&gt;이채현, 이기림, 정봉기, 최수인, 박보용, &amp;ldquo;딥러닝 기반 파킨슨병 도파민 수송체 영상의 종단적 진행 예측: 조건부 웨이블릿 확산 모델을 활용한 미래 DaTScan 영상 합성&amp;rdquo;, &lt;em&gt;한국통계학회&lt;/em&gt;, 2026 (포스터, 1저자).&lt;/p&gt;</description></item><item><title>OPT2I — Iterative Prompt Refinement</title><link>https://chaeniverse.github.io/projects/kpop-virtual-idol-opt2i/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/kpop-virtual-idol-opt2i/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;p&gt;가상 아이돌 캐릭터의 &lt;strong&gt;특정 자세&lt;/strong&gt; 컷을 prompt 만으로 안정적으로 생성하기 어려워, &lt;strong&gt;iterative prompt refinement&lt;/strong&gt; 알고리즘을 적용한 실험. 베이스 알고리즘은 Mañas et al. (2024) 의 &lt;strong&gt;OPT2I&lt;/strong&gt; — LLM을 prompt optimizer로 두고 반복적으로 prompt를 다듬어 vision-language metric을 끌어올리는 방법.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;보안 안내.&lt;/strong&gt; 본 프로젝트는 일부 대외비 작업이 포함되어, 실제 prompt 전문·생성 이미지·캐릭터 식별 정보는 공개하지 않습니다. 본 페이지는 &lt;strong&gt;알고리즘 구조와 실험 설계&lt;/strong&gt; 중심으로 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="1-opt2i-알고리즘-요약"&gt;1. OPT2I 알고리즘 (요약)&lt;/h2&gt;
&lt;p&gt;OPT2I는 text-to-image 생성에서 prompt-image alignment 를 끌어올리기 위한 &lt;strong&gt;LLM-as-optimizer 루프&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ne"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_prompt&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;초기&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;best_prompt&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;최적화된&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;LLM이&lt;/span&gt; &lt;span class="err"&gt;현재&lt;/span&gt; &lt;span class="n"&gt;best&lt;/span&gt; &lt;span class="n"&gt;prompt를&lt;/span&gt; &lt;span class="err"&gt;변주해&lt;/span&gt; &lt;span class="n"&gt;K개의&lt;/span&gt; &lt;span class="n"&gt;variant&lt;/span&gt; &lt;span class="err"&gt;생성&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="err"&gt;각&lt;/span&gt; &lt;span class="n"&gt;variant로&lt;/span&gt; &lt;span class="err"&gt;이미지&lt;/span&gt; &lt;span class="err"&gt;생성&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T2I&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="err"&gt;각&lt;/span&gt; &lt;span class="err"&gt;이미지의&lt;/span&gt; &lt;span class="n"&gt;alignment&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="err"&gt;측정&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CLIPScore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ImageReward&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DSG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mf"&gt;4.&lt;/span&gt; &lt;span class="err"&gt;가장&lt;/span&gt; &lt;span class="err"&gt;높은&lt;/span&gt; &lt;span class="err"&gt;점수의&lt;/span&gt; &lt;span class="n"&gt;prompt를&lt;/span&gt; &lt;span class="err"&gt;다음&lt;/span&gt; &lt;span class="n"&gt;round의&lt;/span&gt; &lt;span class="n"&gt;seed로&lt;/span&gt; &lt;span class="err"&gt;채택&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mf"&gt;5.&lt;/span&gt; &lt;span class="err"&gt;점수가&lt;/span&gt; &lt;span class="err"&gt;더&lt;/span&gt; &lt;span class="err"&gt;이상&lt;/span&gt; &lt;span class="err"&gt;개선되지&lt;/span&gt; &lt;span class="err"&gt;않으면&lt;/span&gt; &lt;span class="err"&gt;조기&lt;/span&gt; &lt;span class="err"&gt;종료&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;핵심 가정: &lt;strong&gt;LLM이 좋은 prompt 생성기일 뿐 아니라 좋은 prompt 비평가&lt;/strong&gt; 도 될 수 있다 → 이전 round의 점수와 prompt 변종 패턴을 LLM context에 넣어 더 나은 변주를 유도.&lt;/p&gt;
&lt;p&gt;→ 논문:
&lt;/p&gt;
&lt;h2 id="2-구현--round--variant-격자"&gt;2. 구현 — Round × Variant 격자&lt;/h2&gt;
&lt;p&gt;본 실험에서 사용한 OPT2I 변형 파이프라인:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;차원&lt;/th&gt;
&lt;th&gt;표기&lt;/th&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Round&lt;/td&gt;
&lt;td&gt;&lt;code&gt;R2 – R5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;최대 5 라운드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variant&lt;/td&gt;
&lt;td&gt;&lt;code&gt;V1 – V5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;라운드 당 후보 변종 수&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;각 round마다 &lt;strong&gt;variant 별 이미지&lt;/strong&gt; 를 모두 저장해 사후 정성 검수 + 정량 비교 가능하도록 했습니다.&lt;/p&gt;
&lt;h2 id="3-평가-metric--dsg-davidsonian-scene-graph"&gt;3. 평가 Metric — DSG (Davidsonian Scene Graph)&lt;/h2&gt;
&lt;p&gt;평가 metric으로 &lt;strong&gt;DSG (Davidsonian Scene Graph)&lt;/strong&gt; 를 결합.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DSG는 prompt를 &lt;strong&gt;scene graph atomic question&lt;/strong&gt; 들로 분해하고, VQA 모델로 각 question에 대한 응답 정확도를 평가.&lt;/li&gt;
&lt;li&gt;단일 score보다 &lt;strong&gt;prompt의 어떤 측면이 충족/실패&lt;/strong&gt; 했는지 지시적 (interpretable).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ &lt;code&gt;R-V&lt;/code&gt; 격자 결과를 DSG 점수로 비교해, &amp;ldquo;이 prompt 변주가 얼굴 형태는 잘 맞췄지만 헤어 길이 묘사가 약하다&amp;rdquo; 같은 진단을 자동화.&lt;/p&gt;
&lt;h2 id="4-결과-분석-관점-정성-요약"&gt;4. 결과 분석 관점 (정성 요약)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DSG 도입 효과&lt;/strong&gt; — DSG atomic 평가는 prompt의 어떤 부분이 부족한지 가리켜주어 &lt;strong&gt;다음 round prompt 변주의 방향성&lt;/strong&gt; 이 명확해짐.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Round 수 trade-off&lt;/strong&gt; — round R≥4부터는 점수 상승이 둔화되는 경향. &lt;strong&gt;R=5 cap&lt;/strong&gt; 으로도 충분.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비용&lt;/strong&gt; — round 수 × variant 수 × character 수 만큼 image API 호출이 늘어 비용이 빠르게 증가. 변종 1회당 약 $25–30 수준 (대략 추정).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="stack"&gt;Stack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt; — OPT2I 루프 구현, round/variant 격자 관리, 결과 집계&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini Flash Image Preview&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM-as-optimizer&lt;/strong&gt; — prompt 변주 생성용 LLM (variant 후보 생성)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DSG (Davidsonian Scene Graph)&lt;/strong&gt; — alignment evaluation metric&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mañas et al., &lt;em&gt;Improving Text-to-Image Consistency via Automatic Prompt Optimization&lt;/em&gt;, 2024 —
&lt;/li&gt;
&lt;li&gt;Cho et al., &lt;em&gt;Davidsonian Scene Graph: Improving Reliability in Fine-grained Evaluation for Text-to-Image Generation&lt;/em&gt;, ICLR 2024&lt;/li&gt;
&lt;li&gt;Implementation —
(OPT2I + DSG core + side/fullbody runners)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="관련"&gt;관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;트레이니 캐스팅 단계 →
&lt;/li&gt;
&lt;li&gt;콘텐츠 컷 단계 →
&lt;/li&gt;
&lt;li&gt;챗봇 persona 단계 →
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Content Image Generation</title><link>https://chaeniverse.github.io/projects/kpop-virtual-idol-content-generation/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/kpop-virtual-idol-content-generation/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;p&gt;K-Pop 가상 아이돌 앱 프로젝트의 일부로 진행한 &lt;strong&gt;콘텐츠 이미지 생성&lt;/strong&gt; 실험입니다. 가상 아이돌에게 다양한 scene을 입히면서도 캐릭터(얼굴) 정체성은 변하지 않도록, prompt 설계·reference conditioning·격자 탐색을 결합해 검증했습니다.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;보안 안내.&lt;/strong&gt; 본 프로젝트는 일부 대외비 작업이 포함되어, 실제 prompt 전문·생성 이미지·캐릭터 식별 정보는 공개하지 않습니다. 본 페이지는 &lt;strong&gt;실험 설계와 방법론&lt;/strong&gt; 중심으로 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="실험-목적"&gt;실험 목적&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;같은 캐릭터(얼굴)를 유지하면서, 다양한 scene의 콘텐츠 컷을 일관되게 생성할 수 있는가?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;일관성 (consistency)&lt;/strong&gt; — 캐릭터의 얼굴이 scene이 바뀌어도 같은 사람으로 인식되어야 함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;다양성 (variety)&lt;/strong&gt; — 같은 캐릭터라도 scene·구도·의상이 자연스럽게 변주되어야 함&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;콘셉트 표현&lt;/strong&gt; — 각 scene의 분위기 (일상의 자연스러움, 상황감, 아이돌 포즈) 가 prompt만으로 전달되어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="실험-설계"&gt;실험 설계&lt;/h2&gt;
&lt;h3 id="신scene-3종"&gt;신(Scene) 3종&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;신 ID&lt;/th&gt;
&lt;th&gt;콘셉트&lt;/th&gt;
&lt;th&gt;목적&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scene #1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;일상, 자연스러움&lt;/td&gt;
&lt;td&gt;자연스러운 표정 자세로 친근감 형성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scene #2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;시그니처 포즈&lt;/td&gt;
&lt;td&gt;팬 인터랙션용 정형 포즈 일관성 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scene #3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;특정 장소 배경&lt;/td&gt;
&lt;td&gt;콘셉트가 강한 narrative 컷의 prompt 표현력 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="reference-image-conditioning"&gt;Reference-Image Conditioning&lt;/h3&gt;
&lt;p&gt;각 콘텐츠 컷 생성 시 유저가 생성한 캐릭터 ID 사진을 reference로 함께 입력해, &lt;strong&gt;얼굴 정체성 유지&lt;/strong&gt; 를 강제합니다. Prompt 앞단에 다음과 같은 지침을 둡니다 (요약):&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;em&gt;Keep the person&amp;rsquo;s facial features exactly the same as the reference image. This is the same person, not a look-alike or approximation.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이를 통해 gemini의 image-to-image 모드에서 동일 인물성을 안정적으로 보장.&lt;/p&gt;
&lt;h3 id="combo-변주"&gt;Combo 변주&lt;/h3&gt;
&lt;p&gt;각 신 안에서 &lt;strong&gt;combo (조합)&lt;/strong&gt; 단위로 prompt 변종을 둡니다 — 의상 / 헤어 등 hyperparameter를 격자 탐색 형태로 변형. 동일 character × 동일 combo에서 &lt;strong&gt;trial 반복&lt;/strong&gt; 으로 생성 안정성도 같이 본다.&lt;/p&gt;
&lt;h3 id="생성-규모"&gt;생성 규모&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;실험&lt;/th&gt;
&lt;th&gt;생성 이미지 수&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scene #1&lt;/td&gt;
&lt;td&gt;≈ 1,249 장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scene #2&lt;/td&gt;
&lt;td&gt;≈ 937 장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scene #3&lt;/td&gt;
&lt;td&gt;≈ 1,041 장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;총합&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≈ 3,200 장&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;각 이미지는 384×688 해상도, 평균 약 9–11초 / 장 소요, 장당 비용 약 $0.045 수준.&lt;/p&gt;
&lt;h2 id="결과-분석-관점"&gt;결과 분석 관점&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;얼굴 일관성&lt;/strong&gt; — 헤어 색·길이는 prompt에 명시적 제약 (&lt;code&gt;Do NOT alter the hairstyle color or length&lt;/code&gt;) 을 둬야 안정적이었다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;포즈 정확성&lt;/strong&gt; — 손가락 위치·구도가 변동성이 큼. 별도 negative prompt (e.g., &lt;code&gt;no extra fingers&lt;/code&gt;) 로 보완.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;콘셉트 강도&lt;/strong&gt; — 장소 디테일은 prompt에 명시적으로 포함시킬수록 narrative가 살아나지만, 그만큼 얼굴 영역의 픽셀 비율이 줄어 정체성 손실 위험 증가 → reference 가중치 / 카메라 거리 prompt를 같이 조정.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="실험-흐름-자동화"&gt;실험 흐름 (자동화)&lt;/h2&gt;
&lt;p&gt;각 sprint는 다음 자동화 파이프라인 위에서 돌렸습니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prompt template 정의&lt;/strong&gt; — scene별 system prompt + character 변수 슬롯&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combo grid expansion&lt;/strong&gt; — Python으로 character × combo × trial 격자 생성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API 호출&lt;/strong&gt; — image+text → image&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML report 자동 생성&lt;/strong&gt; — combo 단위로 시각적으로 묶어 검수 가능한 리포트&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="stack"&gt;Stack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt; — 실험 파이프라인 (combo grid, API 호출, HTML report 생성)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini Flash Image Preview&lt;/strong&gt; — 이미지 생성 모델&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt Engineering&lt;/strong&gt; — system prompt + reference conditioning + negative constraints&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>OvaRisk-ML: Ovarian Cancer Risk Classification with Machine Learning</title><link>https://chaeniverse.github.io/projects/ovarisk-ml/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/ovarisk-ml/</guid><description>&lt;h4 id="개요"&gt;개요&lt;/h4&gt;
&lt;p&gt;머신러닝을 활용하여 난소암 위험군을 분류하는 예측 시스템 개발 프로젝트입니다. EDA부터 데이터 전처리, 변수 선택, 모델링, 웹 앱 배포까지 전 과정을 수행했고, 논문은 현재 review 중입니다.&lt;/p&gt;
&lt;h4 id="데이터-전처리"&gt;데이터 전처리&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;변수 탐색.&lt;/strong&gt; 범주형 변수는 2x2 table과 odds ratio로, 연속형 변수는 기초 통계량과 히스토그램으로 영향력을 점검했습니다. Odds ratio가 극단적인 변수는 sensitivity/specificity 분포를 왜곡할 수 있어 별도 검토했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;결측치 처리.&lt;/strong&gt; 결측률 40% 이상 변수는 설명력이 부족하다고 판단해 제거하고, 나머지는 연속형은 median, 범주형은 mode로 imputation 했습니다. Train set 통계량을 test set에도 동일 적용해 leakage를 방지했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다중공선성 점검.&lt;/strong&gt; Imputation 후 VIF(variance inflation factor)를 산출해 cutoff 10 기준으로 변수를 한 번에 하나씩 제거하며 추이를 관찰했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;인코딩 및 스케일링.&lt;/strong&gt; 범주형 변수는 dummy encoding (reference 카테고리 제외)으로 변환했고, 연속형 변수는 Standardization 또는 MinMaxScaler를 적용했습니다. 표준화 통계량 역시 train 기준으로 test에 동일 적용했습니다.&lt;/p&gt;
&lt;h4 id="변수-선택"&gt;변수 선택&lt;/h4&gt;
&lt;p&gt;5-fold stratified cross-validation을 결합한 Recursive Feature Elimination (RFE-CV)로 변수를 선택했습니다. 평가 기준은 AUROC를 사용했고, RFE-CV 결과 그래프를 토대로 최종 5개 변수를 선정했습니다.&lt;/p&gt;
&lt;h4 id="모델링"&gt;모델링&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;모델 비교.&lt;/strong&gt; Random Forest, Logistic Regression, XGBoost, CatBoost, MLP 5개 모델을 비교했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;평가 파이프라인.&lt;/strong&gt; 전체 데이터를 3:1 stratified split (train/test)으로 나누고, train 안에서 10-fold stratified cross-validation으로 하이퍼파라미터를 탐색했습니다. 효율을 위해 grid/random search 대신 &lt;strong&gt;Bayesian optimization&lt;/strong&gt;을 사용했습니다. 각 fold의 train→val 전환 시 표준화 통계량은 train 기준으로 일관되게 적용했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Robustness 확보.&lt;/strong&gt; 전체 split→tuning→fit→test 과정을 &lt;strong&gt;50회 반복&lt;/strong&gt;하고 성능 metric의 평균을 최종 성능으로 보고했습니다. 이를 통해 subject selection bias를 줄이고 모델의 robustness를 높였습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;클래스 불균형 처리.&lt;/strong&gt; 난소암 사례의 희소성을 고려해 undersampling을 적용하고, 그로 인해 편향된 예측 확률을 Bayes rule 기반 수식으로 보정했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;평가 지표.&lt;/strong&gt; Accuracy, Precision, Recall (Sensitivity), F1-score, AUC-ROC를 보고했습니다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Figure 3"
srcset="https://chaeniverse.github.io/projects/ovarisk-ml/fig3_hu_d44118c3852a24a4.webp 320w, https://chaeniverse.github.io/projects/ovarisk-ml/fig3_hu_6cd0fbbc4d73cf4a.webp 457w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/ovarisk-ml/fig3_hu_d44118c3852a24a4.webp"
width="457"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Figure 4"
srcset="https://chaeniverse.github.io/projects/ovarisk-ml/fig4_hu_a38a4fc2d871b295.webp 320w, https://chaeniverse.github.io/projects/ovarisk-ml/fig4_hu_163e8f4ede47611e.webp 480w, https://chaeniverse.github.io/projects/ovarisk-ml/fig4_hu_8c6bd957ef03fcd3.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/ovarisk-ml/fig4_hu_a38a4fc2d871b295.webp"
width="760"
height="302"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="배포"&gt;배포&lt;/h4&gt;
&lt;p&gt;선정된 최종 모델을 &lt;strong&gt;Python Shiny&lt;/strong&gt; 기반 웹 앱으로 배포해, 사용자 입력값에 대한 위험군 분류 결과와 lifetime risk cumulative incidence plot을 제공합니다.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Live App:
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="성과"&gt;성과&lt;/h4&gt;
&lt;p&gt;논문 작성 완료, 현재 저널 review 중.&lt;/p&gt;</description></item><item><title>LLM Model Benchmark</title><link>https://chaeniverse.github.io/projects/kpop-virtual-idol-llm-benchmark/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/kpop-virtual-idol-llm-benchmark/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;p&gt;K-Pop 가상 아이돌 앱 프로젝트의 일부로 진행한 &lt;strong&gt;LLM 모델 비교 / 선정&lt;/strong&gt; 단계. 챗봇 응답 품질·비용·지연시간을 동시에 만족하는 모델을 찾기 위해 다수의 후보 (GPT, Claude, Gemini, Kimi, Qwen 계열) 를 동일한 조건으로 벤치마크했습니다.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;보안 안내.&lt;/strong&gt; 본 프로젝트는 일부 대외비 작업이 포함되어, 실제 벤치마크 질문 전문·모델 응답·내부 시스템 prompt는 공개하지 않습니다. 본 페이지는 &lt;strong&gt;평가 기준 전환과 모델 선정 프레임워크&lt;/strong&gt; 중심으로 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="1-평가-방법--eq-bench"&gt;1. 평가 방법 — EQ-Bench&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LLM의 &lt;strong&gt;감정 이해 능력&lt;/strong&gt; 을 측정하는 벤치마크. 우리 task에 직접 부합.&lt;/p&gt;
&lt;h4 id="방법론-요약"&gt;방법론 (요약)&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;감정적으로 복잡한 대화 한 토막을 LLM에게 보여준다.&lt;/li&gt;
&lt;li&gt;그 대화 속 한 캐릭터의 감정 강도를 4가지 감정으로 LLM이 예측 (각 0–10).&lt;/li&gt;
&lt;li&gt;4 점수의 합이 10이 되도록 normalize.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reference (저자 주석값)&lt;/strong&gt; 와의 차이를 계산 — 차이가 작을수록 잘 맞춘 것.&lt;/li&gt;
&lt;li&gt;한 문제 점수 = &lt;code&gt;10 - 차이의 절댓값 합&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;60개 문제의 평균 × 10 → &lt;strong&gt;EQ-Bench 점수 (0–100 스케일)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;감정 4개는 &lt;strong&gt;명백히 틀린 것 + 명백히 맞는 것 + 미묘한 것&lt;/strong&gt; 을 섞도록 큐레이션.&lt;/p&gt;
&lt;p&gt;→ Public leaderboard:
&lt;/p&gt;
&lt;h2 id="2-모델-풀--경량-모델-체크리스트"&gt;2. 모델 풀 + 경량 모델 체크리스트&lt;/h2&gt;
&lt;p&gt;EQ-Bench 리더보드 상위권 50+ 모델을 일단 풀로 두고, 그 중 &lt;strong&gt;서비스 비용으로 운영 가능한 경량 모델&lt;/strong&gt; 을 체크리스트로 골라냈습니다.&lt;/p&gt;
&lt;h3 id="풀-예시"&gt;풀 (예시)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;프리미엄 / 대형&lt;/strong&gt;: Kimi-K2-Instruct, GPT-5.2, o3, Gemini-3-pro-preview, GPT-5.1, Claude-Opus-4.5, Hermes-4-405B, Llama-3.1-405B-Instruct, …&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;중형&lt;/strong&gt;: Claude-Sonnet-4.5, GLM-4.7, GPT-4.1, Mistral-Large, …&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;경량 (서비스용 후보)&lt;/strong&gt;: GPT-4.1-mini, Gemini-2.5-flash-preview, o4-mini, GPT-4.1-nano, Qwen3-8B, Mistral-Small-3.x, Llama-4-Scout/Maverick, Gemma-3-4b/27b, GPT-OSS-20b, …&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 총 약 &lt;strong&gt;24개의 경량 모델&lt;/strong&gt; 을 후보로 추렸음.&lt;/p&gt;
&lt;h2 id="3-서비스용-추천-top-5--2-카테고리"&gt;3. 서비스용 추천 Top 5 (× 2 카테고리)&lt;/h2&gt;
&lt;h3 id="프리미엄-top-5"&gt;프리미엄 Top 5&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;추천 이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Kimi-K2-Instruct&lt;/td&gt;
&lt;td&gt;1T 파라미터 (32B 활성 MoE), 가성비 매우 좋음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;GPT-5.2&lt;/td&gt;
&lt;td&gt;프리미엄 안정성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;o3&lt;/td&gt;
&lt;td&gt;프리미엄 reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Gemini-3-pro-preview&lt;/td&gt;
&lt;td&gt;프리미엄&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Claude-Opus-4.5&lt;/td&gt;
&lt;td&gt;프리미엄&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="경량-top-5"&gt;경량 Top 5&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;순위&lt;/th&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;추천 이유&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;GPT-4.1-mini&lt;/td&gt;
&lt;td&gt;가성비 최고, 안정적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Gemini-2.5-flash-preview&lt;/td&gt;
&lt;td&gt;빠름, 무료 티어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;o4-mini&lt;/td&gt;
&lt;td&gt;경량 reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;GPT-4.1-nano&lt;/td&gt;
&lt;td&gt;초저가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Qwen3-8B&lt;/td&gt;
&lt;td&gt;오픈소스, 로컬 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="4-비용-비교-프레임워크"&gt;4. 비용 비교 프레임워크&lt;/h2&gt;
&lt;p&gt;벤치마크 한 건당 토큰 사용량을 기준으로 &lt;strong&gt;모델별 단가&lt;/strong&gt; 를 계산:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Input&lt;/strong&gt;: ~900 tokens (system prompt + user message)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output&lt;/strong&gt;: ~100 tokens (1–2문장 응답)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="프리미엄-1건당-비용--10건-기준"&gt;프리미엄 (1건당 비용 / 10건 기준)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;1건&lt;/th&gt;
&lt;th&gt;10건&lt;/th&gt;
&lt;th&gt;대비&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kimi-K2-Instruct&lt;/td&gt;
&lt;td&gt;$0.00079&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.2&lt;/td&gt;
&lt;td&gt;$0.00298&lt;/td&gt;
&lt;td&gt;$0.0298&lt;/td&gt;
&lt;td&gt;3.8×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;o3&lt;/td&gt;
&lt;td&gt;$0.00260&lt;/td&gt;
&lt;td&gt;$0.0260&lt;/td&gt;
&lt;td&gt;3.3×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini-3-pro-preview&lt;/td&gt;
&lt;td&gt;$0.00300&lt;/td&gt;
&lt;td&gt;$0.0300&lt;/td&gt;
&lt;td&gt;3.8×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude-Opus-4.5&lt;/td&gt;
&lt;td&gt;$0.00700&lt;/td&gt;
&lt;td&gt;$0.0700&lt;/td&gt;
&lt;td&gt;8.9×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="경량-1건당-비용--10건-기준"&gt;경량 (1건당 비용 / 10건 기준)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;1건&lt;/th&gt;
&lt;th&gt;10건&lt;/th&gt;
&lt;th&gt;대비&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3-8B&lt;/td&gt;
&lt;td&gt;$0.000070&lt;/td&gt;
&lt;td&gt;$0.0007&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4.1-nano&lt;/td&gt;
&lt;td&gt;$0.000130&lt;/td&gt;
&lt;td&gt;$0.0013&lt;/td&gt;
&lt;td&gt;1.9×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini-2.5-flash-preview&lt;/td&gt;
&lt;td&gt;$0.000520&lt;/td&gt;
&lt;td&gt;$0.0052&lt;/td&gt;
&lt;td&gt;7.4×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4.1-mini&lt;/td&gt;
&lt;td&gt;$0.000520&lt;/td&gt;
&lt;td&gt;$0.0052&lt;/td&gt;
&lt;td&gt;7.4×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;o4-mini&lt;/td&gt;
&lt;td&gt;$0.001430&lt;/td&gt;
&lt;td&gt;$0.0143&lt;/td&gt;
&lt;td&gt;20.4×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="가격-형성-배경-예시"&gt;가격 형성 배경 (예시)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Kimi-K2 가 저렴한 이유&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;중국 기업 (Moonshot AI) 의 시장 점유 전략 — 공격적 가격&lt;/li&gt;
&lt;li&gt;MoE 아키텍처 (1T 파라미터 중 32B 활성) → 추론 비용 절감&lt;/li&gt;
&lt;li&gt;DeepSeek 등 중국 모델들과의 가격 경쟁&lt;/li&gt;
&lt;li&gt;중국 내 GPU/서버 비용이 상대적으로 저렴&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ DeepSeek R1, Kimi 등이 &lt;strong&gt;경쟁사 대비 약 90% 저렴한 가격&lt;/strong&gt; 으로 시장 진입.&lt;/p&gt;
&lt;h2 id="5-벤치마크-실험--통제-조건"&gt;5. 벤치마크 실험 — 통제 조건&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;조건&lt;/th&gt;
&lt;th&gt;값&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Temperature&lt;/td&gt;
&lt;td&gt;0.7 (다양성 ↔ 안정성 절충)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System prompt&lt;/td&gt;
&lt;td&gt;MBTI description + &amp;ldquo;[중요] 1–2문장으로 간결하게 답변하세요.&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;벤치마크 질문&lt;/td&gt;
&lt;td&gt;우리 도메인에 맞춰 큐레이션한 3개&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;각 모델 × MBTI × question 조합으로 응답을 수집하고, 응답 길이·지연시간·비용·정성 품질을 같이 적재.&lt;/p&gt;
&lt;p&gt;실서비스 도입 전 &lt;strong&gt;정성 검수 + 비용 시뮬레이션&lt;/strong&gt; 을 진행했습니다.&lt;/p&gt;
&lt;h2 id="6-의사결정-영향"&gt;6. 의사결정 영향&lt;/h2&gt;
&lt;p&gt;본 벤치마크 결과는 후속 단계 모델 선택의 &lt;strong&gt;베이스라인&lt;/strong&gt; 으로 활용됩니다.&lt;/p&gt;
&lt;h2 id="stack"&gt;Stack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt; — 벤치마크 파이프라인 (모델 호출)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLMs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EQ-Bench&lt;/strong&gt; — 감정 이해 평가 framework&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Paech, &lt;em&gt;EQ-Bench: An Emotional Intelligence Benchmark for Large Language Models&lt;/em&gt;, 2024 —
&lt;/li&gt;
&lt;li&gt;Reference code —
&lt;/li&gt;
&lt;li&gt;Implementation —
(벤치마크 노트북)&lt;/li&gt;
&lt;li&gt;Public leaderboard —
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Improved Survival in Multiple Myeloma with Early Precursor Detection</title><link>https://chaeniverse.github.io/projects/mm-precursor-survival/</link><pubDate>Wed, 01 Oct 2025 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/mm-precursor-survival/</guid><description>&lt;h4 id="개요"&gt;개요&lt;/h4&gt;
&lt;p&gt;다발골수종(Multiple Myeloma, MM) 환자에서 전구 질환(MGUS, smoldering MM)의 사전 진단 여부에 따라 생존 확률이 어떻게 달라지는지 비교 분석한 전국 규모 후향적 코호트 연구입니다. 조기 검진(early detection)이 생존률을 높임을 입증해, MM 환자에 대한 초기 단계 screening의 임상적 가치를 제안했습니다.&lt;/p&gt;
&lt;h4 id="데이터"&gt;데이터&lt;/h4&gt;
&lt;p&gt;건강보험심사평가원(Health Insurance Review and Assessment Service, HIRA) 빅데이터 약 5천만 명 코호트에서 SQL을 활용해 MGUS, smoldering MM, &lt;em&gt;de novo&lt;/em&gt; MM 환자군을 정의하고 추출했습니다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Cohort selection flowchart from HIRA big data"
srcset="https://chaeniverse.github.io/projects/mm-precursor-survival/cohort-flowchart_hu_f1653ffdb5e08212.webp 320w, https://chaeniverse.github.io/projects/mm-precursor-survival/cohort-flowchart_hu_3f8e95e62323dd81.webp 480w, https://chaeniverse.github.io/projects/mm-precursor-survival/cohort-flowchart_hu_328ee8696d1b5504.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/mm-precursor-survival/cohort-flowchart_hu_f1653ffdb5e08212.webp"
width="760"
height="570"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="분석-방법"&gt;분석 방법&lt;/h4&gt;
&lt;p&gt;선택 편향을 보정하기 위해 inverse probability of treatment weighting (IPTW) 매칭을 적용하고, weighted survival curve와 marginal Cox proportional hazards 분석으로 그룹 간 생존 확률을 비교했습니다. 분석은 R과 SAS로 구현했습니다.&lt;/p&gt;
&lt;h4 id="성과"&gt;성과&lt;/h4&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;S. Choi, S.S. Park, C.H. Lee, et al., &amp;ldquo;Improved Survival in Multiple Myeloma Following Prior Detection of Precursor Conditions: A Nationwide Real-world Study,&amp;rdquo; &lt;em&gt;Blood Cancer Journal&lt;/em&gt;, Oct. 2025.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Cross-Modality Neonatal Brain Image Conversion with Latent Diffusion</title><link>https://chaeniverse.github.io/projects/neonatal-brain-diffusion/</link><pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/neonatal-brain-diffusion/</guid><description>&lt;h4 id="개요"&gt;개요&lt;/h4&gt;
&lt;p&gt;신생아 뇌 MRI에서 routinely 수집되는 T2-weighted (T2w) 영상으로부터 T1-weighted (T1w) 영상을 합성하는 cross-modality conversion 모델을 개발했습니다. T1w와 T2w는 조직 특성을 상보적으로 표현하지만, 신생아의 경우 짧은 스캔 시간, 움직임 인공물, 진정제 사용 위험 등으로 두 contrast 모두를 얻기 어렵습니다. 본 연구는 누락된 modality를 합성해 multi-contrast 진단을 가능케 하는 빠르고 sedation-free한 경로를 제시합니다.&lt;/p&gt;
&lt;h4 id="방법론"&gt;방법론&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;모델 구조.&lt;/strong&gt; 2D slice-wise conditional latent diffusion model (LDM)을 설계했습니다. 40쌍의 bias field-corrected T1w/T2w 데이터를 z-축 기준으로 slicing하고, Autoencoder-KL로 latent 공간에 인코딩한 뒤, T2w latent와 modality 조건 정보를 spatially aligned 방식으로 결합해 conditional image-to-image translation을 수행했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;선행 기법과의 비교.&lt;/strong&gt; 기존 GAN 기반 cross-modality translation은 학습 과정의 특성상 mode collapse, 비수렴, 불안정성 문제가 빈번했습니다. Denoising Diffusion Probabilistic Model (DDPM) 계열은 noise-perturbation 학습 과정 덕분에 더 안정적이고 다양한 출력을 생성하며, 영상 합성 task에서 GAN보다 우수함이 보고되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;손실 함수.&lt;/strong&gt; Latent space와 conditioning key $\mathbf{y}$, diffusion time step $t$ 를 함께 고려한 LDM의 noise prediction loss는 다음과 같이 정의됩니다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="LDM noise prediction loss"
srcset="https://chaeniverse.github.io/projects/neonatal-brain-diffusion/slide-architecture_hu_887a5d2c1e210cf6.webp 320w, https://chaeniverse.github.io/projects/neonatal-brain-diffusion/slide-architecture_hu_c46d66f5fd4bea26.webp 480w, https://chaeniverse.github.io/projects/neonatal-brain-diffusion/slide-architecture_hu_5c5f8408f07d393e.webp 726w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/neonatal-brain-diffusion/slide-architecture_hu_887a5d2c1e210cf6.webp"
width="726"
height="545"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="결과"&gt;결과&lt;/h4&gt;
&lt;p&gt;Held-out test set에서 합성 T1w 영상이 다음 성능을 달성했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PSNR&lt;/strong&gt;: 21.03 dB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSIM&lt;/strong&gt;: 0.6963&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="의의"&gt;의의&lt;/h4&gt;
&lt;p&gt;T2w만으로 누락된 T1w를 생성할 수 있어 multi-contrast neonatal MRI에 빠르고 sedation-free한 접근 경로를 제공합니다. 본 framework는 infant 또는 fetal MRI 데이터로도 자연스럽게 확장 가능합니다.&lt;/p&gt;
&lt;h4 id="성과"&gt;성과&lt;/h4&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;C.H. Lee, K. Lee, B. Park, &amp;ldquo;Cross-Modality Neonatal Brain Image Conversion Using a Latent Diffusion Model,&amp;rdquo; &lt;em&gt;2025 Second International Conference on Artificial Intelligence for Medicine, Health and Care (AIxMHC)&lt;/em&gt;, IEEE, 2025. (Oral)&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Causal Inference: PSM, IPTW, CCW, Target Trial Emulation</title><link>https://chaeniverse.github.io/blog/causal-inference/</link><pubDate>Tue, 26 Aug 2025 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/causal-inference/</guid><description>&lt;h2 id="왜-인과추론이-필요한가"&gt;왜 인과추론이 필요한가&lt;/h2&gt;
&lt;p&gt;후향적 연구 (registry data, 건강보험·심평원 청구 데이터 등) 는 RCT처럼 미리 정의된 조건으로 데이터를 수집한 게 아니다. &lt;strong&gt;bias가 존재할 수밖에 없다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;예) 새로운 약 효과를 보기 위해 두 그룹 (약 먹은 vs 안 먹은) 비교.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;임상시험&lt;/strong&gt;: randomization으로 baseline 통제 → 순수한 약 효과 (causal effect).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;후향적 연구&lt;/strong&gt;: 이미 모인 데이터 → 두 그룹의 baseline이 다를 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ &lt;strong&gt;요는, 후향적 연구를 통계 기법으로 최대한 임상시험처럼 셋팅하는 것.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="카운터팩추얼-프레임"&gt;카운터팩추얼 프레임&lt;/h2&gt;
&lt;p&gt;각 개인에게 두 개의 잠재적 결과가 있다고 가정:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$Y^{a=1}$ : &amp;ldquo;&lt;strong&gt;약을 먹었다면&lt;/strong&gt;&amp;rdquo; 의 결과&lt;/li&gt;
&lt;li&gt;$Y^{a=0}$ : &amp;ldquo;&lt;strong&gt;약을 먹지 않았다면&lt;/strong&gt;&amp;rdquo; 의 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;진짜 인과효과는 $E[Y^{a=1}] - E[Y^{a=0}]$ — &lt;strong&gt;평행세계의 약 먹은 나 vs. 평행세계의 약 안 먹은 나&lt;/strong&gt; 의 차이.&lt;/p&gt;
&lt;p&gt;문제: 한 사람에게 한쪽만 관측됨. 그래서&lt;/p&gt;
$$E[Y^{a=1}] = E[Y \mid A=1] \quad \text{(?)}$$&lt;p&gt;&lt;strong&gt;이 등식이 성립하려면 가정이 필요하다.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="조건부-독립-strongly-ignorable-assignment"&gt;조건부 독립 (Strongly Ignorable Assignment)&lt;/h3&gt;
$$Y^a \perp A \mid X$$
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;모든 confounder $X$ 가 주어졌을 때, 잠재적 결과 $Y^a$ 와 treatment 배정 $A$ 가 독립&lt;/strong&gt;이라는 가정.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이게 성립하면&lt;/p&gt;
$$E[Y^{a=1}] = E[Y \mid A=1, X = x_0] \cdot \text{(for any specific } x_0\text{)}$$&lt;p&gt;그리고 marginalization으로&lt;/p&gt;
$$E[Y^{a=1}] = \sum_x E[Y \mid A=1, X=x]\, P(X=x)$$&lt;p&gt;즉, &lt;strong&gt;공변량 $X$ 가 충분히 주어지면 인과효과를 추정할 수 있다.&lt;/strong&gt; 이 marginalization을 통계 기법으로 풀어내는 게 &lt;strong&gt;PS / IPTW&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="ate-vs-att--무엇을-추정할-것인가"&gt;ATE vs ATT — 무엇을 추정할 것인가&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;추정량&lt;/th&gt;
&lt;th&gt;정의&lt;/th&gt;
&lt;th&gt;누가 쓰나&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ATE&lt;/strong&gt; (Average Treatment Effect)&lt;/td&gt;
&lt;td&gt;$E[Y^{a=1}] - E[Y^{a=0}]$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IPTW&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ATT&lt;/strong&gt; (Average Treatment effect on the Treated)&lt;/td&gt;
&lt;td&gt;$E[Y^{a=1} - Y^{a=0} \mid A=1]$&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PSM (matching)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;매칭은 treated 군에 untreated 자료를 짝지어 가져오므로, &lt;strong&gt;treated 군에 한정된 효과&lt;/strong&gt;만 정확히 본다 → ATT.&lt;/p&gt;
&lt;p&gt;ATT의 해석은 까다롭다 — 일반적으로 &lt;strong&gt;정책 평가&lt;/strong&gt;처럼 &amp;ldquo;정책 시행군 전체에 대한 효과&amp;quot;를 보고 싶을 때 사용된다 (정책 시행 후엔 모두가 시행군이라 ATT가 자연스러움).&lt;/p&gt;
&lt;p&gt;IPTW는 전체 모집단에 대한 효과 (ATE) 를 직접 추정 → &lt;strong&gt;인과효과로 해석하기 가장 쉽다&lt;/strong&gt;. 최근 임상연구의 흐름은 매칭보다 &lt;strong&gt;IPTW로 점점 이동&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="기존-회귀adjusted-vs-인과추론"&gt;기존 회귀(Adjusted) vs 인과추론&lt;/h2&gt;
&lt;p&gt;회귀모형에 그냥 공변량을 다 넣어 보정하는 흔한 방법:&lt;/p&gt;
$$\text{lm}(y \sim a + x)$$&lt;p&gt;이때 회귀 계수는&lt;/p&gt;
$$E[Y \mid A=1, X] - E[Y \mid A=0, X]$$&lt;p&gt;이고, 보고 표기는 &lt;strong&gt;Adjusted risk ratio / Adjusted HR&lt;/strong&gt; 등.&lt;/p&gt;
&lt;p&gt;문제점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;공변량 $X$ 가 &lt;strong&gt;conditioning 된 상태에서의 효과&lt;/strong&gt; — &amp;ldquo;성별·연령이 고정된 채 약 변수만 1 증가했을 때 효과&amp;rdquo; 라는 의미.&lt;/li&gt;
&lt;li&gt;진짜 약효 (marginal causal effect) 와 해석이 다름.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;용어 구분:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conditional model&lt;/strong&gt; — 공변량을 모형 안에 넣어 보정 (회귀의 표준)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marginal model&lt;/strong&gt; — weight를 주어 보정 (IPTW + univariate)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 임상 논문 읽을 때 conditional/marginal HR 구분이 중요.&lt;/p&gt;
&lt;h2 id="crude-vs-causal"&gt;Crude vs Causal&lt;/h2&gt;
&lt;p&gt;매칭 후 단순 비교:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;coxph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;matched_df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;→ 매칭으로 균형이 맞춰졌으니 결과는 단순 crude HR이 아니라 &lt;strong&gt;causal HR&lt;/strong&gt; 로 부를 수 있다.&lt;/p&gt;
&lt;p&gt;매칭 안 한 raw 비교는 &lt;strong&gt;crude HR&lt;/strong&gt;. 이 둘을 구분해서 보고하는 게 좋다.&lt;/p&gt;
&lt;h2 id="propensity-score-matching-psm"&gt;Propensity Score Matching (PSM)&lt;/h2&gt;
&lt;p&gt;공변량이 비슷한 사람끼리 두 그룹 간 짝지어 분석.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;propensity score&lt;/strong&gt; $P(A=1 \mid X)$ 를 logistic regression으로 추정.&lt;/li&gt;
&lt;li&gt;점수가 비슷한 treated/untreated 짝을 매칭.&lt;/li&gt;
&lt;li&gt;모든 case가 1:1로 맞춰진 후엔 단순 비교 (&lt;code&gt;coxph(Y ~ A)&lt;/code&gt;) 가 곧 인과 효과 추정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$n$ 수가 줄어든다 (짝 안 맞는 케이스 제거).&lt;/li&gt;
&lt;li&gt;매칭 결과 자체가 진짜 causal effect인지 약간 애매할 수 있음 (causal risk difference).&lt;/li&gt;
&lt;li&gt;treated 기준이라 ATT 추정.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;임상 국룰&lt;/strong&gt;: greedy matching (1:1 nearest matching) + caliper.&lt;/p&gt;
&lt;h2 id="iptw-inverse-probability-of-treatment-weighting"&gt;IPTW (Inverse Probability of Treatment Weighting)&lt;/h2&gt;
&lt;p&gt;매칭의 반대. 짝짓는 대신 &lt;strong&gt;weight를 주어&lt;/strong&gt; balance를 맞춘다.&lt;/p&gt;
&lt;p&gt;직관: 남자 3명, 여자 6명 → 남자에 weight 2를 주면 6:6. 이 weight 2 가 곧 $1/P(A=1 \mid X)$.&lt;/p&gt;
$$w_i = \frac{1}{P(A_i=1 \mid X_i)}$$&lt;p&gt;이 weight를 분석에 넣으면 &lt;strong&gt;단변량 회귀로도 인과효과&lt;/strong&gt;를 얻는다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;coxph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;장점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$n$ 수 유지.&lt;/li&gt;
&lt;li&gt;ATE 직접 추정.&lt;/li&gt;
&lt;li&gt;인과효과 해석이 가장 쉽다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="weight의-직관"&gt;Weight의 직관&lt;/h3&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;ID 1번이 weight 2로 들어갔다 = 그 사람을 &lt;strong&gt;2명으로 복제&lt;/strong&gt;했다고 생각하면 됨.&lt;/p&gt;
&lt;p&gt;실제로 표본 수가 늘어나는 게 아니라 cox 점수에 weight를 곱하는 형태로 처리.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;소수점 weight도 같은 직관.&lt;/p&gt;
&lt;h2 id="r-구현-흐름"&gt;R 구현 흐름&lt;/h2&gt;
&lt;p&gt;PSM도 IPTW도 출발점은 같다 — propensity score 추정:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;glm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;comorbidities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;binomial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;logit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;이 확률값으로 짝지으면 → &lt;strong&gt;PSM&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;이 확률의 역수를 weight로 쓰면 → &lt;strong&gt;IPTW&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="stabilized-weight--truncation-실무-국룰"&gt;Stabilized Weight + Truncation (실무 국룰)&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;stabilized 넣고 weight truncation까지 하는 건 국룰이다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="왜-stabilized"&gt;왜 stabilized?&lt;/h3&gt;
&lt;p&gt;극단적인 표본 비대칭에서 weight가 폭발한다. 예: 남자 3명, 여자 30만명 → 남자 weight가 십만 단위. &lt;code&gt;glm&lt;/code&gt;이 안 돌아가고, 운 나쁘게 그 3명 중에 사건이 몰리면 분석이 왜곡된다.&lt;/p&gt;
&lt;p&gt;해결: &lt;strong&gt;분자에 marginal probability&lt;/strong&gt; 를 곱해 weight를 안정화.&lt;/p&gt;
$$w_i^{\text{stab}} = \frac{P(A_i=a)}{P(A_i=a \mid X_i)}$$&lt;ul&gt;
&lt;li&gt;결과에 영향을 주지 않으면서 분산을 안정화.&lt;/li&gt;
&lt;li&gt;weight의 평균이 1 → &lt;strong&gt;표본 수가 유지된다.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="왜-truncation"&gt;왜 truncation?&lt;/h3&gt;
&lt;p&gt;stabilized 후에도 극단적으로 큰 weight 케이스가 남는다. 다변량 공변량에서 특정 조합이 매우 드문 경우 (예: 20대 + 특정 질환 + 특정 약 동반).&lt;/p&gt;
&lt;p&gt;해결: &lt;strong&gt;99% percentile (또는 1% 양쪽 자르기)&lt;/strong&gt; 위 weight를 cap.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;weight 4의 99% percentile, 100%가 32라고 하면 → 32 같은 outlier를 4로 바꾼다. 99% 이상은 다 4 4 4 …&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;논문 인용은 &lt;strong&gt;Peter Austin&lt;/strong&gt; 의 stabilization / truncation 원논문이 보통.&lt;/p&gt;
&lt;p&gt;R에선 보통 함수로 묶음 (&lt;code&gt;get_sw(formula, data, trunc_cut = 0.01)&lt;/code&gt; 같은 형태).&lt;/p&gt;
&lt;h2 id="cbps-covariate-balancing-propensity-score"&gt;CBPS (Covariate Balancing Propensity Score)&lt;/h2&gt;
&lt;p&gt;기본 IPTW로 balance가 안 맞을 때, balance를 명시적으로 maximize하도록 PS를 추정하는 변종 (GMM 기반).&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;실무 의견: &amp;ldquo;&lt;strong&gt;거의 안 쓴다.&lt;/strong&gt;&amp;rdquo; JAMA 등 임상 저널 게재 사례가 적고, reviewer 설득이 까다롭다. 정책학에서는 종종 사용.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;대신 우리는 &lt;strong&gt;interaction term을 하나씩 넣어가며&lt;/strong&gt; balance를 맞춘다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 기본&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;glm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# balance 안 맞으면&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;glm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x3&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;I&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1^2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;연속형 변수 제곱항, 변수 간 interaction을 시도해 SMD가 떨어질 때까지 조정.&lt;/p&gt;
&lt;h2 id="balance-check"&gt;Balance Check&lt;/h2&gt;
&lt;p&gt;매칭/가중 결과가 잘 맞았는지 확인하는 진단:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SMD (Standardized Mean Difference)&lt;/strong&gt; $&lt; 0.1$ — 균형 OK&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Love plot&lt;/strong&gt; — 변수별 SMD를 시각화 (matching/weighting 전·후 비교)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="robust-sandwich-estimator-매칭가중의-짝꿍"&gt;Robust Sandwich Estimator (매칭/가중의 짝꿍)&lt;/h2&gt;
&lt;p&gt;PSM, IPTW를 적용하면 신뢰구간이 인위적으로 줄어들어 &lt;strong&gt;p-value가 유의하게 잘못 나올 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;원래 분산 공식은 어떤 역행렬 가정에 기반함.&lt;/li&gt;
&lt;li&gt;weight를 쓰면 그 가정이 깨지므로 &lt;strong&gt;분산이 과소추정&lt;/strong&gt;된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;해결: &lt;strong&gt;robust sandwich estimator&lt;/strong&gt; — 분산 식이 $I S I$ 모양 (한 항이 더 추가). 이름의 유래는 그 모양.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;매칭/가중 ↔ Robust estimator&lt;/strong&gt; 짝꿍처럼 기억.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;추가 분석에서 robust estimator로 바꿨다가 결과가 뒤집히는 사례가 있어 반드시 같이 써야 함.&lt;/p&gt;
&lt;h2 id="hr-vs-risk-difference-ratio"&gt;HR vs Risk Difference Ratio&lt;/h2&gt;
&lt;p&gt;전통적으로 생존분석은 hazard ratio (HR) 만 보고했지만, 최근 trend는 &lt;strong&gt;HR + risk difference / risk ratio&lt;/strong&gt; 를 같이 보는 것.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HR은 proportional hazard 가정에 의존 → 가정 위배 시 해석 위험.&lt;/li&gt;
&lt;li&gt;Risk Ratio는 cumulative incidence curve의 각 시점에서의 risk를 비교 → 가정 더 자유로움.&lt;/li&gt;
&lt;li&gt;Time-specific hazard는 시간에 따라 위험이 변하지만, proportional hazard ratio는 그 평균 한 값으로 보고 → &lt;strong&gt;해석 모호&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="immortal-time-bias"&gt;Immortal Time Bias&lt;/h2&gt;
&lt;p&gt;치료군 vs 비치료군 비교 시 &lt;strong&gt;index date를 어떻게 잡느냐&lt;/strong&gt; 가 핵심.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;치료군의 index date = 치료 시점 → 그 시점까지 사망하지 않은 사람만 치료군에 들어감.&lt;/li&gt;
&lt;li&gt;비치료군은 그런 비대칭이 없음.&lt;/li&gt;
&lt;li&gt;결과적으로 치료군에 &amp;ldquo;사망하지 않을 운명&amp;rdquo; 의 시간(immortal time)이 부여됨 → bias.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;전통적 보정: &lt;strong&gt;landmark analysis&lt;/strong&gt; (landmark 이전 사망자 제외).&lt;/p&gt;
&lt;p&gt;문제:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;전체 모집단이 아니라 &amp;ldquo;landmark까지 살아남은 사람&amp;rdquo; 만의 효과 → &lt;strong&gt;selection bias&lt;/strong&gt;, 해석 어려움.&lt;/li&gt;
&lt;li&gt;Time-varying Cox 등 보조 도구가 필요해짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="clone-censor-weighting-ccw"&gt;Clone Censor Weighting (CCW)&lt;/h2&gt;
&lt;p&gt;최신 흐름. 한 사람을 &lt;strong&gt;양쪽 그룹에 복제&lt;/strong&gt;해 immortal time bias를 원천 제거한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A라는 사람이 90일째 treatment 받았다고 하자 → 그 사람은 90일까지 안 죽었다.&lt;/li&gt;
&lt;li&gt;Control 군에도 똑같은 가상의 사람을 0~90일까지 만든다.&lt;/li&gt;
&lt;li&gt;두 쪽이 동일한 0~90일을 가지므로 immortal time이 상쇄됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;장점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Landmark 없이 immortal time bias 해결.&lt;/li&gt;
&lt;li&gt;같은 사람을 만들기 때문에 covariate balance도 자동 해결.&lt;/li&gt;
&lt;li&gt;매칭/IPTW 없이도 분석 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;단점:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloning된 자료 만드는 과정이 복잡 (경우의 수 많음).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CCW를 쓰면 IPCW (Inverse Probability of Censoring Weighting)&lt;/strong&gt; 가 필수 짝꿍.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="인과추론-방법-계층-trend"&gt;인과추론 방법 계층 (Trend)&lt;/h2&gt;
&lt;p&gt;분석의 중요도에 따라 방법이 점진적으로 강해진다:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;가벼운 분석 매칭 (PSM)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IPTW
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;중요한 분석 CCW + IPCW
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Target Trial Emulation (전체 framework)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;→ 중요한 분석에서는 &amp;ldquo;&lt;strong&gt;우리는 모든 bias를 제거했다&lt;/strong&gt;&amp;rdquo; 라고 method에 기술할 수 있을 정도까지 간다.&lt;/p&gt;
&lt;h2 id="target-trial-emulation-tte"&gt;Target Trial Emulation (TTE)&lt;/h2&gt;
&lt;p&gt;상위 framework. 임상시험 protocol처럼 &lt;strong&gt;연구 설계 시 조작적 정의를 엄격하게 명시&lt;/strong&gt;하는 일련의 과정을 정형화. PRISMA가 메타분석 reporting을 정형화한 것처럼, TTE는 후향적 인과추론의 reporting/설계 standard.&lt;/p&gt;
&lt;p&gt;명시 항목:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eligibility criteria&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treatment strategies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assignment procedure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outcome / Follow-up&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Causal contrast&lt;/strong&gt; (intention-to-treat / per-protocol)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Statistical analysis&lt;/strong&gt; plan&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ TTE는 잘 구조화된 retrospective data 분석을 위한 framework. 위에서 다룬 PSM/IPTW/CCW를 &lt;strong&gt;어떻게 조합해 protocol을 설계할지&lt;/strong&gt;를 다룬다.&lt;/p&gt;
&lt;h2 id="요약"&gt;요약&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;인과추론의 출발점: &lt;strong&gt;카운터팩추얼 프레임 + 조건부 독립 가정&lt;/strong&gt; ($Y^a \perp A \mid X$)&lt;/li&gt;
&lt;li&gt;$X$ 를 통계 기법으로 처리하는 핵심 도구: &lt;strong&gt;PSM (ATT)&lt;/strong&gt; 과 &lt;strong&gt;IPTW (ATE)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;IPTW는 &lt;strong&gt;stabilized + truncation&lt;/strong&gt; 가 실무 국룰&lt;/li&gt;
&lt;li&gt;매칭/가중 후엔 &lt;strong&gt;robust sandwich estimator&lt;/strong&gt; 필수 짝꿍&lt;/li&gt;
&lt;li&gt;모형 안에 공변량 → conditional, weight로 보정 → marginal&lt;/li&gt;
&lt;li&gt;Balance 진단: SMD &amp;lt; 0.1, love plot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Immortal time bias&lt;/strong&gt; 는 landmark가 전통 해법, 최근엔 &lt;strong&gt;CCW (+ IPCW)&lt;/strong&gt; 가 부상&lt;/li&gt;
&lt;li&gt;전체를 framework로 정형화한 게 &lt;strong&gt;Target Trial Emulation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;임상 trend: HR 단독 → HR + Risk Difference / Risk Ratio&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Survival Analysis: Exposure Period, Immortal Time Bias, Fine-and-Gray</title><link>https://chaeniverse.github.io/blog/survival-analysis/</link><pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/survival-analysis/</guid><description>&lt;h2 id="ggsurvfit-survfit2-잠깐"&gt;ggsurvfit (&lt;code&gt;survfit2&lt;/code&gt;) 잠깐&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;survfit2()&lt;/code&gt; 는 survival curve를 깔끔하게 그려주는 함수로 &lt;strong&gt;&lt;code&gt;ggsurvfit&lt;/code&gt;&lt;/strong&gt; 패키지에 있다. base R &lt;code&gt;survfit()&lt;/code&gt; 결과를 ggplot 스타일로 변환.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ggsurvfit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;survfit2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;ggsurvfit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;add_confidence_interval&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;add_risktable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="wash-out-기간"&gt;Wash-out 기간&lt;/h2&gt;
&lt;p&gt;중재/약물 연구에서 &lt;strong&gt;이전 치료의 잔여 효과가 몸에서 사라지도록 두는 기간&lt;/strong&gt;. 이 동안 참가자는 어떤 치료도 받지 않는다.&lt;/p&gt;
&lt;p&gt;예) 약물 A 효과 평가 후 같은 참가자에게 약물 B를 투여하기 전, A의 잔여 효과가 완전히 사라질 때까지 기다린다 → B 효과를 정확히 측정 가능.&lt;/p&gt;
&lt;h2 id="index-date를-어디로-잡을-것인가--exposure-period-문제"&gt;Index Date를 어디로 잡을 것인가 — Exposure Period 문제&lt;/h2&gt;
&lt;p&gt;후향적 약물 연구의 핵심 질문 중 하나: &lt;strong&gt;약 복용 시점을 index date로 잡을지, 진단일로 잡을지.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;팽이 비유: 팽이 던진 순간부터는 가만 둬야 한다. 그 이후에 행위(약 처방)를 추가하면 그게 time-varying cox이고, 결과 활용이 어려워서 잘 안 쓴다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="index-date--진단일로-잡으면"&gt;Index date = 진단일로 잡으면&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;좋은 점: control 군의 index를 잡기 쉽다.&lt;/li&gt;
&lt;li&gt;문제: 복용군이 약을 &lt;strong&gt;언제&lt;/strong&gt; 먹었는지 모를 때 immortal time bias.
&lt;ul&gt;
&lt;li&gt;약을 1년 뒤에 먹은 사람 = &amp;ldquo;1년 동안 죽지 않았다&amp;rdquo; 는 정보가 미래에서 새는 셈.&lt;/li&gt;
&lt;li&gt;control 군은 그런 보장이 없다 → &lt;strong&gt;항상 약 먹은 사람이 더 오래 산다 (효과 좋음)&lt;/strong&gt; 로 잘못 나옴.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="index-date--약-복용일로-잡으면"&gt;Index date = 약 복용일로 잡으면&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;control 군의 index를 잡을 수 없다 (약을 안 먹었으니까).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="가장-흔한-해결-landmark--exposure-period"&gt;가장 흔한 해결: Landmark + Exposure Period&lt;/h3&gt;
&lt;p&gt;진단일부터 일정 기간 (예: 1년, 2년) 을 &lt;strong&gt;exposure period&lt;/strong&gt; 로 정의:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;진단 시점부터 진단 + N년까지를 exposure 정의 구간&lt;/strong&gt; 으로 둔다.&lt;/li&gt;
&lt;li&gt;그 안에 약을 먹었으면 treatment, 아니면 control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분석 시작은 진단 + N년 시점부터&lt;/strong&gt; (이게 새 index date).&lt;/li&gt;
&lt;li&gt;분석엔 N년 이전 데이터는 버림.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;효과&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Treatment 군과 control 군이 &lt;strong&gt;같은 시점부터 추적 시작&lt;/strong&gt; → immortal time이 양쪽에 동일하게 작용해 상쇄.&lt;/li&gt;
&lt;li&gt;미래 정보 누설 없음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;단점&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N년 사이에 사망한 사람은 분석에서 제거 → 표본 수 감소.&lt;/li&gt;
&lt;li&gt;N이 너무 길면 표본이 많이 빠진다.&lt;/li&gt;
&lt;li&gt;결과는 &amp;ldquo;진단 후 N년까지 살아남은 사람들&amp;rdquo; 에 한정된 효과.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="실무-팁"&gt;실무 팁&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;랜드마크 1년 vs 2년 vs 3년&lt;/strong&gt; 으로 표본 수와 결과를 비교해보고 합리적인 기간을 고른다.&lt;/li&gt;
&lt;li&gt;가능하면 &lt;strong&gt;진단 전에 먹은 것만&lt;/strong&gt; 분석하는 게 가장 깔끔 (statin 연구처럼).&lt;/li&gt;
&lt;li&gt;&amp;ldquo;약을 끊는 시점&amp;rdquo; 같이 &lt;strong&gt;미래 정보를 봐야 하는 분석&lt;/strong&gt;은 본질적으로 어렵다. 그래도 landmark로 어느 정도 우회 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="treatment-군-정의의-시점성"&gt;Treatment 군 정의의 시점성&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&amp;ldquo;팽이를 만드는 거랑 팽이를 치는 거랑 차이가 있다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;treatment 군 / control 군을 정할 때는 &lt;strong&gt;현재 기준&lt;/strong&gt; 으로 해야 한다.&lt;/li&gt;
&lt;li&gt;그냥 raw data로 &amp;ldquo;이 사람이 치료받은 사람이고 저 사람은 아니다&amp;rdquo; 라고 하면 사실상 &lt;strong&gt;미래를 본 거&lt;/strong&gt; (그 사람이 약을 먹은 게 미래라).&lt;/li&gt;
&lt;li&gt;그래서 landmark를 걸면 그 시점까지의 정보로 그룹을 정의 — &amp;ldquo;현재 기준&amp;rdquo; 이 됨 → 사기 X.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="competing-risk-regression-실무-코드"&gt;Competing Risk Regression (실무 코드)&lt;/h2&gt;
&lt;h3 id="cause-specific-hazard-model"&gt;Cause-Specific Hazard Model&lt;/h3&gt;
&lt;p&gt;특정 사망 (e.g., cancer death) 의 위험만 본다. 다른 event는 censoring 처리.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;coxph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="bp"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# status == 1 만 event, 그 외(예: 사망)는 censor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="fine-and-gray-sub-distribution-model"&gt;Fine-and-Gray Sub-Distribution Model&lt;/h3&gt;
&lt;p&gt;다른 event 발생 시 그 사람을 &lt;strong&gt;risk set에서 빼지 않고 무한대로 둔다.&lt;/strong&gt; Cumulative incidence와 1:1 대응.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmprsk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# crprep으로 weighted long-format data 생성&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# (또는 직접 crr 사용)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fit.crr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;crr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ftime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;d.age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fstatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;cod2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cov1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;covs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;failcode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cencode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fit.crr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="두-모델-어떻게-다른가"&gt;두 모델 어떻게 다른가&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cause-specific&lt;/strong&gt; — 특정 원인 사망의 hazard rate를 추정. 다른 event는 censor 처리. 인과적 해석에 가깝지만, cumulative incidence plot과 직접 매칭되지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fine-and-Gray&lt;/strong&gt; — sub-distribution hazard. &lt;strong&gt;Cumulative incidence plot과 1:1 대응&lt;/strong&gt; → HR과 CI plot을 같이 보여주기 좋다. 임상에서 더 많이 쓰임.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;임상에서 cuminc plot과 HR을 함께 보여주려면 &lt;strong&gt;Fine-and-Gray&lt;/strong&gt; 가 자연스럽다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="fine-and-gray가-cuminc와-일치하는-이유-간단-설명"&gt;Fine-and-Gray가 cuminc와 일치하는 이유 (간단 설명)&lt;/h2&gt;
&lt;p&gt;Fine-and-Gray model의 핵심은 &lt;strong&gt;다른 event가 일어난 사람도 끝까지 본다&lt;/strong&gt;는 것 — 사망 시점에서 끊지 않고 연구 종료일까지 추적한다고 본다.&lt;/p&gt;
&lt;p&gt;다만 &amp;ldquo;언제까지 볼지&amp;rdquo; 가 애매하므로 &lt;strong&gt;시간이 멀어질수록 weight를 작게&lt;/strong&gt; 준다. 이렇게 &lt;strong&gt;stabilized censoring weight&lt;/strong&gt;를 곱한 long-format 데이터를 만들면, &lt;code&gt;survfit + ggsurvplot&lt;/code&gt; 로 그린 cumulative incidence plot이 &lt;code&gt;cmprsk::cuminc&lt;/code&gt; / &lt;code&gt;prodlim::Hist&lt;/code&gt; 결과와 정확히 일치한다.&lt;/p&gt;
&lt;p&gt;→ Geskus 가 증명한 결과. R에서는 &lt;code&gt;cmprsk::crprep()&lt;/code&gt; 함수가 이 long-format 데이터를 만들어준다.&lt;/p&gt;
&lt;h2 id="matching-with-matchit"&gt;Matching with &lt;code&gt;MatchIt&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MatchIt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;m.out&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;matchit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;comorbidities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;nearest&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;caliper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;m.data&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;match.data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m.out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="nf"&gt;coxph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Surv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m.data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;method = &amp;quot;full&amp;quot;&lt;/code&gt; 을 주면 optimal full matching이 자동으로 적용됨.&lt;/p&gt;
&lt;h3 id="greedy-vs-full-matching"&gt;Greedy vs Full Matching&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Greedy (nearest, 1:1)&lt;/strong&gt; — 임상 국룰. 거리 가까운 짝부터 차례로 매칭. caliper로 정밀도 제어. 표본 손실 있음.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full&lt;/strong&gt; — &lt;code&gt;optmatch&lt;/code&gt; 패키지 기반. 모든 케이스를 활용해 더 효율적이지만 해석/보고가 까다롭다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="한-줄-요약"&gt;한 줄 요약&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;Index date 결정이 곧 immortal time bias 처리의 핵심.&lt;/strong&gt; Exposure period + landmark가 가장 흔한 실무 해법이고, competing risk가 있을 땐 Fine-and-Gray가 cumulative incidence plot과 1:1 대응해 가장 자주 쓰인다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="관련"&gt;관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;
&lt;/em&gt; (Austin, Statistics in Medicine)&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>머신러닝 분류 과제 수행 단계</title><link>https://chaeniverse.github.io/blog/ml-classification-workflow/</link><pubDate>Thu, 24 Oct 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/ml-classification-workflow/</guid><description>&lt;p&gt;분류(classification) 머신러닝 프로젝트를 처음부터 끝까지 끌고 가본 경험을 정리한 워크플로 가이드. &lt;strong&gt;전처리 → 변수 선택 → 모델링 → 평가&lt;/strong&gt; 순서.&lt;/p&gt;
&lt;h2 id="전처리-단계"&gt;전처리 단계&lt;/h2&gt;
&lt;h3 id="1차-변수-탐색"&gt;1차 변수 탐색&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;범주형&lt;/strong&gt;: 2x2 table과 odds ratio로 변수 영향력 점검. odds ratio가 10 이상이거나 지나치게 낮으면 sensitivity/specificity 분포가 극단적으로 왜곡되므로 별도 검토.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연속형&lt;/strong&gt;: 기초 통계량 (mean, sd 등) 과 histogram으로 영향력 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2차-변수-탐색-결측--다중공선성"&gt;2차 변수 탐색 (결측 + 다중공선성)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;결측치 처리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;결측률 &lt;strong&gt;40% 이상&lt;/strong&gt; 이면 변수의 설명력 부족으로 판단해 제거.&lt;/li&gt;
&lt;li&gt;나머지는 imputation:
&lt;ul&gt;
&lt;li&gt;연속형 → &lt;strong&gt;median&lt;/strong&gt; (mean보다 극단값 영향 덜 받음)&lt;/li&gt;
&lt;li&gt;범주형 → &lt;strong&gt;mode&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Train set 통계량을 test set에도 동일 적용 (leakage 방지).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;다중공선성 (VIF)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Imputation 후 연속형 변수 간 VIF 산출.&lt;/li&gt;
&lt;li&gt;VIF $\ge 10$ 인 변수는 한 번에 한 개씩 제거하며 추이 관찰. cutoff는 주관적이지만 10 초과면 제거 권장.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="범주형-변수-변환"&gt;범주형 변수 변환&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;One-hot encoding은 다중공선성 우려가 있으므로, 한 카테고리를 reference로 두는 &lt;strong&gt;dummy encoding&lt;/strong&gt; 사용.&lt;/li&gt;
&lt;li&gt;Reference 카테고리는 모든 컬럼에서 0인 행 → 최종 컬럼 수 = 카테고리 수 - 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="정규화--표준화"&gt;정규화 / 표준화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;연속형 변수 scale 차이가 크면 모델 설명력에 영향 → MinMaxScaler 또는 Standardization 적용.&lt;/li&gt;
&lt;li&gt;표준화 통계량 (mean, sd) 역시 &lt;strong&gt;train 기준으로 test에 동일 적용&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="변수-선택"&gt;변수 선택&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Feature가 많을수록 설명력은 ↑ but overfitting 위험 ↑.&lt;/li&gt;
&lt;li&gt;Hyperparameter 최적화 전에 변수 선택을 거친다.&lt;/li&gt;
&lt;li&gt;방법: &lt;strong&gt;RFE (Recursive Feature Elimination)&lt;/strong&gt; with &lt;strong&gt;5-fold stratified CV&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;평가 기준: &lt;strong&gt;AUROC&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;RFE-CV 결과 그래프로 최적 feature 수 (예: 5개) 결정.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="모델링-단계"&gt;모델링 단계&lt;/h2&gt;
&lt;h3 id="데이터-분할"&gt;데이터 분할&lt;/h3&gt;
&lt;p&gt;전체 데이터를 &lt;strong&gt;3:1 stratified split&lt;/strong&gt; (train/test).&lt;/p&gt;
&lt;h3 id="하이퍼파라미터-탐색"&gt;하이퍼파라미터 탐색&lt;/h3&gt;
&lt;p&gt;Train 안에서 &lt;strong&gt;10-fold stratified CV&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;10-fold CV로 train/val 분할&lt;/li&gt;
&lt;li&gt;Train set 표준화 → 그 통계량으로 val set 표준화&lt;/li&gt;
&lt;li&gt;각 fold에서 성능 metric 계산 → 평균&lt;/li&gt;
&lt;li&gt;평균이 가장 높은 hyperparameter 조합 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;탐색 알고리즘: &lt;strong&gt;Bayesian optimization&lt;/strong&gt; (grid / random search보다 효율적).&lt;/p&gt;
&lt;h3 id="최종-학습--평가"&gt;최종 학습 + 평가&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;전체 train data 표준화&lt;/li&gt;
&lt;li&gt;위에서 찾은 best hyperparameter로 모델 fitting → 모델 $a$&lt;/li&gt;
&lt;li&gt;Train 통계량으로 test data 표준화 → 모델 $a$ 에 넣고 성능 metric 출력&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="robustness--50회-반복"&gt;Robustness — 50회 반복&lt;/h3&gt;
&lt;p&gt;위 과정 (split → tuning → fit → test) 을 &lt;strong&gt;50번 반복&lt;/strong&gt;하고 metric의 평균을 최종 성능으로 보고. → subject selection bias를 줄이고 robustness 확보.&lt;/p&gt;
&lt;h2 id="모델-후보"&gt;모델 후보&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;XGBoost&lt;/li&gt;
&lt;li&gt;Random Forest&lt;/li&gt;
&lt;li&gt;Support Vector Machine (SVM)&lt;/li&gt;
&lt;li&gt;Logistic Regression&lt;/li&gt;
&lt;li&gt;Multi-Layer Perceptron (MLP)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="평가-지표"&gt;평가 지표&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Accuracy&lt;/li&gt;
&lt;li&gt;Precision&lt;/li&gt;
&lt;li&gt;Recall (Sensitivity)&lt;/li&gt;
&lt;li&gt;F1-score&lt;/li&gt;
&lt;li&gt;AUC-ROC&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;p&gt;이 워크플로를 적용한 실제 프로젝트는
참고.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Logistic Regression</title><link>https://chaeniverse.github.io/blog/logistic-regression/</link><pubDate>Sun, 22 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/logistic-regression/</guid><description>&lt;h2 id="logistic-regression-vs-linear-regression"&gt;Logistic Regression vs Linear Regression&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Linear regression — &lt;strong&gt;닫힌 해 (closed-form solution)&lt;/strong&gt; 가 존재 (정규방정식)&lt;/li&gt;
&lt;li&gt;Logistic regression — 닫힌 해 없음. &lt;strong&gt;최적화 기법&lt;/strong&gt; 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;좋은 logistic regression 모델은 정답 클래스에는 높은 확률을, 오답 클래스에는 낮은 확률을 부여한다.&lt;/p&gt;
&lt;h2 id="likelihood-function"&gt;Likelihood Function&lt;/h2&gt;
&lt;p&gt;모델 성능을 &lt;strong&gt;likelihood&lt;/strong&gt; — &amp;ldquo;각 데이터 포인트가 정답 클래스로 분류될 확률을 모두 곱한 것&amp;rdquo; — 로 측정한다.&lt;/p&gt;
&lt;p&gt;문제: 확률값을 계속 곱하면 값이 0에 가까워져 수치적으로 불안정. → 로그를 취해 &lt;strong&gt;log-likelihood&lt;/strong&gt; 사용.&lt;/p&gt;
&lt;h2 id="maximum-likelihood-estimation-mle"&gt;Maximum Likelihood Estimation (MLE)&lt;/h2&gt;
$$\arg\max_\theta \mathcal{L}(\theta) \;=\; \arg\max_\theta \log \mathcal{L}(\theta) \;=\; \arg\min_\theta \big(-\log \mathcal{L}(\theta)\big)$$&lt;p&gt;데이터셋 likelihood를 최대화하는 계수 $\theta$ 를 찾는 것이 MLE. 실전에서는 보통 &lt;strong&gt;negative log-likelihood (NLL) 최소화&lt;/strong&gt; 형태로 푼다.&lt;/p&gt;
&lt;h2 id="gradient-descent"&gt;Gradient Descent&lt;/h2&gt;
&lt;p&gt;Logistic regression에는 닫힌 해가 없으므로 &lt;strong&gt;gradient descent&lt;/strong&gt; 로 반복 개선:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;가중치 $\theta$ 를 무작위로 초기화&lt;/li&gt;
&lt;li&gt;NLL의 gradient (1차 도함수) 계산&lt;/li&gt;
&lt;li&gt;Gradient의 반대 방향으로 step size $\alpha$ (learning rate) 만큼 이동&lt;/li&gt;
&lt;li&gt;수렴할 때까지 반복&lt;/li&gt;
&lt;/ol&gt;
$$\theta^{(t+1)} = \theta^{(t)} - \alpha \cdot \nabla_\theta \big(-\log \mathcal{L}(\theta^{(t)})\big)$$&lt;h2 id="예측-및-분류"&gt;예측 및 분류&lt;/h2&gt;
&lt;p&gt;학습된 계수로 새 데이터의 확률을 계산할 때 &lt;strong&gt;sigmoid 함수&lt;/strong&gt; 사용 — S자 곡선:&lt;/p&gt;
$$\sigma(z) = \frac{1}{1 + e^{-z}}, \qquad z = \theta^\top x$$&lt;p&gt;기본 cutoff threshold (보통 0.5) 를 적용해 확률을 이진 분류로 변환:&lt;/p&gt;
$$\hat{y} = \begin{cases} 1 &amp; \text{if } \sigma(\theta^\top x) \ge 0.5 \\ 0 &amp; \text{otherwise} \end{cases}$$&lt;p&gt;threshold는 도메인에 따라 (예: 의료에서 false negative 비용이 클 때) 0.3, 0.7 등으로 조절 가능.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>MLP (Multi-Layer Perceptron)</title><link>https://chaeniverse.github.io/blog/mlp-multi-layer-perceptron/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/mlp-multi-layer-perceptron/</guid><description>&lt;h2 id="perceptron의-한계"&gt;Perceptron의 한계&lt;/h2&gt;
&lt;p&gt;단일 perceptron은 두 클래스를 분리하는 hyperplane을 만드는 &lt;strong&gt;선형 모델&lt;/strong&gt;. 변수 관계가 비선형이면 잡아내지 못한다 — 곡선 패턴이 더 적합한 복잡한 관계를 선형 회귀가 잡을 수 없는 것과 같은 한계.&lt;/p&gt;
&lt;h2 id="mlp-도입"&gt;MLP 도입&lt;/h2&gt;
&lt;p&gt;핵심 원리: &lt;strong&gt;여러 선을 결합해 복잡한 문제를 작은 부분 문제들로 분해&lt;/strong&gt;한다. 서로 다른 영역을 식별하는 여러 perceptron을 만들고 그 출력을 조합 → 비선형 결정 경계 형성.&lt;/p&gt;
&lt;p&gt;여러 hidden layer를 쌓으면 모델 복잡도가 증가하고 — 이게 바로 &lt;strong&gt;딥러닝 아키텍처의 시작&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="decision-boundary-비교"&gt;Decision Boundary 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;결정 경계&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Logistic regression&lt;/td&gt;
&lt;td&gt;선 1개, 임의 방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision tree&lt;/td&gt;
&lt;td&gt;축에 수직인 여러 선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MLP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;선 개수와 방향 모두 자유롭게 조정 가능&lt;/strong&gt; (hidden layer / node 수로 복잡도 제어)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="기본-구조"&gt;기본 구조&lt;/h2&gt;
&lt;p&gt;각 input은 모든 hidden node에 서로 다른 가중치로 연결됨. Hidden node가 정보를 처리해 output node에서 집계.&lt;/p&gt;
&lt;p&gt;분류의 경우 output node 수 = 클래스 수. &lt;strong&gt;One-hot encoding&lt;/strong&gt; + &lt;strong&gt;softmax&lt;/strong&gt; 로 확률 분포 출력:&lt;/p&gt;
$$y_j = \frac{e^{z_j}}{\sum_{k=1}^{c} e^{z_k}}$$&lt;h2 id="hidden-node의-역할"&gt;Hidden Node의 역할&lt;/h2&gt;
&lt;p&gt;Hidden node 수 = &lt;strong&gt;네트워크의 복잡도&lt;/strong&gt;. 노드가 많을수록 더 정교한 결정 경계가 가능.&lt;/p&gt;
&lt;h2 id="xor-문제-다시-보기"&gt;XOR 문제 다시 보기&lt;/h2&gt;
&lt;p&gt;선형 분리가 불가능한 데이터를 hidden node를 통해 &lt;strong&gt;분리 가능한 공간으로 변환&lt;/strong&gt;한다. 중간 단계에서 선형 분리들을 만들고 결합하면, 원래는 분리 불가능했던 데이터셋도 분류 가능해진다.&lt;/p&gt;
&lt;h2 id="error-back-propagation"&gt;Error Back-Propagation&lt;/h2&gt;
&lt;p&gt;Gradient descent + backpropagation으로 가중치 업데이트.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Output → Hidden 가중치&lt;/strong&gt;: 실제값과 예측값의 차이 × hidden node 값에 비례해 조정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input → Hidden 가중치&lt;/strong&gt;: 오차 크기와 input 값에 의존&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="학습-종료--기타"&gt;학습 종료 / 기타&lt;/h2&gt;
&lt;p&gt;학습은 다음 조건에서 종료:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가중치 변화가 미미함&lt;/li&gt;
&lt;li&gt;Validation 오차가 임계값 아래로 떨어짐&lt;/li&gt;
&lt;li&gt;미리 정한 epoch 수 도달&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overfitting 방지를 위한 메커니즘들이 존재 (dropout, regularization, early stopping 등).&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>XGBoost</title><link>https://chaeniverse.github.io/blog/xgboost/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/xgboost/</guid><description>&lt;h2 id="발전-흐름"&gt;발전 흐름&lt;/h2&gt;
&lt;p&gt;단일 decision tree → bagging / Random Forest → Gradient Boosting → &lt;strong&gt;XGBoost&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;XGBoost는 gradient boosting machine의 &lt;strong&gt;성능, 확장성, 속도&lt;/strong&gt; 를 최적화한 구현. 핵심은 &lt;strong&gt;정확한 계산 대신 빠른 근사 해&lt;/strong&gt;를 도입했다는 점.&lt;/p&gt;
&lt;h2 id="split-finding-algorithm"&gt;Split Finding Algorithm&lt;/h2&gt;
&lt;p&gt;Decision tree가 분기점을 찾을 때 가장 큰 비용은 &amp;ldquo;어느 변수의 어느 값에서 split할지&amp;rdquo; 결정하는 것.&lt;/p&gt;
&lt;h3 id="exact-greedy"&gt;Exact Greedy&lt;/h3&gt;
&lt;p&gt;모든 가능한 split 후보를 다 시험. 정렬을 포함해 $O(n \log n)$ 의 복잡도. 데이터가 크면 매우 느리다.&lt;/p&gt;
&lt;h3 id="approximation-방식"&gt;Approximation 방식&lt;/h3&gt;
&lt;p&gt;XGBoost는 변수 값들을 &lt;strong&gt;percentile 기반 bucket&lt;/strong&gt; 으로 나눈 뒤, 각 bucket 안에서만 후보 split을 탐색한다. 예시에서 39개 후보를 30개로 줄이면서 동시에 &lt;strong&gt;bucket 단위로 멀티스레드 병렬화&lt;/strong&gt; 가능.&lt;/p&gt;
&lt;p&gt;두 가지 변종:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global variant&lt;/strong&gt; — tree depth 전반에 걸쳐 동일한 bucket 구조를 유지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local variant&lt;/strong&gt; — 노드마다 일정한 bucket 개수를 유지 (depth가 깊어질수록 더 세밀)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;성능 비교: 근사 알고리즘은 exact 방식과 &lt;strong&gt;거의 동등한 정확도&lt;/strong&gt;를 훨씬 짧은 계산 시간으로 달성.&lt;/p&gt;
&lt;h2 id="sparsity-aware-split-finding"&gt;Sparsity-Aware Split Finding&lt;/h2&gt;
&lt;p&gt;결측값 처리에 특화. 학습 시 결측값을 split의 &lt;strong&gt;왼쪽 / 오른쪽으로 보내는 두 옵션을 모두 시험&lt;/strong&gt;해보고, split 성능이 더 좋은 방향을 그 노드의 default direction으로 학습한다.&lt;/p&gt;
&lt;p&gt;→ 결측 패턴이 있는 데이터에서 별도의 imputation 없이도 우수한 성능.&lt;/p&gt;
&lt;h2 id="system-design"&gt;System Design&lt;/h2&gt;
&lt;p&gt;데이터를 &lt;strong&gt;column-wise&lt;/strong&gt; 포맷으로 저장하고 사전에 정렬해 둔다. tree 학습 중 같은 정렬을 반복할 필요 없음 → 메모리 오버헤드 감소, 속도 향상.&lt;/p&gt;
&lt;p&gt;또한 cache-aware access, out-of-core computation, sparse-aware computation 등 시스템 레벨 최적화가 결합되어, 대규모 데이터에서도 실용적인 학습 시간을 보장한다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>SVM (Support Vector Machine)</title><link>https://chaeniverse.github.io/blog/svm-part-1/</link><pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/svm-part-1/</guid><description>&lt;h2 id="svm-개요"&gt;SVM 개요&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SVM (Support Vector Machine)&lt;/strong&gt; 은 이진 분류 알고리즘이다. 본 글에서 다루는 original SVM은 본질적으로 &lt;strong&gt;선형 모델&lt;/strong&gt;이다 (이후 kernel trick으로 비선형 확장 가능).&lt;/p&gt;
&lt;h2 id="linear-classifier의-목적"&gt;Linear Classifier의 목적&lt;/h2&gt;
&lt;p&gt;SVM은 이진 분류에서 라벨을 $\{-1, +1\}$ 로 표기한다. 목표는 분류기 집합 $H$ 안에서 일반화 오차 $R_D(h)$ 가 작은 가설 $h: X \to \{-1, +1\}$ 을 찾는 것.&lt;/p&gt;
&lt;p&gt;입력 공간 $X$ 에서 각 학습 데이터의 실제 라벨 ($+1$, $-1$) 을 정확히 분류하는 최적 분류기를 찾는다 — 결국 일반화 오차 $R_D(h)$ 를 최소화하는 문제.&lt;/p&gt;
&lt;p&gt;SVM은 고차원 공간에서도 선형 분류를 수행한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2D → &lt;strong&gt;선(line)&lt;/strong&gt; 으로 분리&lt;/li&gt;
&lt;li&gt;3D → &lt;strong&gt;평면(plane)&lt;/strong&gt; 으로 분리&lt;/li&gt;
&lt;li&gt;일반 $d$ 차원 → $(d-1)$ 차원의 &lt;strong&gt;초평면(hyperplane)&lt;/strong&gt; 으로 두 클래스 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;선형 분류기는 다음 형태:&lt;/p&gt;
$$H = \{\, x \mapsto \mathrm{sign}(w \cdot x + b) \;:\; w \in \mathbb{R}^d,\; b \in \mathbb{R} \,\}$$&lt;p&gt;$w \cdot x + b$ 의 부호로 라벨을 결정 (음수 → $-1$, 양수 → $+1$). 여기서 $w, b$ 가 학습 대상.&lt;/p&gt;
&lt;h2 id="local-optimum-global-optimum"&gt;Local Optimum? Global Optimum!&lt;/h2&gt;
&lt;p&gt;학습 데이터를 정확히 분류하는 hyperplane은 무수히 많다. SVM은 그 중 &lt;strong&gt;두 클래스 사이의 마진(margin)이 가장 넓은&lt;/strong&gt; hyperplane을 고른다.&lt;/p&gt;
&lt;h3 id="마진-너비-도출"&gt;마진 너비 도출&lt;/h3&gt;
&lt;p&gt;분류 경계 위의 점 $x_0$ 에서 $w^\top x_0 + b = 0$. 여기서 $w$ 는 hyperplane의 법선 벡터.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;+1 plane&amp;rdquo; 위의 점 $x_1$ 은 법선 방향으로 거리만큼 이동한 점이므로&lt;/p&gt;
$$x_1 = x_0 + p\, w$$&lt;p&gt;$x_1$ 이 plus plane 위에 있다는 조건 $w^\top x + b = 1$ 에 대입:&lt;/p&gt;
$$w^\top x_0 + p\, w^\top w + b = 1$$&lt;p&gt;$w^\top x_0 + b = 0$ 이므로&lt;/p&gt;
$$p\, w^\top w = 1 \quad\Longrightarrow\quad |p| = \frac{1}{\|w\|^2}$$&lt;p&gt;→ 한쪽 마진은 $\dfrac{1}{\|w\|^2}$, &lt;strong&gt;양쪽 합 마진은 $\dfrac{2}{\|w\|^2}$.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(보다 일반적으로 plus와 minus plane 거리를 $\|w\|$ 로 정규화하면 마진은 $\dfrac{2}{\|w\|}$. 위 도출은 $w^\top x + b = \pm 1$ 형태로 정규화한 경우의 결과)&lt;/p&gt;
&lt;h2 id="마진과-vc-차원의-관계"&gt;마진과 VC 차원의 관계&lt;/h2&gt;
&lt;p&gt;마진 $\Delta$ 를 가지는 분리 초평면의 VC 차원은 다음 상한을 가진다.&lt;/p&gt;
$$h \;\le\; \min\!\left(\left\lceil \frac{R^2}{\Delta^2}\right\rceil,\; D\right) + 1$$&lt;ul&gt;
&lt;li&gt;$D$ : 입력 공간의 차원&lt;/li&gt;
&lt;li&gt;$R$ : 모든 입력 벡터를 포함하는 가장 작은 구의 반지름&lt;/li&gt;
&lt;li&gt;$\Delta$ : 마진&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기서 변하는 건 $\Delta$ 뿐. &lt;strong&gt;마진이 클수록 $R^2/\Delta^2$ 가 작아져 VC 차원이 $D$ 보다 더 낮아질 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VC 차원이 작아지면 일반화 위험 상한 (capacity term) 도 작아진다:&lt;/p&gt;
$$R[f] \;\le\; R_{\text{emp}}[f] + \sqrt{\frac{h(\ln(2n/h)+1) + \ln(\delta/4)}{n}}$$&lt;p&gt;→ &lt;strong&gt;마진을 최대화 = VC 차원 ↓ = capacity ↓ = 기대 위험 ↓.&lt;/strong&gt; SVM이 마진을 최대화하는 이론적 근거.&lt;/p&gt;
&lt;h2 id="svm-case-i-linear--hard-margin"&gt;SVM Case I: Linear &amp;amp; Hard Margin&lt;/h2&gt;
&lt;p&gt;데이터가 선형 분리 가능하고 예외(오분류)를 허용하지 않는 경우 (hard margin).&lt;/p&gt;
&lt;h3 id="primal-problem"&gt;Primal Problem&lt;/h3&gt;
$$\min_{w, b} \;\frac{1}{2}\|w\|^2$$$$\text{s.t.} \quad y_i(w^\top x_i + b) \;\ge\; 1 \quad \forall i$$&lt;p&gt;마진 $\dfrac{2}{\|w\|^2}$ 을 최대화 ↔ $\dfrac{1}{2}\|w\|^2$ 을 최소화. 제약은&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클래스 $+1$: $w^\top x_i + b \ge 1$&lt;/li&gt;
&lt;li&gt;클래스 $-1$: $w^\top x_i + b \le -1$&lt;/li&gt;
&lt;li&gt;둘을 합쳐서 $y_i(w^\top x_i + b) \ge 1$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lagrangian--dual"&gt;Lagrangian → Dual&lt;/h3&gt;
&lt;p&gt;라그랑주 승수 $\alpha_i \ge 0$ 을 도입:&lt;/p&gt;
$$L_P = \frac{1}{2}\|w\|^2 - \sum_{i} \alpha_i \big( y_i(w^\top x_i + b) - 1 \big)$$&lt;p&gt;KKT 조건:&lt;/p&gt;
$$\frac{\partial L_P}{\partial w} = 0 \quad\Longrightarrow\quad w = \sum_i \alpha_i y_i x_i$$$$\frac{\partial L_P}{\partial b} = 0 \quad\Longrightarrow\quad \sum_i \alpha_i y_i = 0$$&lt;p&gt;이를 $L_P$ 에 다시 대입하면 &lt;strong&gt;$\alpha$ 만의 함수&lt;/strong&gt;인 dual 문제가 나온다 (convex). 해를 $\alpha^\star$ 라 하자.&lt;/p&gt;
&lt;h3 id="새-입력-분류"&gt;새 입력 분류&lt;/h3&gt;
$$f(x_{\text{new}}) = \mathrm{sign}\!\left(\sum_i \alpha_i^\star y_i \, x_i^\top x_{\text{new}} + b\right)$$&lt;h3 id="support-vectors"&gt;Support Vectors&lt;/h3&gt;
&lt;p&gt;KKT의 complementary slackness에 의해 대부분의 데이터에서 $\alpha_i = 0$ 이 되고, &lt;strong&gt;마진 경계 위에 정확히 놓인 데이터들에 대해서만 $\alpha_i &gt; 0$.&lt;/strong&gt; 이들이 &lt;strong&gt;support vector&lt;/strong&gt; — 모델 $w$ 를 결정짓는 핵심 데이터들.&lt;/p&gt;
&lt;p&gt;데이터셋 안쪽 깊은 점들은 분류기 결정에 영향을 주지 않고, 마진 위 소수 점만이 모델을 정의한다는 게 SVM의 본질.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Random Forest</title><link>https://chaeniverse.github.io/blog/random-forest/</link><pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/random-forest/</guid><description>&lt;h2 id="random-forest"&gt;Random Forest&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Random Forest&lt;/strong&gt; 는 bagging의 특수한 형태로, base learner로 &lt;strong&gt;decision tree&lt;/strong&gt; 를 쓴다. 두 가지 메커니즘으로 앙상블의 다양성을 확보한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bagging (bootstrap sampling)&lt;/strong&gt; — 각 tree는 원본 데이터에서 복원 추출한 bootstrap 샘플로 학습&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Random variable selection&lt;/strong&gt; — tree의 각 분기점에서, 전체 $p$ 개 변수 중 무작위로 $m$ 개만 후보로 두고 그 중 최선의 변수로 분기&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="알고리즘"&gt;알고리즘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Bootstrap size $t$ 의 무작위 샘플 생성&lt;/li&gt;
&lt;li&gt;분기 시 원본 $p$ 개 변수에서 $m$ 개의 변수만 무작위로 선택해 후보로 두고 분기&lt;/li&gt;
&lt;li&gt;다수의 decision tree를 학습한 뒤 결과를 결합 (분류는 majority vote, 회귀는 평균)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="핵심-통찰"&gt;핵심 통찰&lt;/h2&gt;
&lt;p&gt;변수 제약 때문에 &lt;strong&gt;개별 tree의 성능은 떨어진다.&lt;/strong&gt; 하지만 tree들 간 &lt;strong&gt;상관(correlation)이 줄어들어&lt;/strong&gt; 평균/투표로 결합하면 전체 앙상블의 성능은 더 좋아진다. &amp;ldquo;약한 학습기들을 다양하게 조합해 강한 학습기를 만든다&amp;quot;의 정수.&lt;/p&gt;
&lt;h2 id="일반화-오차-generalization-error"&gt;일반화 오차 (Generalization Error)&lt;/h2&gt;
&lt;p&gt;Random Forest의 일반화 오차에는 다음과 같은 상한이 알려져 있다.&lt;/p&gt;
$$\text{Generalization Error} \;\le\; \frac{\bar{\rho}\,(1 - s^2)}{s^2}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\bar{\rho}$ : tree들 간 결과의 평균 &lt;strong&gt;상관(correlation)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$s^2$ : 개별 tree의 &lt;strong&gt;정확도&lt;/strong&gt; (strength)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 좋은 일반화는 &lt;strong&gt;개별 모델 성능($s$)이 높으면서 모델 간 상관($\bar{\rho}$)이 낮을 때&lt;/strong&gt; 얻어진다. 이게 RF가 변수 무작위 선택을 추가하는 이유 — 약간의 개별 정확도 손해를 보더라도 상관을 크게 떨어뜨려서 전체 bound를 줄이는 거래.&lt;/p&gt;
&lt;h2 id="변수-중요도-variable-importance"&gt;변수 중요도 (Variable Importance)&lt;/h2&gt;
&lt;p&gt;Random Forest는 &lt;strong&gt;Out-of-Bag (OOB)&lt;/strong&gt; 데이터를 활용해 변수 중요도를 계산할 수 있다 (별도의 validation set 없이도 가능).&lt;/p&gt;
&lt;h3 id="절차"&gt;절차&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;각 tree에 대해, 그 tree 학습에 쓰이지 않은 OOB 샘플로 예측 오차를 측정.&lt;/li&gt;
&lt;li&gt;변수 $x_i$ 의 값을 &lt;strong&gt;무작위로 permute&lt;/strong&gt; 한 OOB 샘플로 다시 예측 오차 측정.&lt;/li&gt;
&lt;li&gt;두 오차의 차이를 모아 평균과 분산을 구한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="중요도-지표"&gt;중요도 지표&lt;/h3&gt;
$$v_i \;=\; \frac{\bar{d}_i}{s_i}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\bar{d}_i$ : OOB 오차 차이의 평균 (permute 후 - permute 전)&lt;/li&gt;
&lt;li&gt;$s_i^2$ : 그 차이의 분산&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;직관적으로, &lt;strong&gt;분기 시 자주 쓰이는 중요한 변수&lt;/strong&gt;일수록 permute하면 모델이 크게 망가져 오차 차이가 커진다 → $\bar{d}_i$ 가 크다 → $v_i$ 가 크다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Acceptance-Rejection Algorithm</title><link>https://chaeniverse.github.io/blog/acceptance-rejection/</link><pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/acceptance-rejection/</guid><description>&lt;h2 id="acceptance-rejection-algorithm"&gt;Acceptance-Rejection Algorithm&lt;/h2&gt;
&lt;p&gt;이전에는 A-R 알고리즘을 &amp;ldquo;균등분포를 씌우고 곡선 안쪽 점은 accept, 바깥은 reject&amp;rdquo; 정도로만 두루뭉술하게 알고 있었다. 이 글에서는 그 디테일한 로직을 단계별로 정리한다.&lt;/p&gt;
&lt;h2 id="셋업"&gt;셋업&lt;/h2&gt;
&lt;p&gt;지지구간 $[0,1]$ 위에 정의된 (그러나 직접 적분이 까다로운) 분포 $f(x)$ 에서 샘플을 뽑고 싶다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Target distribution f(x) on [0,1]"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_56779ea065486ac3.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_a3410b39f6f1eea5.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_4c0bab44b5a23d68.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/target_hu_56779ea065486ac3.webp"
width="760"
height="613"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="알고리즘"&gt;알고리즘&lt;/h2&gt;
&lt;h3 id="step-1-x-축-샘플링"&gt;Step 1. x-축 샘플링&lt;/h3&gt;
&lt;p&gt;먼저 $x$-축에서 약 10,000개의 data point를 $\mathrm{Unif}(0,1)$ 에서 추출해 고정점으로 둔다.&lt;/p&gt;
&lt;h3 id="step-2-y-축-샘플링"&gt;Step 2. y-축 샘플링&lt;/h3&gt;
&lt;p&gt;각 $x$ 고정점에 대해, $y$-축에서 약 10,000개의 data point를 $\mathrm{Unif}(0, a)$ 에서 추출한다. 여기서 $a$ 는 $f(x)$ 의 최댓값 (또는 그 이상). 즉, 곡선 $f(x)$ 를 충분히 덮는 가로 $1 \times$ 세로 $a$ 직사각형 안에 점들을 흩뿌리는 것.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Sampling along the y-axis at a fixed x"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a01f6f68592b1334.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_e2effc87f567206d.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a60948387b633bc4.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/y-sample_hu_a01f6f68592b1334.webp"
width="760"
height="695"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-3-accept--reject"&gt;Step 3. Accept / Reject&lt;/h3&gt;
&lt;p&gt;각 $(x, y)$ 점에 대해&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$y \le f(x)$ → &lt;strong&gt;accept&lt;/strong&gt; (곡선 안쪽 점)&lt;/li&gt;
&lt;li&gt;$y &gt; f(x)$ → &lt;strong&gt;reject&lt;/strong&gt; (곡선 바깥 점)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-4-모든-x에-대해-반복"&gt;Step 4. 모든 x에 대해 반복&lt;/h3&gt;
&lt;p&gt;위 과정을 모든 $x$-축 data point에 대해 반복한다. accept된 $(x, y)$ 점들의 &lt;strong&gt;$x$-좌표만 모아서&lt;/strong&gt; 히스토그램으로 그리면 다음과 같다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Histogram of accepted x-coordinates approximates f(x)"
srcset="https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_1cd35692a2375d71.webp 320w, https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_2bc8c1739cc87115.webp 480w, https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_894a7a1bc842417f.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/acceptance-rejection/histogram_hu_1cd35692a2375d71.webp"
width="760"
height="684"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;→ &lt;strong&gt;원래 $f(x)$ 의 분포에 잘 근사&lt;/strong&gt;된다.&lt;/p&gt;
&lt;h2 id="표본-통계량"&gt;표본 통계량&lt;/h2&gt;
&lt;p&gt;이 accepted data point들의 $x$-좌표 평균을 구하면 $f(x)$ 의 표본 평균을 추정할 수 있다 (분산도 마찬가지).&lt;/p&gt;
&lt;h2 id="왜-동작하나-직관"&gt;왜 동작하나 (직관)&lt;/h2&gt;
&lt;p&gt;곡선 $f(x)$ 아래 면적은 정확히 1 (확률밀도이므로). 직사각형 $[0,1] \times [0,a]$ 에 균등하게 점을 뿌리면, &lt;strong&gt;곡선 아래 영역에 떨어지는 비율&lt;/strong&gt;은 $\frac{1}{a}$. 그리고 이 영역 안의 점들은 &lt;strong&gt;곡선 아래에서 균등 분포&lt;/strong&gt;를 따른다.&lt;/p&gt;
&lt;p&gt;이때 $x$-좌표만 보면, 그 한계분포(marginal)가 정확히 $f(x)$ 가 된다.&lt;/p&gt;
&lt;p&gt;수식으로:&lt;/p&gt;
$$P(X \le x \mid \text{accepted}) = \frac{\int_0^x f(t)\,dt}{\int_0^1 f(t)\,dt} = \int_0^x f(t)\,dt = F(x)$$&lt;p&gt;→ accepted $X$ 의 CDF가 $F$ 이므로 $X \sim f$. $\blacksquare$&lt;/p&gt;
&lt;h2 id="일반화"&gt;일반화&lt;/h2&gt;
&lt;p&gt;지지구간이 $[0,1]$ 이 아니거나 $f$ 의 상한이 명확하지 않을 때는 임의의 proposal $g(x)$ 와 상수 $M$ 을 잡아 $f(x) \le M \cdot g(x)$ 를 만족시킨다. 그리고&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;$X \sim g$ 에서 후보를 뽑고,&lt;/li&gt;
&lt;li&gt;$U \sim \mathrm{Unif}(0,1)$ 을 뽑아,&lt;/li&gt;
&lt;li&gt;$U \le \dfrac{f(X)}{M \cdot g(X)}$ 이면 accept, 아니면 reject.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이때 accept된 $X$ 가 정확히 $f(x)$ 분포를 따른다. 위에서 다룬 케이스는 $g(x) = 1$ (균등 분포), $M = a$ 인 특수 경우에 해당한다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>MCMC (Metropolis-Hastings)</title><link>https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/</link><pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/</guid><description>&lt;h2 id="markov-chain-monte-carlo"&gt;Markov Chain Monte Carlo&lt;/h2&gt;
&lt;p&gt;간단히 말하면,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Markov chain&lt;/strong&gt; 은 그 전에 몇 번 시행했든 간에 &lt;strong&gt;바로 이전 시행에 대해서만&lt;/strong&gt; 영향을 받는다는 거고,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monte Carlo&lt;/strong&gt; 는 이상한 pdf의 분포를 구하기 어려울 때, 해당하는 pdf의 $x$ 를 많이 sampling해서 근사화시켜 표본 평균과 표본 분산을 구하는 과정을 말한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="동기"&gt;동기&lt;/h2&gt;
&lt;p&gt;가령, $f(x)$ 라는 분포의 기댓값, 분산을 알고 싶다고 하자.&lt;/p&gt;
&lt;p&gt;이때 이 분포의 모양이 특이하면 (봉우리가 여러 개 있는 등), 적분하기 상당히 까다로울 것이다. 이럴 때 정규분포를 따르는 $h(x)$ 를 하나 씌워서 여기서 data point를 무작위로 뽑아 근사시켜 표본 평균·표본 분산을 구하는 식으로 기댓값과 분산을 유추할 수 있다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Target distribution f(x) is multimodal; proposal h(x) is normal"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1519216ad54f4539.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_f0640173b2f7c82f.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1c783460b75b48e2.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step0-setup_hu_1519216ad54f4539.webp"
width="760"
height="275"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 그림에서 파란색이 우리가 알고 싶은 복잡한 분포 $f(x)$ (두 봉우리), 빨간색이 우리가 sampling에 쓸 proposal 분포 $h(x)$ (정규분포).&lt;/p&gt;
&lt;h2 id="알고리즘--acceptance-rejection-반복"&gt;알고리즘 — Acceptance-Rejection 반복&lt;/h2&gt;
&lt;h3 id="step-1-reject--첫-시도가-실패하는-경우"&gt;Step 1. Reject — 첫 시도가 실패하는 경우&lt;/h3&gt;
&lt;p&gt;정규분포를 따르는 $h(x)$ 에서 한 data point를 뽑았는데 우연히 이 위치가 뽑혔다고 가정하자.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Sampled point where f(x) &amp;lt; h(x): reject"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_764706206b79ad5f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_24dd43d88b20fccd.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_82d2c0555e086f6.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step1-reject_hu_764706206b79ad5f.webp"
width="760"
height="251"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이때 $f(x) &lt; h(x)$ (&amp;ldquo;하트가 음수&amp;rdquo;) 이면 해당 data point는 &lt;strong&gt;reject&lt;/strong&gt; 하고, 같은 정규분포에서 data를 다시 추출한다.&lt;/p&gt;
&lt;h3 id="step-2-accept"&gt;Step 2. Accept&lt;/h3&gt;
&lt;p&gt;새로 추출한 data point에서 $f(x) &gt; h(x)$ 이므로 &lt;strong&gt;accept&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Sampled point where f(x) &amp;gt; h(x): accept"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_1c053be3b3c1788c.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_e7a0f5fc326b7264.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_eaf74a7241167b2e.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step2-accept-prep_hu_1c053be3b3c1788c.webp"
width="760"
height="267"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-3-proposal-이동"&gt;Step 3. Proposal 이동&lt;/h3&gt;
&lt;p&gt;Accept하면 해당 data point를 중심으로 정규분포 $h(x)$ 를 다시 가정한다 (현재 위치로 proposal을 옮긴다).&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Move h(x) to the accepted point"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_2f47627e2795e2a3.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_97207ce6cd76a957.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_a2437b4e8a3581cf.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step3-shift_hu_2f47627e2795e2a3.webp"
width="760"
height="223"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-4-반복--random-walk"&gt;Step 4. 반복 — Random Walk&lt;/h3&gt;
&lt;p&gt;새로 가정한 정규분포에서 위와 같이 data point를 다시 무작위로 뽑는다.&lt;/p&gt;
&lt;p&gt;그런데 $f(x) &gt; h(x)$ 이면 해당 data를 accept하고 다시 그 지점으로 이동해 새 정규분포를 가정한다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Walk along the chain, accumulating accepted points"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_d4414c27f959774f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_604ec4fc25bc7e49.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_99a80589654ba2e9.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step4-walk_hu_d4414c27f959774f.webp"
width="760"
height="215"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-5-다른-봉우리로-이동"&gt;Step 5. 다른 봉우리로 이동&lt;/h3&gt;
&lt;p&gt;이런 식으로 acceptance-rejection을 반복하면서 accept된 data point들을 차곡차곡 모아 놓는다. 그러다 보면, 처음에 있던 오른쪽 봉우리뿐 아니라 &lt;strong&gt;왼쪽 봉우리에서도 data point가 추출&lt;/strong&gt;될 수 있다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Chain crosses to the other mode of f(x)"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_71f61bdf36d68c8f.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_c2454a80e4a86f3b.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_3c1b9ac206db94c2.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step5-cross-mode_hu_71f61bdf36d68c8f.webp"
width="760"
height="201"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="step-6-양쪽-봉우리-모두-탐험"&gt;Step 6. 양쪽 봉우리 모두 탐험&lt;/h3&gt;
&lt;p&gt;왼쪽 봉우리에서도 같은 acceptance-rejection을 반복한다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Both modes get sampled over time"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_1dd7bb6d2bb5aed6.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_92f60f7f4363119.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_d5679dab51ef6ca3.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step6-many-samples_hu_1dd7bb6d2bb5aed6.webp"
width="760"
height="213"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id="결과"&gt;결과&lt;/h2&gt;
&lt;p&gt;이런 식으로 알고리즘을 충분히 반복한 후 추출된 data point들의 히스토그램을 그리면 다음과 같은 모양을 띈다 — &lt;strong&gt;원래 $f(x)$ 의 분포와 흡사&lt;/strong&gt;하다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Histogram of accepted samples approximates f(x)"
srcset="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_ac42b481c77ba57a.webp 320w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_798fda3cd4801473.webp 480w, https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_2f2c110255f9341b.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/blog/mcmc-metropolis-hastings/step7-histogram_hu_ac42b481c77ba57a.webp"
width="760"
height="314"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이 data point들의 평균을 구하면 $f(x)$ 의 표본 평균과 표본 분산을 얻을 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="보충-정확한-metropolis-hastings-채택-확률"&gt;보충: 정확한 Metropolis-Hastings 채택 확률&lt;/h2&gt;
&lt;p&gt;위 설명은 직관 중심이다. 실제 Metropolis-Hastings 알고리즘에서 &lt;strong&gt;새 점 $x'$ 을 채택할 확률&lt;/strong&gt;은 다음과 같다.&lt;/p&gt;
$$\alpha(x' \mid x) \;=\; \min\!\left\{1,\; \frac{f(x')\, q(x \mid x')}{f(x)\, q(x' \mid x)}\right\}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$f(\cdot)$ : 목표 분포 (target)&lt;/li&gt;
&lt;li&gt;$q(x' \mid x)$ : 현재 위치 $x$ 에서 다음 후보 $x'$ 을 제안하는 proposal density&lt;/li&gt;
&lt;li&gt;proposal이 대칭이면 ($q(x'\mid x) = q(x \mid x')$, 예: 평균이 현재 점에 있는 정규분포) &lt;strong&gt;Metropolis&lt;/strong&gt; 알고리즘이 되어 비율이 $f(x')/f(x)$ 로 단순해진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;즉, &amp;ldquo;$f$ 가 큰 곳으로 이동하면 무조건 accept, $f$ 가 작은 곳으로 이동하면 비율만큼의 확률로 accept&amp;rdquo;. 위 직관 설명의 &amp;ldquo;f &amp;gt; h → accept, f &amp;lt; h → reject&amp;quot;는 이 채택 확률의 단순한 시각적 비유로 보면 된다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Diffusion Models: DDPM 수식 유도와 응용 (DDIM, LDM)</title><link>https://chaeniverse.github.io/blog/diffusion-models-ddpm-derivation/</link><pubDate>Tue, 28 May 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/diffusion-models-ddpm-derivation/</guid><description>&lt;h2 id="concept"&gt;Concept&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Diffusion model의 생물학적 원리.&lt;/strong&gt; 분자 구조가 퍼져 나가는 모습에서 착안. 예) 물에 잉크가 퍼지는 과정, 공기 중에 연기가 퍼지는 과정.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;수학적 원리.&lt;/strong&gt; 분자의 다음 위치는 &lt;strong&gt;gaussian distribution&lt;/strong&gt; 에 의해 결정된다.&lt;/p&gt;
&lt;h2 id="forward--reverse-process"&gt;Forward / Reverse Process&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Forward process&lt;/strong&gt; — 앞선 이미지에 gaussian distribution을 연속적으로 곱해 noise를 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reverse process&lt;/strong&gt; — 같은 가우시안 분포를 곱해 denoising 상태로 복원한다. 학습을 위한 loss term을 구하는 과정에서 $p$ 와 $q$ 의 평균·분산을 알아야 한다.&lt;/p&gt;
&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$p$ : 우리가 구하고 싶은, 이미 정해진 정답 pdf&lt;/li&gt;
&lt;li&gt;$q$ : 우리가 학습을 통해 구해야 하는 pdf&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="사전-지식"&gt;사전 지식&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KL divergence&lt;/strong&gt; — 두 확률 분포의 차이를 계산. 거리 개념은 아님 (asymmetric).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markov chain&lt;/strong&gt; — 현재 상태는 바로 이전 상태의 영향만 받는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bayes&amp;rsquo; theorem&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ELBO (Evidence Lower Bound)&lt;/strong&gt; — VAE에서 출발한 개념. MLE를 푸는 한 방식.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vae에서-elbo"&gt;VAE에서 ELBO&lt;/h2&gt;
&lt;p&gt;VAE에서는 latent $z$ 가 주어졌을 때 관측 $x$ 의 분포 $p(x \mid z)$ 를 모델링한다. $p(x)$ 자체는 직접 구하기 어렵고, $q(z \mid x)$ 라는 추정 분포로 우회한다.&lt;/p&gt;
&lt;p&gt;KL divergence 정의로부터&lt;/p&gt;
$$D_{\mathrm{KL}}(q(z\mid x) \,\|\, p(z\mid x)) = \int q(z\mid x) \log\frac{q(z\mid x)}{p(z\mid x)}\,dz \ge 0$$&lt;p&gt;이를 풀어서 $\log p(x)$ 만 남기고 정리하면&lt;/p&gt;
$$\log p(x) = D_{\mathrm{KL}}(q(z\mid x)\,\|\,p(z\mid x)) - \mathbb{E}_{q(z\mid x)}[\log q(z\mid x)] + \mathbb{E}_{q(z\mid x)}[\log p(x, z)]$$&lt;ul&gt;
&lt;li&gt;$\log p(x)$ 는 &lt;strong&gt;fixed&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;첫 항 $D_{\mathrm{KL}} \ge 0$ 이고, &lt;strong&gt;이걸 minimize 해야&lt;/strong&gt; $q$ 가 $p$ 에 가까워진다&lt;/li&gt;
&lt;li&gt;그러면 나머지 두 항 (&lt;strong&gt;ELBO&lt;/strong&gt;) 은 자연스럽게 maximize 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ELBO 부분을 정리하면&lt;/p&gt;
$$\mathrm{ELBO} = \mathbb{E}_{q(z\mid x)}\!\left[\log\frac{p(x, z)}{q(z\mid x)}\right]$$&lt;p&gt;→ 이걸 maximize하는 게 VAE 학습의 핵심.&lt;/p&gt;
&lt;h2 id="vae--ddpm-연결"&gt;VAE → DDPM 연결&lt;/h2&gt;
&lt;p&gt;DDPM에서는 latent $z$ 자리에 &lt;strong&gt;여러 시점의 noisy state&lt;/strong&gt; $x_1, x_2, \dots, x_T$ 가 들어간다 ($x_0$ 는 원본 이미지).&lt;/p&gt;
&lt;p&gt;ELBO에 음수를 붙여 minimize 문제로 바꾸면&lt;/p&gt;
$$\mathcal{L} = -\mathbb{E}_{q(x_{1:T} \mid x_0)}\!\left[\log\frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)}\right]$$&lt;p&gt;이게 DDPM loss의 출발점.&lt;/p&gt;
&lt;h2 id="ddpm-loss-수식-유도"&gt;DDPM Loss 수식 유도&lt;/h2&gt;
&lt;p&gt;Markov chain 가정 하에서 joint 분포가 chain rule로 분해된다:&lt;/p&gt;
$$p_\theta(x_{0:T}) = p(x_T)\prod_{t=1}^{T} p_\theta(x_{t-1} \mid x_t)$$$$q(x_{1:T} \mid x_0) = \prod_{t=1}^{T} q(x_t \mid x_{t-1})$$&lt;p&gt;대입 후 로그 전개:&lt;/p&gt;
$$\mathcal{L} = \mathbb{E}_q\!\left[-\log p(x_T) + \sum_{t=1}^{T} \log\frac{q(x_t \mid x_{t-1})}{p_\theta(x_{t-1} \mid x_t)}\right]$$&lt;p&gt;Bayes&amp;rsquo; theorem과 markov 성질로 $q(x_t \mid x_{t-1}) = q(x_t \mid x_{t-1}, x_0)$ 가 성립하고, 이를 활용해 $q(x_{t-1} \mid x_t, x_0)$ 형태로 변환:&lt;/p&gt;
$$q(x_t \mid x_{t-1}, x_0) = \frac{q(x_{t-1} \mid x_t, x_0)\, q(x_t \mid x_0)}{q(x_{t-1} \mid x_0)}$$&lt;p&gt;이 변환을 적용하면 telescoping이 일어나며 최종적으로 다음의 KL 형태로 정리된다.&lt;/p&gt;
$$\mathcal{L} = \mathbb{E}_q\!\left[\underbrace{D_{\mathrm{KL}}(q(x_T \mid x_0)\,\|\,p(x_T))}_{L_T} + \sum_{t=2}^{T} \underbrace{D_{\mathrm{KL}}(q(x_{t-1} \mid x_t, x_0)\,\|\,p_\theta(x_{t-1} \mid x_t))}_{L_{t-1}} \;-\; \underbrace{\log p_\theta(x_0 \mid x_1)}_{L_0}\right]$$&lt;h3 id="학습할-항만-남기기"&gt;학습할 항만 남기기&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$L_T$ — forward process에서만 쓰이고 학습할 파라미터 없음 → &lt;strong&gt;무시&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$L_0$ — 영향이 미미해서 &lt;strong&gt;무시&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;결국 &lt;strong&gt;$L_{t-1}$&lt;/strong&gt; 만 minimize 하면 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="의-평균분산"&gt;$q(x_{t-1} \mid x_t, x_0)$ 의 평균·분산&lt;/h3&gt;
&lt;p&gt;Forward process: $q(x_t \mid x_{t-1}) = \mathcal{N}(x_t;\, \sqrt{1-\beta_t}\, x_{t-1},\, \beta_t I)$.&lt;/p&gt;
&lt;p&gt;$\alpha_t = 1 - \beta_t$, $\bar\alpha_t = \prod_{s=1}^{t}\alpha_s$ 라 정의하면 reparameterization trick으로&lt;/p&gt;
$$q(x_t \mid x_0) = \mathcal{N}(x_t;\, \sqrt{\bar\alpha_t}\,x_0,\, (1-\bar\alpha_t) I)$$&lt;p&gt;Bayes&amp;rsquo; theorem과 가우시안 곱 정리로&lt;/p&gt;
$$q(x_{t-1} \mid x_t, x_0) = \mathcal{N}\big(x_{t-1};\, \tilde\mu_t(x_t, x_0),\, \tilde\beta_t I\big)$$&lt;p&gt;여기서&lt;/p&gt;
$$\tilde\mu_t(x_t, x_0) = \frac{\sqrt{\bar\alpha_{t-1}}\,\beta_t}{1-\bar\alpha_t}\,x_0 + \frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}\,x_t$$$$\tilde\beta_t = \frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\,\beta_t$$&lt;p&gt;$x_0 = \dfrac{1}{\sqrt{\bar\alpha_t}}\big(x_t - \sqrt{1-\bar\alpha_t}\,\epsilon\big)$ 로 다시 정리하면&lt;/p&gt;
$$\tilde\mu_t(x_t, x_0) = \frac{1}{\sqrt{\alpha_t}}\!\left(x_t - \frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon\right)$$&lt;h3 id="의-정의"&gt;$p_\theta(x_{t-1} \mid x_t)$ 의 정의&lt;/h3&gt;
&lt;p&gt;가우시안 분포로 가정하고, 평균을 다음처럼 &lt;strong&gt;네트워크 출력 $\epsilon_\theta$&lt;/strong&gt; 의 형태로 둔다:&lt;/p&gt;
$$p_\theta(x_{t-1} \mid x_t) = \mathcal{N}\!\big(x_{t-1};\, \mu_\theta(x_t, t),\, \sigma_t^2 I\big)$$$$\mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}}\!\left(x_t - \frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon_\theta(x_t, t)\right)$$&lt;p&gt;→ 두 평균의 차이만 학습하면 되고, 이는 곧 &lt;strong&gt;$\epsilon$ vs $\epsilon_\theta$&lt;/strong&gt; 의 차이를 학습하는 것이 된다.&lt;/p&gt;
&lt;h3 id="가우시안-kl--평균-차이의-l2"&gt;가우시안 KL → 평균 차이의 L2&lt;/h3&gt;
&lt;p&gt;분산이 같은 두 가우시안의 KL은 평균 제곱 차로 환원되므로&lt;/p&gt;
$$L_{t-1} = \mathbb{E}_{x_0,\epsilon}\!\left[\frac{\beta_t^2}{2\sigma_t^2\,\alpha_t(1-\bar\alpha_t)} \,\big\|\epsilon - \epsilon_\theta\big(\sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\epsilon,\; t\big)\big\|^2\right]$$&lt;h3 id="단순화된-최종-loss"&gt;단순화된 최종 loss&lt;/h3&gt;
&lt;p&gt;DDPM 논문에서는 weight term을 제거한 단순화된 loss를 사용한다:&lt;/p&gt;
$$\mathcal{L}_{\text{simple}}(\theta) = \mathbb{E}_{t,\,x_0,\,\epsilon}\!\left[\,\big\|\epsilon - \epsilon_\theta\big(\sqrt{\bar\alpha_t}\,x_0 + \sqrt{1-\bar\alpha_t}\,\epsilon,\; t\big)\big\|^2\,\right], \qquad \epsilon \sim \mathcal{N}(0, I)$$&lt;p&gt;→ 결국 &lt;strong&gt;U-Net (또는 다른 구조)이 noise $\epsilon$ 을 예측하도록 학습&lt;/strong&gt;시키는 단순한 MSE 회귀 문제로 귀결.&lt;/p&gt;
&lt;h2 id="학습샘플링-알고리즘-요약"&gt;학습·샘플링 알고리즘 요약&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Training&lt;/strong&gt;: $x_0$ 와 $t \sim \mathrm{Unif}(\{1, \dots, T\})$, $\epsilon \sim \mathcal{N}(0, I)$ 을 뽑아 $\mathcal{L}_{\text{simple}}$ 의 SGD로 $\epsilon_\theta$ 를 학습.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sampling&lt;/strong&gt;: $x_T \sim \mathcal{N}(0, I)$ 부터 시작, $t = T, T-1, \dots, 1$ 까지 reverse step으로&lt;/p&gt;
$$x_{t-1} = \frac{1}{\sqrt{\alpha_t}}\!\left(x_t - \frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon_\theta(x_t, t)\right) + \sigma_t z, \quad z \sim \mathcal{N}(0, I)$$&lt;h2 id="ddim-denoising-diffusion-implicit-models"&gt;DDIM (Denoising Diffusion Implicit Models)&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Song et al. (2021)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;DDPM은 markov chain을 연속적으로 곱해 process가 이루어져 &lt;strong&gt;샘플링이 느리다&lt;/strong&gt; ($T$ 보통 1000).&lt;/p&gt;
&lt;p&gt;이를 단축하기 위해 &lt;strong&gt;non-markovian&lt;/strong&gt; 개념을 도입. Forward process에서 $x_t$ 분포를 구할 때 $x_{t-1}$ 와 $x_0$ 만으로도 정의 가능 → markov 성질을 가정할 필요 없음. Sampling step을 대폭 줄여도 품질이 유지된다.&lt;/p&gt;
&lt;p&gt;가우시안이 아니어도 적용 가능 (이상치가 많은 분포라면 t분포·코시분포 활용 검토 가능).&lt;/p&gt;
&lt;h2 id="diffusion-gan"&gt;Diffusion-GAN&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Wang et al. (2023)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Diffusion model에 GAN의 discriminator를 도입. Generator + Discriminator 구조로,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real noise (forward process로 만든 noisy image) 와 fake noise (학습한 모델이 만든 noisy image) 사이의 차이를 discriminator가 판별&lt;/li&gt;
&lt;li&gt;둘의 차이를 minimize하도록 generator를 학습&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="latent-diffusion-model-ldm"&gt;Latent Diffusion Model (LDM)&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Rombach et al. (2022) — &lt;em&gt;High-Resolution Image Synthesis with Latent Diffusion Models&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;기존 diffusion model은 픽셀 공간에서 직접 작동해 &lt;strong&gt;계산량이 많다&lt;/strong&gt;. LDM은 이를 줄이기 위해 &lt;strong&gt;차원 축소된 latent space&lt;/strong&gt;에서 diffusion을 수행한다.&lt;/p&gt;
&lt;h3 id="pixel-space-vs-latent-space"&gt;Pixel space vs Latent space&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pixel space&lt;/strong&gt;: 차원 축소되지 않은 고차원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latent space&lt;/strong&gt;: 차원 축소된 저차원&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이미지의 resolution은 두 측면으로 분해할 수 있다:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Semantic&lt;/strong&gt; — 사물의 형체만 알아볼 정도의 해상도&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perceptual&lt;/strong&gt; — 더 디테일한 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;차원 축소 시 perceptual 정보를 덜어내고 semantic resolution을 보존한다. 이 latent에서 diffusion을 수행한 뒤 decoder로 perceptual 정보를 복원.&lt;/p&gt;
&lt;h3 id="구조"&gt;구조&lt;/h3&gt;
&lt;p&gt;VAE의 autoencoder 개념이 결합된 구조:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$\varepsilon$ (encoder)&lt;/strong&gt;: pixel → latent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$\mathcal{D}$ (decoder)&lt;/strong&gt;: latent → pixel&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diffusion&lt;/strong&gt; 은 latent space에서 작동&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;내부적으로는 &lt;strong&gt;U-Net + attention-based transformer&lt;/strong&gt; 모듈을 결합. Conditioning ($y$ — 텍스트, 클래스 라벨, semantic map 등) 은 cross-attention으로 주입한다.&lt;/p&gt;
&lt;h3 id="손실-함수"&gt;손실 함수&lt;/h3&gt;
$$\mathcal{L}_{\mathrm{LDM}} = \mathbb{E}_{z_0,\, y,\, \epsilon,\, t}\!\left[\,\big\|\epsilon - \epsilon_\theta(z_t,\, t,\, y)\big\|_2^2\,\right]$$&lt;p&gt;→ 픽셀 공간 DDPM의 단순화된 loss와 형태는 같고, &lt;strong&gt;변수만 latent $z$ 와 condition $y$&lt;/strong&gt; 로 바뀐 형태.&lt;/p&gt;
&lt;h3 id="왜-좋은가"&gt;왜 좋은가&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;차원 축소된 공간에서 diffusion → &lt;strong&gt;계산 비용 ↓&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Latent space는 likelihood 기반 생성 모델에 더 적합&lt;/li&gt;
&lt;li&gt;Semantic 수준에서만 학습되므로 데이터 효율성도 ↑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="정리"&gt;정리&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;DDPM의 loss는 결국 VAE의 ELBO를 markov chain으로 펼친 형태이며, 가우시안 KL이 평균 차의 L2로 환원되어 결국 &amp;ldquo;noise 예측&amp;rdquo; 회귀 문제가 된다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;DDIM은 sampling 가속화, Diffusion-GAN은 GAN과의 결합, LDM은 latent space 활용으로 계산 효율을 끌어올린 후속 작업들.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ho et al., &lt;em&gt;Denoising Diffusion Probabilistic Models&lt;/em&gt;, NeurIPS 2020&lt;/li&gt;
&lt;li&gt;Song et al., &lt;em&gt;Denoising Diffusion Implicit Models&lt;/em&gt;, ICLR 2021&lt;/li&gt;
&lt;li&gt;Rombach et al., &lt;em&gt;High-Resolution Image Synthesis with Latent Diffusion Models&lt;/em&gt;, CVPR 2022&lt;/li&gt;
&lt;li&gt;Wang et al., &lt;em&gt;Diffusion-GAN: Training GANs with Diffusion&lt;/em&gt;, 2023&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Competing Risk Analysis</title><link>https://chaeniverse.github.io/blog/competing-risk-analysis/</link><pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/competing-risk-analysis/</guid><description>&lt;h2 id="competing-risk란"&gt;Competing Risk란&lt;/h2&gt;
&lt;p&gt;생존분석에서 &lt;strong&gt;관심 event 외에 다른 event가 있어 두 event가 서로의 발생 확률에 영향을 주는&lt;/strong&gt; 상황. 그래서 한 event가 다른 event의 변동을 일으킨다 → &amp;ldquo;경쟁 위험&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="직관-예시"&gt;직관 예시&lt;/h3&gt;
&lt;p&gt;술이 위암(A)의 원인이라고 하자. 술 먹는 사람은 위암 위험이 ↑.&lt;/p&gt;
&lt;p&gt;근데 술이 간암(A&amp;rsquo;)의 원인도 된다면? → 술 먹은 사람 중 어떤 이는 간암이 먼저 생기고, 어떤 이는 위암이 생긴다.&lt;/p&gt;
&lt;p&gt;간암 생긴 사람은 &lt;strong&gt;사망이라는 event가 먼저 발생&lt;/strong&gt; → 그 사람의 위암은 더 이상 관찰되지 않는다. 결과적으로 위암은 작게 측정되는 (감소하는) 방향으로 작동한다.&lt;/p&gt;
&lt;p&gt;이렇게 하나의 원인에 대해 다른 event가 경쟁적으로 작동해, &lt;strong&gt;A&amp;rsquo;(간암) event 때문에 A(위암) event가 변동되는&lt;/strong&gt; 게 competing risk이다.&lt;/p&gt;
&lt;h3 id="mgus--mm-코호트-예시"&gt;MGUS / MM 코호트 예시&lt;/h3&gt;
&lt;p&gt;MGUS 코호트에서 outcome이 (MM 발생, 사망, censored) 라고 하자.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;관심 event: MM 발생 (event = 1)&lt;/li&gt;
&lt;li&gt;Competing risk: 사망 (사망으로 인해 MM outcome으로 갈 확률이 줄어드는 거니까)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="두-가지-처리-방법"&gt;두 가지 처리 방법&lt;/h2&gt;
&lt;h3 id="cause-specific-model"&gt;Cause-Specific Model&lt;/h3&gt;
&lt;p&gt;다른 event를 &lt;strong&gt;censored&lt;/strong&gt; 로 처리하고 관심 event에 대해 standard Cox 회귀를 적용. 진정한 인과적 효과 (cause-specific hazard) 를 본다.&lt;/p&gt;
&lt;h3 id="fine-gray-sub-distribution-model"&gt;Fine-Gray Sub-Distribution Model&lt;/h3&gt;
&lt;p&gt;다른 event 발생 시 &lt;strong&gt;추적 기간을 연구 종료일까지로 두고&lt;/strong&gt; sub-distribution hazard를 모델링. → &lt;strong&gt;Cumulative incidence plot (CIF)&lt;/strong&gt; 와 1:1 대응.&lt;/p&gt;
&lt;h2 id="어느-걸-쓰나"&gt;어느 걸 쓰나&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인과적 효과&lt;/strong&gt;를 보고 싶다 → cause-specific model이 더 적합&lt;/li&gt;
&lt;li&gt;그러나 &lt;strong&gt;실무에서는 Fine-Gray가 압도적으로 많이 쓰인다&lt;/strong&gt; — cumulative incidence plot과 직관적으로 매칭되기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="참고"&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;
&lt;/em&gt; (Austin, Statistics in Medicine)&lt;/li&gt;
&lt;li&gt;출처:
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MCMC (Gibbs Sampling)</title><link>https://chaeniverse.github.io/blog/mcmc-gibbs-sampling/</link><pubDate>Mon, 18 Dec 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/mcmc-gibbs-sampling/</guid><description>&lt;h2 id="bayes-theorem-기초"&gt;Bayes&amp;rsquo; Theorem 기초&lt;/h2&gt;
$$P(a|b) = \frac{P(a \cap b)}{P(b)}$$$$P(b|a) = \frac{P(a \cap b)}{P(a)}$$$$P(a \cap b) = P(a)P(b|a)$$$$P(a|b) = \frac{P(a)P(b|a)}{P(b)} \quad (\text{where } P(b) \text{ is constant})$$$$P(a|b) \propto P(a)P(b|a) \quad (\text{using } \pi \text{ instead of } P)$$$$\pi(a|b) \propto \pi(a)\pi(b|a) \quad (\text{*이 식 알아두면 유용하다})$$&lt;h2 id="when-to-use-gibbs-sampling"&gt;When to Use Gibbs Sampling&lt;/h2&gt;
&lt;p&gt;그럼 이 Gibbs sampling이라는 게 언제 사용하는 건지 알아보자.&lt;/p&gt;
$$y_i|\mu,\sigma^2 \sim N(\mu,\sigma^2), \quad i=1,\dots,n$$&lt;p&gt;위의 분포에서 $\mu, \sigma^2$ 는 unknown parameter이고,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;frequentist 관점에서는 $\mu, \sigma^2$ 를 MLE로 고정시킨다.&lt;/li&gt;
&lt;li&gt;반면 베이지안들은 이 unknown parameter에 분포를 걸어놓고 생각한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이때 사용하는 게 Gibbs sampling이다.&lt;/p&gt;
&lt;h2 id="posterior-distribution"&gt;Posterior Distribution&lt;/h2&gt;
&lt;p&gt;이 unknown parameter의 분포를 구하기 위해서는 다음과 같은 과정이 필요하다.&lt;/p&gt;
$$y_i|\mu,\sigma^2 \sim N(\mu,\sigma^2), \quad i=1,\dots,n$$$$P(\mu,\sigma^2|y_1,\dots,y_n) \propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu,\sigma^2)$$$$P(\mu,\sigma^2|y_1,\dots,y_n) \propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu)P(\sigma^2) \quad (\mu \perp \sigma^2)$$$$\propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu) \quad (P(\sigma^2) \text{ known이므로 constant 취급})$$&lt;p&gt;이때 $P(\mu,\sigma^2|y_1,\dots,y_n)$ 는 posterior, $P(y_1,\dots,y_n|\mu,\sigma^2)$ 는 likelihood, $P(\mu)$ 는 prior 가 된다.&lt;/p&gt;
&lt;p&gt;여기서 보통 $P(\mu) \sim N(\mu_0, \sigma^2_0)$, $P(\sigma^2) \sim IG(a,b)$ 로 둔다. $\mu_0, \sigma^2_0, a, b$ 는 hyperparameter이고 내가 정하는 것이므로 prior라고 한다.&lt;/p&gt;
&lt;h2 id="의-조건부-분포-유도"&gt;$\mu$ 의 조건부 분포 유도&lt;/h2&gt;
$$P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu)$$$$= \left(\frac{1}{\sqrt{2\pi\sigma^2}}\right)^n\prod_{i=1}^{n}\exp\left(-\frac{1}{2\sigma^2}(y_i-\mu)^2\right) \times \frac{1}{\sqrt{2\pi\sigma^2_0}}\exp\left(-\frac{1}{2\sigma^2_0}(\mu-\mu_0)^2\right)$$&lt;p&gt;여기서 $\mu$ 만 변수이므로, $\mu$ 에 대한 거 아니면 모두 날아간다.&lt;/p&gt;
$$= \exp\left(-\frac{1}{2\sigma^2}\sum (y_i-\mu)^2-\frac{1}{2\sigma^2_0}(\mu-\mu_0)^2\right)$$$$= \exp\left(-\frac{1}{2\sigma^2}\left(\sum y^2_i-2n\bar{y}\mu+n\mu^2\right)-\frac{1}{2\sigma^2_0}(\mu-\mu_0)^2\right)$$$$= \exp\left(-\frac{1}{2}\left(\frac{\sum y_i^2-2n\bar{y}\mu+n\mu^2}{\sigma^2}+\frac{\mu^2-2\mu\mu_0+\mu^2_0}{\sigma_0^2}\right)\right)$$$$= \exp\left(-\frac{1}{2}\cdot\frac{\sigma^2_0n\mu^2+\sigma^2\mu^2-2\sigma^2_0n\bar{y}\mu-2\sigma^2\mu_0\mu}{\sigma^2\sigma^2_0}\right)$$&lt;p&gt;(이걸 $N(\circ,\square)$ 꼴로 만들어야 한다.)&lt;/p&gt;
$$= \exp\left(-\frac{1}{2}\cdot\frac{1}{\sigma^2\sigma^2_0}(\sigma^2_0n\mu^2+\sigma^2\mu^2-2(\sigma^2_0n\bar{y}+\sigma^2\mu_0)\mu)\right)$$$$= \exp\left(-\frac{1}{2}\cdot\frac{1}{\sigma^2\sigma^2_0}((\sigma^2_0n+\sigma^2)\mu^2-2(\sigma^2_0n\bar{y}+\sigma^2\mu_0)\mu)\right)$$$$= \exp\left(-\frac{1}{2}\cdot\frac{\sigma^2_0n+\sigma^2}{\sigma^2\sigma^2_0}\left(\mu^2-2\left(\frac{\sigma^2_0n\bar{y}+\sigma^2\mu_0}{\sigma^2_0n+\sigma^2}\right)\mu\right)\right)$$&lt;p&gt;따라서&lt;/p&gt;
$$\mathbf{E}(\mu|\sigma^2,\vec{y}) = \frac{\sigma^2_0n\bar{y}+\sigma^2\mu_0}{\sigma^2_0n+\sigma^2} = \frac{\dfrac{n\bar{y}}{\sigma^2}+\dfrac{\mu_0}{\sigma^2_0}}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}}$$$$\mathrm{Var}(\mu|\sigma^2,\vec{y}) = \frac{\sigma^2\sigma^2_0}{\sigma^2_0n+\sigma^2} = \frac{1}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}}$$&lt;p&gt;따라서&lt;/p&gt;
$$\pi(\mu|\sigma^2,y) \sim N\left(\frac{\dfrac{n\bar{y}}{\sigma^2}+\dfrac{\mu_0}{\sigma^2_0}}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}},\ \frac{1}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}}\right)$$&lt;h2 id="의-조건부-분포-유도-1"&gt;$\sigma^2$ 의 조건부 분포 유도&lt;/h2&gt;
&lt;p&gt;마찬가지로, $\sigma^2$ 에 대한 posterior를 계산한다.&lt;/p&gt;
$$P(\sigma^2|\mu,y_1,\dots,y_n) \propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\mu)P(\sigma^2) \quad (\mu \perp \sigma^2)$$$$\propto P(y_1,\dots,y_n|\mu,\sigma^2)P(\sigma^2) \quad (P(\mu) \text{ known} \to \text{상수 취급})$$&lt;p&gt;$P(\sigma^2) \sim IG(a,b)$ 이므로 다음과 같이 쓸 수 있다.&lt;/p&gt;
$$P(y_1,\dots,y_n|\mu,\sigma^2)P(\sigma^2) = \left(\frac{1}{\sqrt{2\pi\sigma^2}}\right)^n\prod_{i=1}^{n}\exp\left(-\frac{1}{2\sigma^2}(y_i-\mu)^2\right) \times (\sigma^2)^{-(a+1)}\exp\left(-\frac{b}{\sigma^2}\right)$$&lt;p&gt;(여기서 $\sigma^2$ 만 변수이므로, $\sigma^2$ 에 대한 거 아니면 모두 날아간다.)&lt;/p&gt;
$$= (2\pi\sigma^2)^{-\frac{n}{2}}\cdot (\sigma^2)^{-(a+1)}\cdot\exp\left(-\frac{1}{2\sigma^2}\sum(y_i-\mu)^2-\frac{b}{\sigma^2}\right)$$$$= (2\pi)^{-\frac{n}{2}}\cdot(\sigma^2)^{-\frac{n}{2}}\cdot(\sigma^2)^{-(a+1)}\cdot\exp\left(-\frac{1}{\sigma^2}\left(\frac{\sum(y_i-\mu)^2}{2}+b\right)\right)$$&lt;p&gt;(이걸 $IG(\circ,\square)$ 꼴로 만든다.)&lt;/p&gt;
$$= (\sigma^2)^{-(a+\frac{n}{2}+1)}\cdot\exp\left(-\frac{\dfrac{\sum(y_i-\mu)^2}{2}+b}{\sigma^2}\right)$$&lt;p&gt;따라서&lt;/p&gt;
$$\pi(\sigma^2|\mu,\vec{y}) \sim IG\left(a+\frac{n}{2},\ b+\frac{\sum(y_i-\mu)^2}{2}\right)$$&lt;h2 id="사후-분포-정리"&gt;사후 분포 정리&lt;/h2&gt;
&lt;p&gt;이런 식으로 $\mu, \sigma^2$ 에 대한 posterior를 구하면 아래와 같다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
$$\pi(\mu|\sigma^2,\vec{y})\sim N\left(\frac{\dfrac{n\bar{y}}{\sigma^2}+\dfrac{\mu_0}{\sigma^2_0}}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}},\ \frac{1}{\dfrac{n}{\sigma^2}+\dfrac{1}{\sigma^2_0}}\right)$$&lt;p&gt;($\sigma^2$ 은 모르니까 처음에는 1을 넣어준다.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
$$\pi(\sigma^2|\mu,\vec{y})\sim IG\left(a+\frac{n}{2},\ b+\frac{\sum(y_i-\mu)^2}{2}\right)$$&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;여기서 $\mu_0, \sigma^2_0, a, b$ 는 hyperparameter다.&lt;/p&gt;
&lt;h2 id="gibbs-sampling-알고리즘"&gt;Gibbs Sampling 알고리즘&lt;/h2&gt;
&lt;p&gt;이제 1에서 $\mu$ 하나 뽑는다 ($\to \mu^{(1)}$ 추출).&lt;/p&gt;
&lt;p&gt;그리고 나서, 2에 $\mu^{(1)}$ 을 넣어 $\sigma^2$ 을 뽑는다 ($\to \sigma^{2(1)}$).&lt;/p&gt;
&lt;p&gt;그 다음에, 1에 $\sigma^{2(1)}$ 을 넣어 $\mu^{(2)}$ 를 뽑는다.&lt;/p&gt;
&lt;p&gt;다시 2에 $\mu^{(2)}$ 를 넣고 $\sigma^{2(2)}$ 을 뽑는다.&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;이런 식으로 총 2만 번 sampling한다.&lt;/p&gt;
&lt;p&gt;초기값의 영향을 받을 수 있기 때문에 그 중 앞의 만 개는 버리고, 뒤의 만 개를 갖고 근사화된 분포를 구한다. 그러면 원래 joint distribution과 비슷한 분포를 얻게 된다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Customer Satisfaction Index Modeling with SEM (Amos)</title><link>https://chaeniverse.github.io/projects/sem-customer-satisfaction/</link><pubDate>Wed, 14 Jun 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/sem-customer-satisfaction/</guid><description>&lt;h2 id="개요"&gt;개요&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;병원 내 서비스 혁신팀&lt;/strong&gt;의 의뢰로 진행한 통계 컨설팅 프로젝트입니다. 환자/고객 설문지 응답 데이터를 활용해 서비스 품질의 잠재 구조를 모형화하고, 그로부터 &lt;strong&gt;고객만족지수(Customer Satisfaction Index, CSI)&lt;/strong&gt; 를 산출하는 것이 목표였습니다.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;보안 안내.&lt;/strong&gt; 본 프로젝트는 대외비로, 구체적인 설문 항목·결과 수치·도식은 공개하지 않습니다. 본 페이지는 적용된 &lt;strong&gt;방법론과 분석 과정&lt;/strong&gt; 중심으로 정리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="데이터"&gt;데이터&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;출처&lt;/strong&gt;: 병원 서비스 혁신팀이 자체 시행한 고객 설문 결과 (수치/항목 비공개)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;전처리&lt;/strong&gt;: 결측치 제거 (NA exclusion), 셀별 가중치 부여, 가중치 적용 셀 단위 데이터셋 구성&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;변수 구조&lt;/strong&gt;: 서비스 품질의 다양한 측면을 측정한 다수의 관측 항목 → 잠재 변수(서비스 품질 차원)에 매핑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="방법론"&gt;방법론&lt;/h2&gt;
&lt;h3 id="structural-equation-modeling-sem"&gt;Structural Equation Modeling (SEM)&lt;/h3&gt;
&lt;p&gt;본 분석에는 &lt;strong&gt;구조방정식 모형&lt;/strong&gt;, 그중에서도 잠재변수 1개에 여러 관측 지표를 두는 &lt;strong&gt;다지표(multi-indicator) 측정 모형&lt;/strong&gt;을 적용했습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;잠재변수에 대해 reference indicator를 무작위로 1로 고정 (model identification)&lt;/li&gt;
&lt;li&gt;관측 변수 간 직접 path는 설정하지 않고, 측정 모형(measurement model)에 충실하게 구성&lt;/li&gt;
&lt;li&gt;잠재변수 자체에는 error term이 부착되지 않도록 주의 (모형 형태 점검)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="적합도fit-지표"&gt;적합도(Fit) 지표&lt;/h3&gt;
&lt;p&gt;표준 SEM 적합도 지표를 통해 모형의 데이터 부합 정도를 진단:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\chi^2$, df, $\chi^2$/df&lt;/li&gt;
&lt;li&gt;CFI (Comparative Fit Index)&lt;/li&gt;
&lt;li&gt;TLI (Tucker-Lewis Index)&lt;/li&gt;
&lt;li&gt;RMSEA (Root Mean Square Error of Approximation)&lt;/li&gt;
&lt;li&gt;SRMR&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="수렴-타당성-convergent-validity"&gt;수렴 타당성 (Convergent Validity)&lt;/h3&gt;
&lt;p&gt;잠재변수 자체의 신뢰성·타당성을 확인하기 위한 추가 검증:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;개념신뢰도 (Construct Reliability, CR)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분산추출지수 (Average Variance Extracted, AVE)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="csi-고객만족지수-산출"&gt;CSI (고객만족지수) 산출&lt;/h3&gt;
&lt;p&gt;최종 채택된 측정 모형의 &lt;strong&gt;표준화 회귀 계수(standardized regression weights)&lt;/strong&gt; 와 가중치 셀을 결합해 고객만족지수를 산출했습니다. 이 지수는 의뢰 부서가 정성적 보고에 활용할 수 있도록 표준화된 단일 점수 형태로 제공되었습니다.&lt;/p&gt;
&lt;h2 id="도구"&gt;도구&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Amos&lt;/strong&gt; — SEM 모형 추정·적합도 산출&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SPSS&lt;/strong&gt; — 데이터 전처리, 가중치 적용, 보조 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="효과--임팩트"&gt;효과 / 임팩트&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;비즈니스 문제 → 통계 문제 변환&lt;/strong&gt; — &amp;ldquo;고객만족도를 단일 점수로 보고하고 싶다&amp;quot;는 요구를 SEM 측정 모형으로 정의&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;외주 비용 절감&lt;/strong&gt; — 구조방정식 전문 모델링은 외부 컨설팅으로 의뢰 시 비용 부담이 상당함. 원내 의학통계지원센터에서 직접 수행함으로써 의뢰 부서의 외주 비용을 절감하고, 분석 흐름을 부서 일정에 맞춰 유연하게 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="산출물"&gt;산출물&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;고객만족지수(CSI) 단일 점수&lt;/strong&gt; + 항목별 표준화 가중치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분석 결과 보고서&lt;/strong&gt; — 의뢰 부서 내부 의사결정용 (대외비)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Whole-Brain Functional Gradients in Migraine</title><link>https://chaeniverse.github.io/projects/migraine-functional-gradients/</link><pubDate>Sat, 01 Apr 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/migraine-functional-gradients/</guid><description>&lt;h4 id="개요"&gt;개요&lt;/h4&gt;
&lt;p&gt;R과 Python을 활용해 편두통 환자군 데이터 분석을 수행하였습니다. 편두통 환자의 뇌 기능 저하를 정량적으로 평가하기 위한 모델을 구축하고 &lt;em&gt;Human Brain Mapping&lt;/em&gt;에 1저자로 출판했습니다.&lt;/p&gt;
&lt;h4 id="방법론"&gt;방법론&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;차원 축소.&lt;/strong&gt; 고차원의 뇌 영상 데이터를 비선형 매니폴드 러닝 기법으로 저차원으로 축소시켜 저차원 고유벡터를 생성했습니다. 결과에 영향을 미칠 수 있는 성별, 나이 등의 요소를 보정하여 다변량 분석을 수행했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;집단 간 비교.&lt;/strong&gt; 올바른 통계적 유의성 검정을 위해 false discovery rate (FDR) 보정을 거쳐 환자군과 정상군 사이에 영상 특징 데이터가 유의한 차이를 보이는 뇌 영역을 검출했습니다.&lt;/p&gt;
&lt;p&gt;피질뿐만 아니라 피질-피질하 (subcortico-cortical) 연결성으로 가중된 매니폴드까지 확장해 피질하 영역에서도 환자군 특이적 차이를 검출했습니다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Subcortical-weighted manifolds and between-group differences"
srcset="https://chaeniverse.github.io/projects/migraine-functional-gradients/fig2_hu_1e83bb2aa909924c.webp 320w, https://chaeniverse.github.io/projects/migraine-functional-gradients/fig2_hu_6377e236a71d5777.webp 480w, https://chaeniverse.github.io/projects/migraine-functional-gradients/fig2_hu_b35e09cc685d81bd.webp 630w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/migraine-functional-gradients/fig2_hu_1e83bb2aa909924c.webp"
width="630"
height="412"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예측 모델링.&lt;/strong&gt; 편두통의 발병 횟수라는 임상학적 지표를 예측하기 위해 머신러닝 기법을 도입했습니다. 구체적으로, least absolute shrinkage and selection operator (LASSO)를 적용해 영상 피처들을 추출하고, 5-겹 중첩 교차 검증을 갖는 선형 회귀식으로 예측 모형을 구축했습니다. 내부 훈련 데이터 세트에서 성별과 나이를 보정한 후, intra class correlation (ICC)와 mean absolute error (MAE)를 기준으로 모델을 선출하고, 최종적으로 외부 검정 데이터 세트의 임상적 변수들을 예측했습니다. 피실험자들을 뽑는 과정에서 편향이 생기지 않도록 이 과정을 100회 반복했습니다. 예측 정확도는 실제 값과 예측 값 사이의 스피어만 상관 계수, ICC, MAE를 계산해 평가했고, 상관계수의 유의성은 비모수 순열 검정을 기반으로 결정했습니다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Selected feature probability and prediction performance for headache frequency"
srcset="https://chaeniverse.github.io/projects/migraine-functional-gradients/fig3_hu_340b62f810f52a78.webp 320w, https://chaeniverse.github.io/projects/migraine-functional-gradients/fig3_hu_245f0eaed313b4d0.webp 480w, https://chaeniverse.github.io/projects/migraine-functional-gradients/fig3_hu_70c6fae208065cab.webp 697w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/migraine-functional-gradients/fig3_hu_340b62f810f52a78.webp"
width="697"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="성과"&gt;성과&lt;/h4&gt;
&lt;p&gt;본 연구를 통해 주어진 데이터를 명확하게 이해하고, 해당 데이터를 분석하기 위해 올바르고 견고한 통계 분석 기법을 적용하는 방법을 익혔습니다. 결과는 다음과 같이 출판되었습니다.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;C.H. Lee, H. Park, M.J. Lee, B. Park, &amp;ldquo;Whole-Brain Functional Gradients Reveal Cortical and Subcortical Alterations in Patients with Episodic Migraine,&amp;rdquo; &lt;em&gt;Human Brain Mapping&lt;/em&gt;, Apr. 2023.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Newton-Raphson Method &amp; Gradient Method</title><link>https://chaeniverse.github.io/blog/newton-raphson-gradient/</link><pubDate>Fri, 27 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/newton-raphson-gradient/</guid><description>&lt;p&gt;곡선의 접선을 그리고, 그 접선이 알려주는 방향으로 한 걸음씩 옮겨가며 해 (또는 극점) 에 가까워지는 두 가지 반복적인 방법을 정리한다. 같은 예제 $y = x^2$ 로 비교한다.&lt;/p&gt;
&lt;h2 id="newton-raphson-method"&gt;Newton-Raphson Method&lt;/h2&gt;
&lt;p&gt;방정식 $f(x) = 0$ 의 해를 구하는 방법. 현재 위치 $x_n$ 에서 곡선의 &lt;strong&gt;접선&lt;/strong&gt;을 그리고, 그 접선이 $x$ 축과 만나는 점을 다음 위치 $x_{n+1}$ 로 삼는다.&lt;/p&gt;
&lt;p&gt;접선의 식:&lt;/p&gt;
$$y = f(x_n) + f'(x_n)(x - x_n)$$&lt;p&gt;이 직선이 $y=0$ 이 되는 $x$ 를 풀면&lt;/p&gt;
$$x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$&lt;h3 id="예제"&gt;예제: $y = x^2$&lt;/h3&gt;
&lt;p&gt;$f(x) = x^2$, $f'(x) = 2x$ 이므로&lt;/p&gt;
$$x_{n+1} = x_n - \frac{x_n^2}{2x_n} = x_n - \frac{x_n}{2} = \frac{x_n}{2}$$&lt;p&gt;$x_0 = 8$ 부터 시작하면 $x_1 = 4, x_2 = 2, x_3 = 1, \dots$ 매 step마다 절반으로 줄어들며 해 $x^* = 0$ 에 접근한다. (그림에서 $x_0 \to x_1 \to x_2 \to \dots \to x^*$)&lt;/p&gt;
&lt;h2 id="gradient-method"&gt;Gradient Method&lt;/h2&gt;
&lt;p&gt;함수 $f(x)$ 의 &lt;strong&gt;극점(보통 최솟값)&lt;/strong&gt; 을 찾는 방법. 현재 위치 $x_n$ 에서 그래디언트(도함수)의 반대 방향으로 step size $\alpha$ 만큼 이동한다.&lt;/p&gt;
$$x_{n+1} = x_n - \alpha \cdot f'(x_n)$$&lt;p&gt;여기서 $\alpha$ 는 한 번에 너무 크게 이동하는 것을 방지하기 위한 &lt;strong&gt;하이퍼파라미터&lt;/strong&gt; (learning rate / step size). 이 $\alpha$ 를 어떻게 적응적으로 조절하느냐가 &lt;strong&gt;AdaGrad, Adam&lt;/strong&gt; 같은 옵티마이저 변종의 핵심.&lt;/p&gt;
&lt;h3 id="예제-1"&gt;예제: $y = x^2$&lt;/h3&gt;
&lt;p&gt;$f'(x) = 2x$, $\alpha = 0.1$ 이라고 하자. $x^{(1)} = 5$ 부터 시작하면&lt;/p&gt;
$$x^{(2)} = 5 - 0.1 \cdot 2 \cdot 5 = 5 - 1 = 4$$$$x^{(3)} = 4 - 0.1 \cdot 2 \cdot 4 = 4 - 0.8 = 3.2$$$$\vdots$$&lt;p&gt;일반화하면&lt;/p&gt;
$$x^{(i+1)} = x^{(i)} - \alpha \cdot f'(x^{(i)})$$&lt;p&gt;매 step마다 $x$ 가 $0.8$ 배씩 (= $1 - 2\alpha$) 줄어들며 $x^* = 0$ 에 접근한다.&lt;/p&gt;
&lt;h2 id="두-방법-비교"&gt;두 방법 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Newton-Raphson&lt;/th&gt;
&lt;th&gt;Gradient Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;$f(x) = 0$ (해 찾기)&lt;/td&gt;
&lt;td&gt;$\min f(x)$ (극점 찾기)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;업데이트&lt;/td&gt;
&lt;td&gt;$x_{n+1} = x_n - f(x_n)/f'(x_n)$&lt;/td&gt;
&lt;td&gt;$x_{n+1} = x_n - \alpha \cdot f'(x_n)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;step size&lt;/td&gt;
&lt;td&gt;자동 (도함수 비)&lt;/td&gt;
&lt;td&gt;수동 (하이퍼파라미터 $\alpha$)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;필요 정보&lt;/td&gt;
&lt;td&gt;$f, f'$&lt;/td&gt;
&lt;td&gt;$f'$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수렴 속도&lt;/td&gt;
&lt;td&gt;보통 빠름 (이차 수렴)&lt;/td&gt;
&lt;td&gt;$\alpha$에 의존 (보통 일차)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;참고: 최적화 맥락에서 Newton&amp;rsquo;s method (&amp;ldquo;Newton&amp;rsquo;s optimization&amp;rdquo;) 는 $f'(x) = 0$ 의 해를 Newton-Raphson으로 찾는 것이라 $x_{n+1} = x_n - f'(x_n)/f''(x_n)$ 형태가 된다. 이때는 2차 도함수 $f''$ 가 필요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Importance Sampling</title><link>https://chaeniverse.github.io/blog/importance-sampling/</link><pubDate>Tue, 17 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/importance-sampling/</guid><description>&lt;h2 id="monte-carlo"&gt;Monte Carlo&lt;/h2&gt;
&lt;p&gt;기댓값을 계산하는 방법. $X \sim f(x)$ 일 때 $g(X)$ 의 기댓값은 다음 세 가지 형태로 동치다.&lt;/p&gt;
$$\underbrace{E[g(X)]}_{\text{①}} \;=\; \underbrace{\int g(x) f(x)\,dx}_{\text{②}} \;\approx\; \underbrace{\frac{1}{n}\sum_{i=1}^{n} g(x_i)}_{\text{③}}$$&lt;p&gt;①, ②는 정의상 같고, ③은 $f$ 에서 뽑은 샘플 $\{x_i\}$ 의 평균으로 ②를 근사한 것 (대수의 법칙).&lt;/p&gt;
&lt;h3 id="예제-1-단순-mc"&gt;예제 1: 단순 MC&lt;/h3&gt;
&lt;p&gt;$g(x) = e^{-2x}$, $X \sim \mathrm{Unif}(0,1)$ 일 때 $E[g(X)]$ 을 구하라.&lt;/p&gt;
&lt;p&gt;이때 $f(x) = 1$ (Unif(0,1) 의 밀도)이므로&lt;/p&gt;
$$E[g(X)] = \int_0^1 e^{-2x}\,dx \;\approx\; \frac{1}{N}\sum_{i=1}^{N} e^{-2 x_i}, \qquad x_i \sim \mathrm{Unif}(0,1)$$&lt;p&gt;균등 분포에서 $N$ 개를 뽑아 $g$ 에 넣고 평균을 내면 끝.&lt;/p&gt;
&lt;h2 id="importance-sampling"&gt;Importance Sampling&lt;/h2&gt;
&lt;p&gt;문제는 다음 두 경우다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;$f(x)$ 에서 샘플링이 어렵다.&lt;/strong&gt; 닫힌 형태로 sampling이 안 되는 분포.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;$g(x) \cdot f(x)$ 가 $f$ 의 꼬리/희소 영역에 몰려 있다.&lt;/strong&gt; $f$ 에서 뽑은 대부분의 샘플이 $g \cdot f$ 가 큰 영역을 못 맞춰서 분산이 매우 커진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이럴 때는 다른 분포 $\phi(x)$ (&amp;ldquo;proposal&amp;rdquo; 또는 &amp;ldquo;importance distribution&amp;rdquo;)에서 샘플을 뽑고 가중치로 보정한다. 핵심 항등식:&lt;/p&gt;
$$E_f[g(X)] = \int g(x) f(x)\,dx = \int g(x) \cdot \frac{f(x)}{\phi(x)} \cdot \phi(x)\,dx = E_\phi\!\left[g(X) \cdot \frac{f(X)}{\phi(X)}\right]$$&lt;p&gt;→ $\phi$ 에서 샘플 $\{x_i\}$ 을 뽑고&lt;/p&gt;
$$E_f[g(X)] \;\approx\; \frac{1}{N}\sum_{i=1}^{N} g(x_i) \cdot \underbrace{\frac{f(x_i)}{\phi(x_i)}}_{\text{weight}}$$&lt;p&gt;여기서 $f(x)/\phi(x)$ 가 &lt;strong&gt;importance weight&lt;/strong&gt;. (이 가중치 때문에 &amp;ldquo;importance&amp;rdquo; sampling이라는 이름이 붙은 것)&lt;/p&gt;
&lt;h2 id="예제-2"&gt;예제 2: $\int (x-1)(x-2)\,dx$&lt;/h2&gt;
&lt;p&gt;이 식은 따로 정해진 $f(x)$ 가 없다 (단순 적분). $\phi(x) \sim \mathrm{Exp}(1)$, 즉 $\phi(x) = e^{-x}$ ($x&gt;0$) 를 proposal로 쓰자.&lt;/p&gt;
$$\int (x-1)(x-2)\,dx = \int \underbrace{\frac{(x-1)(x-2)}{e^{-x}}}_{\text{new } g(x)} \cdot \underbrace{e^{-x}}_{\text{new } f(x)}\,dx$$&lt;p&gt;→ $X \sim \mathrm{Exp}(1)$ 에서 $N$ 개를 뽑아 새 $g$ 에 넣고 평균:&lt;/p&gt;
$$\widehat{E[g(X)]} = \frac{1}{N}\sum_{i=1}^{N} \frac{(x_i-1)(x_i-2)}{e^{-x_i}}, \qquad x_i \sim \mathrm{Exp}(1)$$&lt;h2 id="예제-3--with--proposal"&gt;예제 3: $\int e^{-|x|}\,dx$ with $N(0,1)$ proposal&lt;/h2&gt;
&lt;p&gt;$\phi(x) \sim N(0,1)$, 즉 $\phi(x) = \dfrac{1}{\sqrt{2\pi}} e^{-x^2/2}$ 를 쓰자.&lt;/p&gt;
$$\int e^{-|x|}\,dx = \int \underbrace{\frac{e^{-|x|}}{\frac{1}{\sqrt{2\pi}} e^{-x^2/2}}}_{\text{new } g(x)} \cdot \underbrace{\frac{1}{\sqrt{2\pi}} e^{-x^2/2}}_{\text{new } f(x)}\,dx$$&lt;p&gt;→ $X \sim N(0,1)$ 에서 $N$ 개 sampling 후 새 $g$ 에 넣어 평균을 구하면 된다.&lt;/p&gt;
&lt;h2 id="왜--을-proposal로-골랐나"&gt;왜 $N(0,1)$ 을 proposal로 골랐나&lt;/h2&gt;
&lt;p&gt;원래의 $g(x) = e^{-|x|}$ 는 0 근처에 봉우리가 있는 양옆 대칭 함수다. $\phi(x) \sim N(0,1)$ 도 비슷한 모양 — 0 근처에 봉우리, 양쪽으로 빠르게 감소.&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;proposal $\phi(x)$ 를 $|g(x) f(x)|$ 와 모양이 비슷하게 잡으면 분산이 작아져 효율이 좋다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;만약 $\phi$ 가 $|g \cdot f|$ 가 큰 영역을 거의 안 덮으면, 거의 모든 샘플의 weight $f(x)/\phi(x)$ 가 0 근처가 되고, 가끔 한 샘플의 weight가 매우 커져서 추정량의 분산이 폭발한다.&lt;/p&gt;
&lt;h2 id="한-줄-요약"&gt;한 줄 요약&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;샘플링은 $\phi$ 에서, 평균은 weight $f/\phi$ 로 보정.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Proposal $\phi$ 의 모양을 신경써서 고를수록 추정량의 분산이 작아진다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>가능도비 검정 (Likelihood Ratio Test)</title><link>https://chaeniverse.github.io/blog/likelihood-ratio-test/</link><pubDate>Tue, 17 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/likelihood-ratio-test/</guid><description>&lt;h2 id="lr-검정-likelihood-ratio-test"&gt;LR 검정 (Likelihood Ratio Test)&lt;/h2&gt;
&lt;p&gt;간단히 말하면, &lt;strong&gt;자료가 귀무가설보다 대립가설의 영역에서 나왔을 가능성&lt;/strong&gt;을 비교하는 검정이다.&lt;/p&gt;
&lt;p&gt;검정 통계량은&lt;/p&gt;
$$\lambda \;=\; \frac{L(\hat{\Omega}_0)}{L(\hat{\Omega})} \;=\; \frac{\displaystyle \max_{\theta \in \Omega_0} L(\theta)}{\displaystyle \max_{\theta \in \Omega} L(\theta)}$$&lt;p&gt;즉 &lt;strong&gt;(H₀ 하에서 가능도함수의 max) ÷ (전체 모수공간에서 가능도함수의 max)&lt;/strong&gt; 이다.&lt;/p&gt;
&lt;p&gt;분자가 분모의 일부이므로 항상 $0 &lt; \lambda \le 1$ 이고, 이를 다시 쓰면&lt;/p&gt;
$$\lambda \;=\; \frac{L(\hat{\Omega}_0)}{\max\{L(\hat{\Omega}_0),\, L(\hat{\Omega}_1)\}} \;=\; \frac{1}{\max\Big\{1,\; \dfrac{L(\hat{\Omega}_1)}{L(\hat{\Omega}_0)}\Big\}}$$&lt;h2 id="기각역의-의미"&gt;기각역의 의미&lt;/h2&gt;
&lt;p&gt;LRT의 기각역은 $\lambda \le \lambda_0$ 형태인데, 위 식을 뒤집으면 결국&lt;/p&gt;
$$\frac{L(\hat{\Omega}_1)}{L(\hat{\Omega}_0)} \;\ge\; c$$&lt;p&gt;인 영역이다. 이 영역에서는 자료가 H₀ 보다 H₁ 에서 나왔을 가능성이 더 높다는 뜻이므로, &lt;strong&gt;H₀를 기각하는 게 타당하다&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="예제-정규모형의-평균-검정"&gt;예제: 정규모형의 평균 검정&lt;/h2&gt;
&lt;p&gt;$X_1, \dots, X_n \sim N(\mu, \sigma^2)$ 일 때,&lt;/p&gt;
$$H_0:\ \mu = 0,\ \sigma^2 &gt; 0 \quad \text{vs.} \quad H_1:\ \mu \neq 0,\ \sigma^2 &gt; 0$$&lt;p&gt;에 대한 크기 $\alpha$ 의 LRT를 유도해보자.&lt;/p&gt;
&lt;h3 id="1-mle-계산"&gt;1) MLE 계산&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;전체 모수공간&lt;/strong&gt; $\Omega$ 에서 MLE는&lt;/p&gt;
$$\hat{\mu} = \bar{x}, \qquad \hat{\sigma}^2 = \frac{1}{n}\sum_{i=1}^n (x_i - \bar{x})^2$$&lt;p&gt;따라서&lt;/p&gt;
$$L(\hat{\Omega}) = (2\pi\hat{\sigma}^2)^{-n/2} \exp(-n/2)$$&lt;p&gt;&lt;strong&gt;Under $H_0$&lt;/strong&gt; 에서는 $\mu = 0$ 으로 강제되므로&lt;/p&gt;
$$\hat{\mu}_0 = 0, \qquad \hat{\sigma}^2_0 = \frac{1}{n}\sum_{i=1}^n x_i^2$$&lt;p&gt;따라서&lt;/p&gt;
$$L(\hat{\Omega}_0) = (2\pi\hat{\sigma}^2_0)^{-n/2} \exp(-n/2)$$&lt;h3 id="2--단순화"&gt;2) $\lambda$ 단순화&lt;/h3&gt;
$$\lambda = \frac{L(\hat{\Omega}_0)}{L(\hat{\Omega})}
= \frac{(2\pi\hat{\sigma}^2_0)^{-n/2}\,\exp(-n/2)}{(2\pi\hat{\sigma}^2)^{-n/2}\,\exp(-n/2)}
= \left(\frac{\hat{\sigma}^2_0}{\hat{\sigma}^2}\right)^{-n/2}$$&lt;p&gt;기각 조건 $\lambda \le \lambda_0$ ($0 &lt; \lambda_0 &lt; 1$)는&lt;/p&gt;
$$\left(\frac{\hat{\sigma}^2_0}{\hat{\sigma}^2}\right)^{-n/2} \le \lambda_0
\quad\Longleftrightarrow\quad \frac{\hat{\sigma}^2_0}{\hat{\sigma}^2} \ge k$$&lt;h3 id="3--와--의-관계"&gt;3) $\hat{\sigma}^2_0$ 와 $\hat{\sigma}^2$ 의 관계&lt;/h3&gt;
&lt;p&gt;$\sum x_i^2 = \sum (x_i - \bar{x})^2 + n\bar{x}^2$ 항등식을 쓰면&lt;/p&gt;
$$n\hat{\sigma}^2_0 = \sum x_i^2 = \sum(x_i - \bar{x})^2 + n\bar{x}^2 = n\hat{\sigma}^2 + n\bar{x}^2$$&lt;p&gt;따라서&lt;/p&gt;
$$\hat{\sigma}^2_0 = \hat{\sigma}^2 + \bar{x}^2$$&lt;h3 id="4-t-통계량-형태로-변환"&gt;4) t-통계량 형태로 변환&lt;/h3&gt;
&lt;p&gt;$\hat{\sigma}^2_0 / \hat{\sigma}^2 \ge k$ 에 대입하면&lt;/p&gt;
$$\frac{\hat{\sigma}^2 + \bar{x}^2}{\hat{\sigma}^2} = 1 + \frac{\bar{x}^2}{\hat{\sigma}^2} \;\ge\; k
\quad\Longleftrightarrow\quad \frac{\bar{x}^2}{\hat{\sigma}^2} \;\ge\; k - 1
\quad\Longleftrightarrow\quad \frac{|\bar{x}|}{\hat{\sigma}} \;\ge\; k_2$$&lt;p&gt;이제 표본분산 $s^2 = \dfrac{1}{n-1}\sum (x_i - \bar{x})^2$ 와의 관계를 쓰면&lt;/p&gt;
$$n\hat{\sigma}^2 = (n-1)s^2 \quad\Longrightarrow\quad \hat{\sigma} = s\sqrt{\frac{n-1}{n}}$$&lt;p&gt;이를 대입해 정리하면 결국&lt;/p&gt;
$$\left|\frac{\bar{x}}{s/\sqrt{n}}\right| \;\ge\; c$$&lt;p&gt;즉 t-통계량의 절댓값이 어떤 임계값 $c$ 이상인 영역이 기각역이다.&lt;/p&gt;
&lt;h3 id="5-크기--조건으로--결정"&gt;5) 크기 $\alpha$ 조건으로 $c$ 결정&lt;/h3&gt;
$$\alpha = \max_{\Omega_0} P\!\left(\left|\frac{\bar{x}}{s/\sqrt{n}}\right| \ge c\right)
= P\!\left(\left|\frac{\bar{x}}{s/\sqrt{n}}\right| \ge c \;\Big|\; \mu = 0\right)
= P\big(|t| \ge c\big), \quad t \sim t(n-1)$$&lt;p&gt;이로부터&lt;/p&gt;
$$c = t_{\alpha/2}(n-1)$$&lt;h3 id="6-결론"&gt;6) 결론&lt;/h3&gt;
&lt;p&gt;크기 $\alpha$ LRT의 검정 기각역은&lt;/p&gt;
$$C = \left\{(x_1, \dots, x_n) \;\Big|\; \left|\frac{\bar{x}}{s/\sqrt{n}}\right| \ge t_{\alpha/2}(n-1)\right\}$$&lt;p&gt;→ 익숙한 &lt;strong&gt;단일표본 양측 t-검정&lt;/strong&gt;과 정확히 같다. 즉 정규모형 평균에 대한 LRT는 t-검정으로 자연스럽게 환원된다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Inverse Sampling</title><link>https://chaeniverse.github.io/blog/inverse-sampling/</link><pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/inverse-sampling/</guid><description>&lt;h2 id="inverse-sampling"&gt;Inverse Sampling&lt;/h2&gt;
&lt;p&gt;분포 $f(x)$ 에서 직접 샘플링하기 어려울 때 쓰는 기법. CDF의 역함수 $F^{-1}$ 과 균등 분포만 있으면 어떤 분포든 (이론적으로는) 뽑을 수 있다.&lt;/p&gt;
&lt;h2 id="알고리즘"&gt;알고리즘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;$f(x)$ 의 CDF $F(x) = \displaystyle\int_{-\infty}^{x} f(t)\,dt$ 를 구한다.&lt;/li&gt;
&lt;li&gt;$F$ 의 역함수 $F^{-1}$ 을 구한다.&lt;/li&gt;
&lt;li&gt;균등 분포에서 $u \sim \mathrm{Unif}(0,1)$ 을 뽑는다.&lt;/li&gt;
&lt;li&gt;$x = F^{-1}(u)$ 로 변환하면 $x \sim f(x)$ 이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;샘플링한 $u$ 들을 $F^{-1}$ 에 넣은 후 히스토그램으로 그리면 $f(x)$ 의 분포에 근사한다.&lt;/p&gt;
&lt;h2 id="왜-동작하나-간단-증명"&gt;왜 동작하나 (간단 증명)&lt;/h2&gt;
&lt;p&gt;$U \sim \mathrm{Unif}(0,1)$ 이라 하자. $X = F^{-1}(U)$ 의 CDF를 계산하면&lt;/p&gt;
$$P(X \le x) = P(F^{-1}(U) \le x) = P(U \le F(x)) = F(x)$$&lt;p&gt;마지막 등호는 $U$ 가 $[0,1]$ 균등 분포이기 때문 ($P(U \le t) = t$). 즉 $X$ 의 CDF가 $F$ 와 같으므로 $X \sim f$. $\blacksquare$&lt;/p&gt;
&lt;h2 id="기하학적-직관"&gt;기하학적 직관&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;$f(x)$ 가 한쪽으로 치우친 분포라고 하자 (예: $0$ 근처에 mass가 몰린 감소하는 밀도).&lt;/li&gt;
&lt;li&gt;$F^{-1}$ 은 $u$-축의 균등한 구간을 $x$-축의 &lt;strong&gt;불균등한 구간&lt;/strong&gt;으로 매핑한다.
&lt;ul&gt;
&lt;li&gt;$f(x)$ 가 큰 영역 → $F$ 가 가파르게 증가 → $F^{-1}$ 은 완만 → 좁은 $x$ 구간이 넓은 $u$ 구간에 대응&lt;/li&gt;
&lt;li&gt;$f(x)$ 가 작은 영역 → $F$ 가 느리게 증가 → $F^{-1}$ 은 가파름 → 넓은 $x$ 구간이 좁은 $u$ 구간에 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따라서 균등 분포 $u$ 를 뽑아 $F^{-1}$ 에 넣으면, &lt;strong&gt;밀도가 높은 $x$ 영역에는 많은 샘플이, 낮은 영역에는 적은 샘플이&lt;/strong&gt; 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;예: $u$ 를 10개 뽑아 $F^{-1}$ 에 넣으면, 결과 히스토그램이 원본 $f(x)$ 와 닮아간다.&lt;/p&gt;
&lt;h2 id="한계"&gt;한계&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;$F^{-1}$ 을 닫힌 형태로 구할 수 있어야 깔끔하게 쓸 수 있다 (지수, 균등, 로지스틱 등).&lt;/li&gt;
&lt;li&gt;닫힌 형태 $F^{-1}$ 이 없거나 다변량으로 확장하기 어려울 때는 &lt;strong&gt;Rejection sampling&lt;/strong&gt;, &lt;strong&gt;MCMC&lt;/strong&gt; (Gibbs, Metropolis-Hastings) 등 다른 기법을 쓴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Permutation Test</title><link>https://chaeniverse.github.io/blog/permutation-test/</link><pubDate>Thu, 03 Nov 2022 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/permutation-test/</guid><description>&lt;h2 id="permutation-test"&gt;Permutation Test&lt;/h2&gt;
&lt;p&gt;Permutation test는 &lt;strong&gt;비모수(nonparametric) 가설 검정&lt;/strong&gt; 방법이다. 표본 크기가 작거나 데이터가 정규분포를 따르지 않을 때 사용한다. 특히 표본 수가 제한적인 genomic 데이터 분석 등에서 유용하다.&lt;/p&gt;
&lt;h2 id="핵심-아이디어"&gt;핵심 아이디어&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;가정.&lt;/strong&gt; 두 표본이 &lt;strong&gt;같은 모집단 분포&lt;/strong&gt;에서 왔다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;논리.&lt;/strong&gt; 만약 이 가정이 맞다면, 데이터를 무작위로 섞어도 분포는 같아야 한다. 즉, 라벨(어느 그룹 소속인지)은 사실상 의미가 없다.&lt;/p&gt;
&lt;p&gt;→ 그래서 &lt;strong&gt;라벨을 섞어서 검정 통계량을 다시 계산&lt;/strong&gt;해도, 원래 관측한 값과 비슷한 분포가 나와야 한다. 이 분포로부터 멀리 떨어져 있다면 가정이 틀렸다고(=두 그룹이 다른 분포에서 왔다고) 결론낼 수 있다.&lt;/p&gt;
&lt;h2 id="절차"&gt;절차&lt;/h2&gt;
&lt;p&gt;두 그룹의 평균 차 (test statistic) 가 $T_{\text{obs}} = 9.33$ 으로 관측되었다고 하자. 표본이 작고 비정규라 모수 검정은 못 쓰는 상황이다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;두 그룹 데이터를 합친 뒤 &lt;strong&gt;무작위로 섞는다 (약 1,000회 반복)&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;각 permutation마다 평균 차 $T^{(b)}$ 를 계산한다 ($b = 1, \dots, B$).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\{T^{(b)}\}$ 의 히스토그램을 그린다 — 이게 귀무가설 하의 경험적 분포다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;관측값보다 더 극단적인 permutation 개수를 센다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;p-value 계산:&lt;/p&gt;
$$p = \frac{\#\{b : T^{(b)} \ge T_{\text{obs}}\}}{B}$$&lt;p&gt;(단측 검정의 경우. 양측이면 절댓값 기준으로 비교)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="해석"&gt;해석&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관측값 $T_{\text{obs}}$ 가 permutation 분포의 &lt;strong&gt;꼬리 끝&lt;/strong&gt;에 있으면 → 두 그룹이 다른 분포에서 왔다는 강력한 증거.&lt;/li&gt;
&lt;li&gt;관측값이 분포의 &lt;strong&gt;중앙 근처&lt;/strong&gt;에 있으면 → 두 그룹이 같은 모집단에서 왔다고 봐도 무방.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;더 작은지&amp;quot;를 검정하는 단측 검정이라면 부등호 방향만 뒤집어 카운트.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="왜-좋은가"&gt;왜 좋은가&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;모수 가정 (정규성, 등분산 등) 없이 동작한다.&lt;/li&gt;
&lt;li&gt;표본 수가 작아서 점근 이론을 못 쓰는 상황에서도 유효하다.&lt;/li&gt;
&lt;li&gt;검정 통계량을 자유롭게 정의할 수 있다 (평균 차, 중앙값 차, 상관 계수 등 무엇이든).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;대신 계산량이 크다 — $B$ 를 충분히 크게 해야 p-value의 정밀도이 나온다 (예: $B=1{,}000$ 이면 p-value 정밀도은 0.001).&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;p&gt;참고:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Rao–Blackwell Theorem</title><link>https://chaeniverse.github.io/blog/rao-blackwell-theorem/</link><pubDate>Mon, 31 Oct 2022 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/rao-blackwell-theorem/</guid><description>&lt;h2 id="raoblackwell-theorem"&gt;Rao–Blackwell Theorem&lt;/h2&gt;
&lt;p&gt;$g(\theta)$ 를 모수의 함수, 그리고&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$S$ : sufficient statistic&lt;/li&gt;
&lt;li&gt;$T$ : $g(\theta)$ 의 unbiased estimator (u.e.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;라 하자. 이때&lt;/p&gt;
$$f(S) \;=\; E(T(X) \mid S) \;=\; E(T \mid S)$$&lt;p&gt;는 $g(\theta)$ 에 의존하지 않는 &lt;strong&gt;통계량&lt;/strong&gt;이며, $f(S)$ 도 역시 $g(\theta)$ 의 비편향추정량이다.&lt;/p&gt;
&lt;p&gt;(여기서 $f(S)$ 의 정의가 $\theta$ 에 의존하지 않는다 — $S$ 가 sufficient이기 때문에 $T \mid S$ 의 분포가 $\theta$ 와 무관해서, 조건부 기댓값도 $\theta$ 와 무관하다.)&lt;/p&gt;
&lt;p&gt;또한 모든 $\theta$ 에 대하여 다음이 성립한다.&lt;/p&gt;
$$\mathrm{Var}(f(S)) \;\le\; \mathrm{Var}(T(X)) \tag{1}$$&lt;p&gt;따라서 $f(S)$ 는 &lt;strong&gt;MVUE 가 될 후보&lt;/strong&gt;가 된다.&lt;/p&gt;
&lt;p&gt;이제 (1)을 증명하자.&lt;/p&gt;
&lt;h2 id="증명"&gt;증명&lt;/h2&gt;
&lt;p&gt;먼저 $f(S)$ 가 비편향임을 확인:&lt;/p&gt;
$$E(f(S)) = E\big(E(T(X) \mid S)\big) = E(T(X)) = g(\theta) \quad \text{(이중기댓값 정리)}$$&lt;p&gt;이제 $\mathrm{Var}(T(X))$ 를 전개한다. $E(f(S)) = g(\theta)$ 이고 $E(T(X)) = g(\theta)$ 이므로&lt;/p&gt;
$$\mathrm{Var}(T(X)) = E\big[T(X) - E(f(S))\big]^2$$&lt;p&gt;$T(X)$ 와 $E(f(S))$ 사이에 $f(S)$ 를 더하고 빼서 분리한다 ($+f(S) - f(S)$):&lt;/p&gt;
$$= E\big[(T(X) - f(S)) + (f(S) - E(f(S)))\big]^2$$&lt;p&gt;제곱을 전개하면&lt;/p&gt;
$$= \underbrace{E\big[T(X) - f(S)\big]^2}_{\text{(I)}} \;+\; 2\underbrace{E\big[(T(X) - f(S))(f(S) - E(f(S)))\big]}_{(\star)} \;+\; \underbrace{E\big[f(S) - E(f(S))\big]^2}_{=\,\mathrm{Var}(f(S))}$$&lt;h3 id="핵심-교차항"&gt;핵심: 교차항 $(\star) = 0$&lt;/h3&gt;
$$(\star) = E\big[(T(X) - f(S))(f(S) - E(f(S)))\big]
= E\Big[\,E\big[(T(X) - f(S))(f(S) - E(f(S))) \,\big|\, S\big]\,\Big]$$&lt;p&gt;조건부 안에서 $f(S)$ 와 $E(f(S))$ 는 $S$ 에 대해 상수처럼 다룰 수 있으므로 (전자는 $S$ 의 함수, 후자는 그냥 상수)&lt;/p&gt;
$$= E\Big[\,(f(S) - E(f(S))) \cdot E\big[T(X) - f(S) \,\big|\, S\big]\,\Big]$$&lt;p&gt;내부 조건부 기댓값을 분리하면&lt;/p&gt;
$$E\big[T(X) - f(S) \,\big|\, S\big] = E(T(X) \mid S) - E(f(S) \mid S) = f(S) - f(S) = 0$$&lt;p&gt;(첫 항은 $f(S)$ 의 정의 자체이고, 둘째 항은 $f(S)$ 가 $S$ 의 함수라 $E(f(S) \mid S) = f(S)$.)&lt;/p&gt;
&lt;p&gt;따라서 $(\star) = 0$.&lt;/p&gt;
&lt;h3 id="결론"&gt;결론&lt;/h3&gt;
$$\mathrm{Var}(T(X)) = E[T(X) - f(S)]^2 + \mathrm{Var}(f(S)) \;\ge\; \mathrm{Var}(f(S))$$&lt;p&gt;$E[T(X) - f(S)]^2 \ge 0$ 이므로&lt;/p&gt;
$$\mathrm{Var}(f(S)) \le \mathrm{Var}(T(X)) \qquad \blacksquare$$&lt;h2 id="한-줄-요약"&gt;한 줄 요약&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;&lt;strong&gt;충분통계량으로 조건부 기댓값을 취하면, 비편향성을 유지하면서 분산이 감소한다.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;이 때문에 MVUE를 찾을 때는 어떤 비편향추정량을 가지고 시작하든 sufficient statistic으로 Rao–Blackwell화 (Rao–Blackwellize)하는 것이 유리하다. 단, 이렇게 얻은 $f(S)$ 가 &lt;strong&gt;유일한 MVUE&lt;/strong&gt;라고 결론지으려면 $S$ 의 &lt;strong&gt;완비성 (completeness)&lt;/strong&gt; 이 추가로 필요하며, 이것이 Lehmann–Scheffé 정리로 이어진다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>