<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://qumiclub.github.io/club-welcome-page/feed.xml" rel="self" type="application/atom+xml" /><link href="https://qumiclub.github.io/club-welcome-page/" rel="alternate" type="text/html" /><updated>2026-07-15T01:38:49+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/feed.xml</id><title type="html">九州大学医学部情報研</title><subtitle>九州大学医系サークル・九州大学医学部情報研です、病院キャンパスでKaggleや統計解析の勉強会等の活動を行っています</subtitle><entry><title type="html">統計検定合格体験記</title><link href="https://qumiclub.github.io/club-welcome-page/2026/05/12/%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A%E5%90%88%E6%A0%BC%E4%BD%93%E9%A8%93%E8%A8%98.html" rel="alternate" type="text/html" title="統計検定合格体験記" /><published>2026-05-12T00:00:00+00:00</published><updated>2026-05-12T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2026/05/12/%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A%E5%90%88%E6%A0%BC%E4%BD%93%E9%A8%93%E8%A8%98</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2026/05/12/%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A%E5%90%88%E6%A0%BC%E4%BD%93%E9%A8%93%E8%A8%98.html"><![CDATA[<h2 id="はじめに">はじめに</h2>

<p>私は大学の講義で統計学を学ぶ機会がなく、以前から自身のスキルアップのために勉強したいと考えていました。そんな折、友人からこの検定を勧められ、2級および準1級を受験しました。</p>

<h2 id="学習方法">学習方法</h2>
<p>学習には日本統計学会のテキストと問題集を使用しました。いきなり問題演習に入るのではなく、まずはテキストの内容をしっかり理解することを重視し、掲載されている例題をすべて自力で解けるようになるまで繰り返し取り組みました。そのうえで問題集に進み、過去問も含めて演習を重ねました。</p>

<h2 id="スケジュール2級">スケジュール（2級）</h2>
<p>2級の勉強は3年次の10月頃から始めました。春休みが始まる1月末までは空き時間を利用してテキストを少しずつ読み進め、休みに入ってから集中的に学習を進めました。試験本番では対応しきれなかった問題も何問かありましたが、無事合格することができました。</p>

<h2 id="スケジュール準1級">スケジュール（準1級）</h2>
<p>2級合格後すぐに準1級の勉強を始めました。2級の受験時は明確な目標を設定していなかったため、学習を怠ってしまうこともありました。その反省を踏まえ、準1級では「年度内合格」を目標に学習を進めました。2級と比べて範囲が広く、線形代数に関する深い知識が必要なこともあり、苦戦しました。試験本番では、偏相関係数などの過去問だけでは十分にカバーしきれなかった分野について得点を落としてしまいました。</p>

<h2 id="おわりに">おわりに</h2>
<p>統計学の知識はデータ分析の上で重要です。機械学習においても、データを適切に解釈するためにはこうした基礎理解が大きな意味を持つと感じています。今後は1級合格に向け、引き続き学習を進めていきます。<br />
本記事が、統計検定の受験を考えている方の参考になれば幸いです。</p>]]></content><author><name>Y.Atsushi</name></author><category term="統計検定" /><summary type="html"><![CDATA[はじめに]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">第7回全国医療AIコンテストまとめ</title><link href="https://qumiclub.github.io/club-welcome-page/2026/04/11/%E7%AC%AC7%E5%9B%9E%E5%85%A8%E5%9B%BD%E5%8C%BB%E7%99%82AI%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81.html" rel="alternate" type="text/html" title="第7回全国医療AIコンテストまとめ" /><published>2026-04-11T00:00:00+00:00</published><updated>2026-04-11T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2026/04/11/%E7%AC%AC7%E5%9B%9E%E5%85%A8%E5%9B%BD%E5%8C%BB%E7%99%82AI%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2026/04/11/%E7%AC%AC7%E5%9B%9E%E5%85%A8%E5%9B%BD%E5%8C%BB%E7%99%82AI%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%81%BE%E3%81%A8%E3%82%81.html"><![CDATA[<p>九大医学部情報研の甲斐です。この度、九州大学医学部情報研で主催いたしました「第7回全国医療AIコンテスト」が無事終了いたしましたので、まとめ記事を書かせていただきました。</p>

<h1 id="第7回全国医療aiコンテストとは">第7回全国医療AIコンテストとは</h1>
<p>2019年から始まって第7回となった医療AIの講演会とコンペティションが一体となったイベントです。医療AIに興味のある学生・医師・社会人が集まって、AIを応用した医療・介護・ヘルスケアの最先端についての講演会と医療データ解析コンペティションを行います。</p>

<p>第7回となる今回は、九州大学医学部情報研が主催を担当しました。本イベントは株式会社iPSポータル主催の2025年度 第2回 iPS細胞ビジネス協議会を兼ねてオンラインで実施されました。</p>

<p>また本イベントは以下の団体・企業様のご支援のもと開催されました。この場をお借りしてお礼申し上げます。</p>

<ul>
  <li>共催： 株式会社iPSポータル、第25回日本再生医療学会総会、一般社団法人臨床医工情報学コンソーシアム関西</li>
  <li>協賛： 大塚電子株式会社</li>
  <li>後援： 日本再生医療学会、京都府、京都市、九州大学 データ駆動イノベーション推進本部 健康医療DX推進部門</li>
</ul>

<p><img src="/club-welcome-page/assets/images/1775947086476-7AI-1.png" alt="第7回全国医療AIコンテスト_ポスター-1.png" /></p>

<h1 id="講演">講演</h1>
<p>今回は5名の先生方にご講演いただき、最後にコンテストの課題説明が行われました。各講演についてレポートを掲載します。</p>

<h2 id="aiデータサイエンスがもたらす医学医療の革新と課題">AI・データサイエンスがもたらす医学・医療の革新と課題</h2>
<h4 id="講演者川上-英良-先生-千葉大学-国際高等研究基幹-教授">講演者：川上 英良 先生 (千葉大学 国際高等研究基幹, 教授)</h4>

<p>データ駆動型の医学研究の重要性についてご講演いただきました。卵巣腫瘍の手術前診断において、教師なし学習を用いて症例の類似性を分析し、進行がんと同じような領域に配置される予後不良な早期がんの集団を発見した事例が紹介されました。また、心拍の変動といったウェアラブルデバイスのデータから、糖尿病や高血圧といった代謝疾患を検出するデジタルバイオマーカーの研究や、眼底画像の大規模基盤モデルを用いて網膜色素変性症の診断および視力低下の予測を行う事例など、個別化医療の実現に向けた取り組みをご紹介いただきました。</p>

<h2 id="再生医療研究の完全自動化への挑戦">再生医療研究の完全自動化への挑戦</h2>
<h4 id="講演者神田-元紀-先生-東京科学大学-ロボット科学分野-教授">講演者：神田 元紀 先生 (東京科学大学 ロボット科学分野, 教授)</h4>

<p>汎用人型ロボット「まほろ」を用いて、職人の技に依存していた再生医療用の細胞培養を自動化する取り組みが紹介されました。さらに、AIが実験計画を立て、ロボットが実行と評価を行う自律的なクローズドループ実験により高い分化誘導効率を達成した成果が示されました。また、将来的なロボット実験センターの構想や、フィジカルAIとAIエージェントを組み合わせて仮説生成から論文執筆までを自動化する、壮大なビジョンも語られました。</p>

<h2 id="先端技術が実現するより良い医療のかたち">先端技術が実現する「より良い医療のかたち」</h2>
<h4 id="講演者大嶽-和也-様-日本マイクロソフト株式会社-ヘルスケア統括本部">講演者：大嶽 和也 様 (日本マイクロソフト株式会社 ヘルスケア統括本部)</h4>

<p>医療現場での生成AI活用についてご講演いただきました。医療従事者の働き方改革が急務となる中、電子カルテと連携し、症状詳記や退院サマリ、薬歴文章などの医療文書作成を生成AIで支援することで、文書作成時間の短縮を達成している事例が紹介されました。また、複数のAIエージェントが連携して複雑なタスクを処理する「マルチエージェント」について、診断や創薬研究といった場面での将来像についても解説いただきました。</p>

<h2 id="エージェントフィジカルai時代の医療ヘルスケアai研究開発に向けて">エージェント・フィジカルAI時代の医療・ヘルスケアAI研究開発に向けて</h2>
<h4 id="講演者山田-泰永-様-nvidia合同会社">講演者：山田 泰永 様 (NVIDIA合同会社)</h4>

<p>ヘルスケア分野におけるNVIDIAの取り組みについてご講演いただきました。推論向けパッケージ「NVIDIA NIM」を用いることで、オープンソースのAIモデルを容易にサービス化できる点などが紹介されました。また、大量の手術動画を学習した「世界モデル」によって、データ拡張や臓器の動きの予測シミュレーションが可能になるという研究や、ロボットシミュレーター「Isaac」と人体モデルを組み合わせて超音波検査の物理シミュレーションと学習を行う最先端の技術動向が示されました。</p>

<h2 id="aiを活用した生命科学実験の自律的最適化--ロボティクスと連携した次世代アプローチ">AIを活用した生命科学実験の自律的最適化 ― ロボティクスと連携した次世代アプローチ</h2>
<h4 id="講演者小澤-陽介-様-エピストラ株式会社-ceo">講演者：小澤 陽介 様 (エピストラ株式会社, CEO)</h4>

<p>バイオ産業における品質のばらつきや高コストといった課題に対し、ベイズ最適化を用いた独自のAIアルゴリズムを用いて有望な条件を効率的に探索する手法が紹介されました。このAIとロボットを組み合わせることで、ES細胞からNK細胞への分化誘導効率を大幅に向上させ、培養期間を短縮させた事例や、大腸菌を用いたレチクリンという医療原料の生産性を倍増させた事例など、データドリブンな研究開発の成果が示されました。</p>

<h2 id="医療データを用いたaiコンテストの課題とルール説明">医療データを用いたAIコンテストの課題とルール説明</h2>
<h4 id="講演者代理甲斐-光-九州大学医学部医学科5年-kaggle-expert">講演者代理：甲斐 光 (九州大学医学部医学科5年, Kaggle Expert)</h4>

<p>今回のコンテストのテーマが再生医療ということで、人の臓器を模したミニ臓器、「オルガノイド」を用い、「オルガノイドの透過画像からAIで蛍光画像を予測生成する」という問題を出題いたしました。下図の左が透過画像、真ん中が蛍光画像、右がオルガノイドのマスク画像です。コンペの詳細は<a href="https://www.kaggle.com/competitions/medical-ai-contest-7th-2025/overview">こちら</a>を参考にしてください。
<img src="/club-welcome-page/assets/images/1775568477207-image.png" alt="image.png" /></p>

<p>本コンペティションには119名が参加登録し、80チームが精度を競い合いました。また、上位1-3位の方には、神戸国際会議場で開催された<a href="https://site.convention.co.jp/jsrm2026/">第25回再生医療学会総会</a>にて解法を発表していただきました。</p>

<h1 id="コンペティション結果">コンペティション結果</h1>

<p>結果は以下のようになりました。</p>

<ol>
  <li>Akima neilus チーム</li>
  <li>AcademiX Medical チーム</li>
  <li>OCUMIT チーム</li>
  <li>dalab チーム</li>
</ol>

<p>入賞おめでとうございます！！</p>

<h1 id="イベント運営コンペの反省">イベント運営・コンペの反省</h1>
<p>イベント運営の点では広報により力を入れるべきであったと思います。Xなどでもっと積極的に発信していればさらにたくさんの方々にご参加いただけたかもしれません。</p>

<p>コンペの点では、モデル使用についてのルールの設定があいまいだったため、参加者を困惑させてしまうことがありました。ルールについてコンペ開催前に十分に吟味することが必要だと感じました。</p>

<h1 id="謝辞">謝辞</h1>
<p>運営メンバーの皆様、顧問の新岡先生、登壇者の皆様、共催・協賛・後援の団体・企業の皆様のおかげで無事イベントを終えることができました。我々に貴重な機会を下さったこと、開催に様々な形で協力してくださったこと本当にありがとうございました。最後に、次回、第8回全国医療AIコンテストへの皆さんのご参加をお待ちしております！</p>]]></content><author><name>K.Hikaru</name></author><category term="全国医療AIコンテスト" /><summary type="html"><![CDATA[九大医学部情報研の甲斐です。この度、九州大学医学部情報研で主催いたしました「第7回全国医療AIコンテスト」が無事終了いたしましたので、まとめ記事を書かせていただきました。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">幅優先探索と深さ優先探索</title><link href="https://qumiclub.github.io/club-welcome-page/2026/03/31/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2%E3%81%A8%E6%B7%B1%E3%81%95%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2.html" rel="alternate" type="text/html" title="幅優先探索と深さ優先探索" /><published>2026-03-31T00:00:00+00:00</published><updated>2026-03-31T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2026/03/31/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2%E3%81%A8%E6%B7%B1%E3%81%95%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2026/03/31/%E5%B9%85%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2%E3%81%A8%E6%B7%B1%E3%81%95%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2.html"><![CDATA[<h1 id="幅優先探索と深さ優先探索">幅優先探索と深さ優先探索</h1>
<p>この記事はアルゴリズム初級者～中級者に向けた頂点探索アルゴリズムの解説です。</p>

<p>下図のような辺と頂点からなるグラフについて、辺をたどって各頂点を探索する方法を考えます。ただし、スタート地点の頂点を0番目とします。</p>

<p><img src="/club-welcome-page/assets/images/1774924048358-image.png" alt="image.png" /></p>

<h2 id="幅優先探索">幅優先探索</h2>

<p><img src="/club-welcome-page/assets/images/1774924376246-image.png" alt="image.png" /></p>

<p>上図のように各頂点から出る辺を並列にたどります。ここではキューを使います。</p>

<h3 id="キューdeque">キュー（deque）</h3>
<p>リストと似た構造ですが、先頭と末尾の要素をO(１)で追加、取り出すことができます。その代わり、両端以外の要素の操作にはリストより遅くなります。<br />
リストでは末尾の要素の操作はO(１)で出来ますが、先頭の要素の操作にはO(ｎ)のコストがかかります。</p>

<h3 id="探索">探索</h3>
<p>キューに頂点0が入っている状態から始めて、キューが空になるまで下の手順を繰り返します。</p>
<ol>
  <li>キューの先頭にある頂点を取り出す。</li>
  <li>取り出した頂点と辺でつながっている頂点を全てキューの末尾に追加する</li>
</ol>

<p><img src="/club-welcome-page/assets/images/1774924432454-image.png" alt="image.png" /></p>

<h2 id="深さ優先探索">深さ優先探索</h2>

<p><img src="/club-welcome-page/assets/images/1774924715226-image.png" alt="image.png" /></p>

<p>上図のように行き止まりまで探索し、行き止まりになったら分かれ道まで戻る、というのを繰り返します。ここでは再帰関数を使います。</p>

<h3 id="再帰関数">再帰関数</h3>
<p>関数内で自身を呼び出す関数です。下の例ではfunc(i)内でfunc(i + 1)が呼び出され、func(i + 1)内でfunc(i + 2)が呼び出され、とストッパーが発動するまで続きます。<br />
ここで、func(i)からfunc(i + 1)が呼び出される様子は上図の下向きの矢印、func(i + 1)の処理が終了した後func(i)に戻ってくる様子は上図の上向きの矢印で表されます。</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">i</span><span class="p">):</span>
  <span class="c1"># ストッパー
</span>  <span class="k">if</span> <span class="n">i</span>  <span class="o">&gt;</span> <span class="mi">1000</span><span class="p">:</span>
    <span class="k">return</span>

  <span class="n">func</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>
<p>ただしPythonでは再帰の深さに制限がかけられており、デフォルトで1000となっています。競プロではほとんどの場合足りないので、上限を1000000に変更します。</p>

<h2 id="実装例">実装例</h2>
<p>「下の迷路はスタートからゴールまでたどり着けるのか」という問題を解いてみましょう。<code class="language-plaintext highlighter-rouge">s</code>はスタート、<code class="language-plaintext highlighter-rouge">g</code>はゴール、<code class="language-plaintext highlighter-rouge">＃</code>は壁、<code class="language-plaintext highlighter-rouge">.</code>は道を表し、迷路の外周は壁に囲われているとします。また、上下左右に1マスずつ進むとします。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s.#..
..#..
.....
##.#.
....g
</code></pre></div></div>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">M</span> <span class="o">=</span>  <span class="p">[[</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'#'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">],</span>
      <span class="p">[</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'#'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">],</span>
      <span class="p">[</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">],</span>
      <span class="p">[</span><span class="s">'#'</span><span class="p">,</span><span class="s">'#'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'#'</span><span class="p">,</span><span class="s">'.'</span><span class="p">],</span>
      <span class="p">[</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">,</span><span class="s">'.'</span><span class="p">]]</span>
</code></pre></div></div>
<p>同じところをグルグル回っていてもゴールまでたどり着けないので、一度通った場所にはチェックを付けるようにします。</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 一度通った場所はTrueにする
</span><span class="n">visited</span> <span class="o">=</span> <span class="p">[[</span><span class="bp">True</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">],</span>
           <span class="p">[</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">],</span>
           <span class="p">[</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">],</span>
           <span class="p">[</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">],</span>
           <span class="p">[</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">]]</span>
</code></pre></div></div>
<p>また、迷路内の座標について、M[i][j]を(i, j)と表します。<br />
このとき、上移動は (i, j) → (i - 1, j) 、<br />
下移動は (i, j) → (i + 1, j) 、<br />
左移動は (i, j) → (i, j - 1) 、<br />
右移動は (i, j) → (i, j + 1) となります。</p>
<h3 id="幅優先探索での実装">幅優先探索での実装</h3>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># キューを作成
</span><span class="kn">from</span> <span class="nn">collectons</span> <span class="kn">import</span> <span class="n">deque</span>
<span class="n">Q</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)])</span>

<span class="c1"># Qが空になるまで続ける
</span><span class="k">while</span> <span class="n">Q</span><span class="p">:</span>
  <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="n">Q</span><span class="p">.</span><span class="n">popleft</span><span class="p">()</span>

  <span class="c1"># ゴールにたどり着いたらYesと表示し、終了
</span>  <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">4</span> <span class="ow">and</span> <span class="n">j</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">'Yes'</span><span class="p">)</span>
    <span class="nb">exit</span><span class="p">()</span>

  <span class="c1"># 上に移動
</span>  <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">Q</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span>

  <span class="c1"># 下に移動
</span>  <span class="k">if</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">Q</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span>

  <span class="c1"># 左に移動
</span>  <span class="k">if</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">Q</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span>

  <span class="c1"># 右に移動
</span>  <span class="k">if</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">4</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">Q</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>

<span class="c1"># ゴールできなかったらNoと表示
</span><span class="k">print</span><span class="p">(</span><span class="s">'No'</span><span class="p">)</span>
</code></pre></div></div>
<h3 id="深さ優先探索での実装">深さ優先探索での実装</h3>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 再帰上限を変更
</span><span class="kn">import</span> <span class="nn">sys</span>
<span class="n">sys</span><span class="p">.</span><span class="n">setrecursionlimit</span><span class="p">(</span><span class="mi">1000000</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span>
  <span class="k">global</span> <span class="n">check</span>
  <span class="c1"># ゴールにたどり着いたらYesと表示し、終了
</span>  <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">4</span> <span class="ow">and</span> <span class="n">j</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">'Yes'</span><span class="p">)</span>
    <span class="nb">exit</span><span class="p">()</span>

  <span class="c1"># 上に移動
</span>  <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span>

  <span class="c1"># 下に移動
</span>  <span class="k">if</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">dfs</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span>

  <span class="c1"># 左に移動
</span>  <span class="k">if</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>

  <span class="c1"># 右に移動
</span>  <span class="k">if</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">4</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
    <span class="n">visited</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>

<span class="n">dfs</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>

<span class="c1"># ゴールできなかったらNoと表示
</span><span class="k">print</span><span class="p">(</span><span class="s">'No'</span><span class="p">)</span>
</code></pre></div></div>
<h2 id="使い分け">使い分け</h2>
<p>深さ優先探索は迷路のような問題の場合、遠回りする可能性があります。<br />
一方、幅優先探索は多数の経路をまとめてキューで管理するためメモリを大量に消費します。<br />
基本的には遠回りする可能性がある場合は幅優先探索、そうでない場合は深さ優先探索を使います。</p>

<h1 id="幅優先探索の応用">幅優先探索の応用</h1>
<h2 id="01bfs">01BFS</h2>
<p>先ほどの迷路問題を少し変更します。<br />
移動に0または1のコストがかかるとし、スタートからゴールへ行くための最小コストを考えます。0のマスに進むためのコストが0、1のマスに進むためのコストが1です。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s0#00
00#10
10101
##1#0
1001g
</code></pre></div></div>
<p>ここでは、コストが小さい経路を優先して探索します。<br />
通常の幅優先探索では、進んだ先の情報を全てキューの末尾に追加していましたが、01BFSではコストが0の場合はキューの先頭へ、1の場合はキューの末尾へ追加します。<br />
上記の例題で、上方向への移動を通常の幅優先探索と01BFSで比較してみましょう。</p>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 通常の幅優先探索
</span><span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="s">'.'</span><span class="p">:</span>
  <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
  <span class="n">Q</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span>
</code></pre></div></div>
<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 01BFS
# 現在のコストの合計をcとする
</span><span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="ow">and</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">!=</span> <span class="s">'#'</span><span class="p">:</span>
  <span class="n">visited</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
  <span class="k">if</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
    <span class="n">Q</span><span class="p">.</span><span class="n">appendleft</span><span class="p">((</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">c</span><span class="p">))</span>
  <span class="k">else</span><span class="p">:</span>
    <span class="n">Q</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
</code></pre></div></div>
<p>現在のコストがcの時、キューには前半にコストcの経路が、後半にコストc + 1の経路が入っています。コストcの経路を全て探索し終えると、コストc + 1の経路を探索し始めます。</p>
<h2 id="ダイクストラ法">ダイクストラ法</h2>
<p>移動コストが01に限らず、様々な数字をとる場合を考えます。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>s4#83
02#26
15191
##2#0
1701g
</code></pre></div></div>
<p>01BFSと同様に現在のコストが小さい順に探索します。しかし、この場合<code class="language-plaintext highlighter-rouge">deque</code>ではキュー内の最小値が必ずしも先頭にあるとは限りません。そこで、優先度付きキューを導入します。</p>

<p>優先度付きキューとは、ヒープソートを利用して</p>
<ul>
  <li>要素をO(log(N))で追加する</li>
  <li>キュー内で優先度が最も高い要素をO(log(N))で取り出す</li>
</ul>

<p>ことができるキューです。</p>

<p>Pythonでは<code class="language-plaintext highlighter-rouge">heapq</code>をつかいます。これは、値が小さいほど優先度が高いとみなす優先度付きキューです。ソートを使うため、比べたいもの(今回はコスト)を先頭に置くようにしましょう。<br />
上記の例題で<code class="language-plaintext highlighter-rouge">deque</code>と<code class="language-plaintext highlighter-rouge">heapq</code>の使い方を比較してみましょう。</p>

<ul>
  <li>キューの作成</li>
</ul>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># deque
</span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">deque</span>
<span class="n">Q</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)])</span>
</code></pre></div></div>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># heapq
# コストを先頭にする
</span><span class="kn">import</span> <span class="nn">heapq</span>
<span class="n">Q</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)]</span>
<span class="n">heapq</span><span class="p">.</span><span class="n">heapfy</span><span class="p">(</span><span class="n">Q</span><span class="p">)</span>
</code></pre></div></div>

<ul>
  <li>要素の取り出し</li>
</ul>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># deque
</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="n">Q</span><span class="p">.</span><span class="n">popleft</span><span class="p">()</span>
</code></pre></div></div>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># heapq
</span><span class="n">c</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="n">heapq</span><span class="p">.</span><span class="n">heappop</span><span class="p">(</span><span class="n">Q</span><span class="p">)</span>
</code></pre></div></div>

<ul>
  <li>要素の追加</li>
</ul>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># deque
</span><span class="n">Q</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span>
</code></pre></div></div>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># heapq
</span><span class="n">heapq</span><span class="p">.</span><span class="n">heappush</span><span class="p">(</span><span class="n">Q</span><span class="p">,</span> <span class="p">(</span><span class="n">c</span> <span class="o">+</span> <span class="n">M</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">],</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span><span class="p">))</span>
</code></pre></div></div>

<p>さらに、全ての要素を-1倍することで<code class="language-plaintext highlighter-rouge">heapq</code>で最大値を優先して取り出すことができます。</p>]]></content><author><name>Y.Atsushi</name></author><category term="競プロ" /><category term="アルゴリズム" /><category term="Python" /><summary type="html"><![CDATA[幅優先探索と深さ優先探索 この記事はアルゴリズム初級者～中級者に向けた頂点探索アルゴリズムの解説です。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">数式Markdownテスト&amp;amp;チートシート</title><link href="https://qumiclub.github.io/club-welcome-page/2026/03/20/%E6%95%B0%E5%BC%8FMarkdown%E3%83%86%E3%82%B9%E3%83%88-%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88.html" rel="alternate" type="text/html" title="数式Markdownテスト&amp;amp;チートシート" /><published>2026-03-20T00:00:00+00:00</published><updated>2026-03-20T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2026/03/20/%E6%95%B0%E5%BC%8FMarkdown%E3%83%86%E3%82%B9%E3%83%88-%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2026/03/20/%E6%95%B0%E5%BC%8FMarkdown%E3%83%86%E3%82%B9%E3%83%88-%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88.html"><![CDATA[<p>この記事は、Markdown環境における数式（LaTeX形式）のレンダリングテストと、基本的な数式から深層学習で頻出の数式までの書き方をまとめた備忘録です。全てブロック形式で記載しています。</p>

<p>※数式が潰れないように <code class="language-plaintext highlighter-rouge">\dfrac</code> や <code class="language-plaintext highlighter-rouge">\limits</code> を使用し、ベクトル・行列には <code class="language-plaintext highlighter-rouge">\mathbf{}</code>（立体太字）や <code class="language-plaintext highlighter-rouge">\boldsymbol{}</code>（斜体/ギリシャ文字太字）を適用しています。</p>

<h2 id="0-基本的な数式-basic-math">0. 基本的な数式 (Basic Math)</h2>

<h3 id="分数-fractions">分数 (Fractions)</h3>
<p><code class="language-plaintext highlighter-rouge">\frac</code> の代わりに <code class="language-plaintext highlighter-rouge">\dfrac</code> を使うことで、行内で分数が小さく潰れるのを防ぎます。</p>

\[y = \dfrac{a}{b}\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">y </span><span class="o">=</span><span class="nb"> </span><span class="nv">\dfrac</span><span class="p">{</span><span class="nb">a</span><span class="p">}{</span><span class="nb">b</span><span class="p">}$$</span>
</code></pre></div></div>
<hr />
<h3 id="平方根累乗根-roots">平方根・累乗根 (Roots)</h3>

\[y = \sqrt{x} + \sqrt[n]{x}\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">y </span><span class="o">=</span><span class="nb"> </span><span class="nv">\sqrt</span><span class="p">{</span><span class="nb">x</span><span class="p">}</span><span class="nb"> </span><span class="o">+</span><span class="nb"> </span><span class="nv">\sqrt</span><span class="o">[</span><span class="nb">n</span><span class="o">]</span><span class="p">{</span><span class="nb">x</span><span class="p">}$$</span>
</code></pre></div></div>
<hr />
<h3 id="行列-matrices">行列 (Matrices)</h3>
<p>行列を表す大文字アルファベットには <code class="language-plaintext highlighter-rouge">\mathbf{}</code> を使って太字にします。</p>

\[\mathbf{A} = \begin{pmatrix}
a_{11} &amp; a_{12} \\
a_{21} &amp; a_{22}
\end{pmatrix}\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">
</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">A</span><span class="p">}</span><span class="nb"> </span><span class="o">=</span><span class="nb"> </span><span class="nv">\begin</span><span class="p">{</span><span class="nb">pmatrix</span><span class="p">}</span><span class="nb">
a</span><span class="p">_{</span><span class="m">11</span><span class="p">}</span><span class="nb"> </span><span class="p">&amp;</span><span class="nb"> a</span><span class="p">_{</span><span class="m">12</span><span class="p">}</span><span class="nb"> </span><span class="nv">\\</span><span class="nb">
a</span><span class="p">_{</span><span class="m">21</span><span class="p">}</span><span class="nb"> </span><span class="p">&amp;</span><span class="nb"> a</span><span class="p">_{</span><span class="m">22</span><span class="p">}</span><span class="nb">
</span><span class="nv">\end</span><span class="p">{</span><span class="nb">pmatrix</span><span class="p">}</span><span class="nb">
</span><span class="p">$$</span>
</code></pre></div></div>
<hr />
<h3 id="総和と総乗-sum-and-product">総和と総乗 (Sum and Product)</h3>
<p>\(S = \sum_{i=1}^{n} x_i, \quad P = \prod_{i=1}^{n} x_i\)</p>
<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">S </span><span class="o">=</span><span class="nb"> </span><span class="nv">\sum</span><span class="p">_{</span><span class="nb">i</span><span class="o">=</span><span class="m">1</span><span class="p">}^{</span><span class="nb">n</span><span class="p">}</span><span class="nb"> x</span><span class="p">_</span><span class="nb">i, </span><span class="nv">\quad</span><span class="nb"> P </span><span class="o">=</span><span class="nb"> </span><span class="nv">\prod</span><span class="p">_{</span><span class="nb">i</span><span class="o">=</span><span class="m">1</span><span class="p">}^{</span><span class="nb">n</span><span class="p">}</span><span class="nb"> x</span><span class="p">_</span><span class="nb">i</span><span class="p">$$</span>

</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">\limits</code>をいれると、数字が記号の上下にきます。 <br />
\(S = \sum\limits_{i=1}^{n} x_i, \quad P = \prod\limits_{i=1}^{n} x_i\)</p>
<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">S </span><span class="o">=</span><span class="nb"> </span><span class="nv">\sum\limits</span><span class="p">_{</span><span class="nb">i</span><span class="o">=</span><span class="m">1</span><span class="p">}^{</span><span class="nb">n</span><span class="p">}</span><span class="nb"> x</span><span class="p">_</span><span class="nb">i, </span><span class="nv">\quad</span><span class="nb"> P </span><span class="o">=</span><span class="nb"> </span><span class="nv">\prod\limits</span><span class="p">_{</span><span class="nb">i</span><span class="o">=</span><span class="m">1</span><span class="p">}^{</span><span class="nb">n</span><span class="p">}</span><span class="nb"> x</span><span class="p">_</span><span class="nb">i</span><span class="p">$$</span>
</code></pre></div></div>

<hr />

<h2 id="1-活性化関数-activation-functions">1. 活性化関数 (Activation Functions)</h2>

<h3 id="シグモイド関数-sigmoid-function">シグモイド関数 (Sigmoid Function)</h3>

\[\sigma(x) = \dfrac{1}{1 + e^{-x}}\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nv">\sigma</span><span class="o">(</span><span class="nb">x</span><span class="o">)</span><span class="nb"> </span><span class="o">=</span><span class="nb"> </span><span class="nv">\dfrac</span><span class="p">{</span><span class="m">1</span><span class="p">}{</span><span class="m">1</span><span class="nb"> </span><span class="o">+</span><span class="nb"> e</span><span class="p">^{</span><span class="o">-</span><span class="nb">x</span><span class="p">}}$$</span>
</code></pre></div></div>
<hr />
<h3 id="relu関数-rectified-linear-unit">ReLU関数 (Rectified Linear Unit)</h3>

\[f(x) = \max(0, x)\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">f</span><span class="o">(</span><span class="nb">x</span><span class="o">)</span><span class="nb"> </span><span class="o">=</span><span class="nb"> </span><span class="nv">\max</span><span class="o">(</span><span class="m">0</span><span class="nb">, x</span><span class="o">)</span><span class="p">$$</span>
</code></pre></div></div>
<hr />
<h3 id="ソフトマックス関数-softmax-function">ソフトマックス関数 (Softmax Function)</h3>

\[y_i = \dfrac{e^{x_i}}{\sum_{k=1}^{n} e^{x_k}}\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">y</span><span class="p">_</span><span class="nb">i </span><span class="o">=</span><span class="nb"> </span><span class="nv">\dfrac</span><span class="p">{</span><span class="nb">e</span><span class="p">^{</span><span class="nb">x</span><span class="p">_</span><span class="nb">i</span><span class="p">}}{</span><span class="nv">\sum</span><span class="p">_{</span><span class="nb">k</span><span class="o">=</span><span class="m">1</span><span class="p">}^{</span><span class="nb">n</span><span class="p">}</span><span class="nb"> e</span><span class="p">^{</span><span class="nb">x</span><span class="p">_</span><span class="nb">k</span><span class="p">}}$$</span>
</code></pre></div></div>

<hr />

<h2 id="2-損失関数-loss-functions">2. 損失関数 (Loss Functions)</h2>

<h3 id="平均二乗誤差-mean-squared-error-mse">平均二乗誤差 (Mean Squared Error: MSE)</h3>

\[L = \dfrac{1}{N} \sum\limits_{i=1}^{N} (y_i - t_i)^2\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">L </span><span class="o">=</span><span class="nb"> </span><span class="nv">\dfrac</span><span class="p">{</span><span class="m">1</span><span class="p">}{</span><span class="nb">N</span><span class="p">}</span><span class="nb"> </span><span class="nv">\sum\limits</span><span class="p">_{</span><span class="nb">i</span><span class="o">=</span><span class="m">1</span><span class="p">}^{</span><span class="nb">N</span><span class="p">}</span><span class="nb"> </span><span class="o">(</span><span class="nb">y</span><span class="p">_</span><span class="nb">i </span><span class="o">-</span><span class="nb"> t</span><span class="p">_</span><span class="nb">i</span><span class="o">)</span><span class="p">^</span><span class="m">2</span><span class="p">$$</span>
</code></pre></div></div>
<hr />
<h3 id="交差エントロピー誤差-cross-entropy-loss">交差エントロピー誤差 (Cross-Entropy Loss)</h3>

\[L = -\sum_{i} t_i \log y_i\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">L </span><span class="o">=</span><span class="nb"> </span><span class="o">-</span><span class="nv">\sum</span><span class="p">_{</span><span class="nb">i</span><span class="p">}</span><span class="nb"> t</span><span class="p">_</span><span class="nb">i </span><span class="nv">\log</span><span class="nb"> y</span><span class="p">_</span><span class="nb">i</span><span class="p">$$</span>
</code></pre></div></div>

<hr />

<h2 id="3-最適化と学習-optimization-and-learning">3. 最適化と学習 (Optimization and Learning)</h2>

<h3 id="勾配降下法-gradient-descent">勾配降下法 (Gradient Descent)</h3>
<p>パラメータ（ギリシャ文字）を太字にするために <code class="language-plaintext highlighter-rouge">\boldsymbol{}</code> を使用しています。</p>

\[\boldsymbol{\theta}_{t+1} = \boldsymbol{\theta}_t - \eta \nabla L(\boldsymbol{\theta}_t)\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nv">\boldsymbol</span><span class="p">{</span><span class="nv">\theta</span><span class="p">}_{</span><span class="nb">t</span><span class="o">+</span><span class="m">1</span><span class="p">}</span><span class="nb"> </span><span class="o">=</span><span class="nb"> </span><span class="nv">\boldsymbol</span><span class="p">{</span><span class="nv">\theta</span><span class="p">}_</span><span class="nb">t </span><span class="o">-</span><span class="nb"> </span><span class="nv">\eta</span><span class="nb"> </span><span class="nv">\nabla</span><span class="nb"> L</span><span class="o">(</span><span class="nv">\boldsymbol</span><span class="p">{</span><span class="nv">\theta</span><span class="p">}_</span><span class="nb">t</span><span class="o">)</span><span class="p">$$</span>
</code></pre></div></div>

<h3 id="adam-adaptive-moment-estimationの更新式">Adam (Adaptive Moment Estimation)の更新式</h3>
<p>ベクトル（$m, v, g$）には <code class="language-plaintext highlighter-rouge">\mathbf{}</code>、パラメータ（$\theta$）には <code class="language-plaintext highlighter-rouge">\boldsymbol{}</code> を適用しています。</p>

\[\begin{aligned}
\mathbf{m}_t &amp;= \beta_1 \mathbf{m}_{t-1} + (1 - \beta_1) \mathbf{g}_t \\
\mathbf{v}_t &amp;= \beta_2 \mathbf{v}_{t-1} + (1 - \beta_2) \mathbf{g}_t^2 \\
\hat{\mathbf{m}}_t &amp;= \dfrac{\mathbf{m}_t}{1 - \beta_1^t} \\
\hat{\mathbf{v}}_t &amp;= \dfrac{\mathbf{v}_t}{1 - \beta_2^t} \\
\boldsymbol{\theta}_{t+1} &amp;= \boldsymbol{\theta}_t - \dfrac{\eta}{\sqrt{\hat{\mathbf{v}}_t} + \epsilon} \hat{\mathbf{m}}_t
\end{aligned}\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nb">
</span><span class="nv">\begin</span><span class="p">{</span><span class="nb">aligned</span><span class="p">}</span><span class="nb">
</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">m</span><span class="p">}_</span><span class="nb">t </span><span class="p">&amp;</span><span class="o">=</span><span class="nb"> </span><span class="nv">\beta</span><span class="p">_</span><span class="m">1</span><span class="nb"> </span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">m</span><span class="p">}_{</span><span class="nb">t</span><span class="o">-</span><span class="m">1</span><span class="p">}</span><span class="nb"> </span><span class="o">+</span><span class="nb"> </span><span class="o">(</span><span class="m">1</span><span class="nb"> </span><span class="o">-</span><span class="nb"> </span><span class="nv">\beta</span><span class="p">_</span><span class="m">1</span><span class="o">)</span><span class="nb"> </span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">g</span><span class="p">}_</span><span class="nb">t </span><span class="nv">\\</span><span class="nb">
</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">v</span><span class="p">}_</span><span class="nb">t </span><span class="p">&amp;</span><span class="o">=</span><span class="nb"> </span><span class="nv">\beta</span><span class="p">_</span><span class="m">2</span><span class="nb"> </span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">v</span><span class="p">}_{</span><span class="nb">t</span><span class="o">-</span><span class="m">1</span><span class="p">}</span><span class="nb"> </span><span class="o">+</span><span class="nb"> </span><span class="o">(</span><span class="m">1</span><span class="nb"> </span><span class="o">-</span><span class="nb"> </span><span class="nv">\beta</span><span class="p">_</span><span class="m">2</span><span class="o">)</span><span class="nb"> </span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">g</span><span class="p">}_</span><span class="nb">t</span><span class="p">^</span><span class="m">2</span><span class="nb"> </span><span class="nv">\\</span><span class="nb">
</span><span class="nv">\hat</span><span class="p">{</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">m</span><span class="p">}}_</span><span class="nb">t </span><span class="p">&amp;</span><span class="o">=</span><span class="nb"> </span><span class="nv">\dfrac</span><span class="p">{</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">m</span><span class="p">}_</span><span class="nb">t</span><span class="p">}{</span><span class="m">1</span><span class="nb"> </span><span class="o">-</span><span class="nb"> </span><span class="nv">\beta</span><span class="p">_</span><span class="m">1</span><span class="p">^</span><span class="nb">t</span><span class="p">}</span><span class="nb"> </span><span class="nv">\\</span><span class="nb">
</span><span class="nv">\hat</span><span class="p">{</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">v</span><span class="p">}}_</span><span class="nb">t </span><span class="p">&amp;</span><span class="o">=</span><span class="nb"> </span><span class="nv">\dfrac</span><span class="p">{</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">v</span><span class="p">}_</span><span class="nb">t</span><span class="p">}{</span><span class="m">1</span><span class="nb"> </span><span class="o">-</span><span class="nb"> </span><span class="nv">\beta</span><span class="p">_</span><span class="m">2</span><span class="p">^</span><span class="nb">t</span><span class="p">}</span><span class="nb"> </span><span class="nv">\\</span><span class="nb">
</span><span class="nv">\boldsymbol</span><span class="p">{</span><span class="nv">\theta</span><span class="p">}_{</span><span class="nb">t</span><span class="o">+</span><span class="m">1</span><span class="p">}</span><span class="nb"> </span><span class="p">&amp;</span><span class="o">=</span><span class="nb"> </span><span class="nv">\boldsymbol</span><span class="p">{</span><span class="nv">\theta</span><span class="p">}_</span><span class="nb">t </span><span class="o">-</span><span class="nb"> </span><span class="nv">\dfrac</span><span class="p">{</span><span class="nv">\eta</span><span class="p">}{</span><span class="nv">\sqrt</span><span class="p">{</span><span class="nv">\hat</span><span class="p">{</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">v</span><span class="p">}}_</span><span class="nb">t</span><span class="p">}</span><span class="nb"> </span><span class="o">+</span><span class="nb"> </span><span class="nv">\epsilon</span><span class="p">}</span><span class="nb"> </span><span class="nv">\hat</span><span class="p">{</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">m</span><span class="p">}}_</span><span class="nb">t
</span><span class="nv">\end</span><span class="p">{</span><span class="nb">aligned</span><span class="p">}</span><span class="nb">
</span><span class="p">$$</span>
</code></pre></div></div>

<hr />

<h2 id="4-発展的な構造-advanced-architectures">4. 発展的な構造 (Advanced Architectures)</h2>

<h3 id="scaled-dot-product-attention-transformer">Scaled Dot-Product Attention (Transformer)</h3>
<p>テキストがイタリックにならないよう、<code class="language-plaintext highlighter-rouge">\text{}</code>を使用しています。<br />
 行列 $Q, K, V$ を太字にしています。<br />
カッコのサイズを合わせるため、<code class="language-plaintext highlighter-rouge">( )</code>ではなく<code class="language-plaintext highlighter-rouge">\left \right</code>  を使っています。</p>

\[\text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}\left(\dfrac{\mathbf{Q}\mathbf{K}^T}{\sqrt{d_k}}\right)\mathbf{V}\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="nv">\text</span><span class="p">{</span><span class="nb">Attention</span><span class="p">}</span><span class="o">(</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">Q</span><span class="p">}</span><span class="nb">, </span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">K</span><span class="p">}</span><span class="nb">, </span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">V</span><span class="p">}</span><span class="o">)</span><span class="nb"> </span><span class="o">=</span><span class="nb"> </span><span class="nv">\text</span><span class="p">{</span><span class="nb">softmax</span><span class="p">}</span><span class="nv">\left</span><span class="o">(</span><span class="nv">\dfrac</span><span class="p">{</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">Q</span><span class="p">}</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">K</span><span class="p">}^</span><span class="nb">T</span><span class="p">}{</span><span class="nv">\sqrt</span><span class="p">{</span><span class="nb">d</span><span class="p">_</span><span class="nb">k</span><span class="p">}}</span><span class="nv">\right</span><span class="o">)</span><span class="nv">\mathbf</span><span class="p">{</span><span class="nb">V</span><span class="p">}$$</span>
</code></pre></div></div>

<h3 id="畳み込み演算-convolution">畳み込み演算 (Convolution)</h3>

\[(f * g)(t) = \displaystyle \int_{-\infty}^{\infty} f(\tau)g(t - \tau) d\tau\]

<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">$$</span><span class="o">(</span><span class="nb">f </span><span class="o">*</span><span class="nb"> g</span><span class="o">)(</span><span class="nb">t</span><span class="o">)</span><span class="nb"> </span><span class="o">=</span><span class="nb"> </span><span class="nv">\displaystyle</span><span class="nb"> </span><span class="nv">\int</span><span class="p">_{</span><span class="o">-</span><span class="nv">\infty</span><span class="p">}^{</span><span class="nv">\infty</span><span class="p">}</span><span class="nb"> f</span><span class="o">(</span><span class="nv">\tau</span><span class="o">)</span><span class="nb">g</span><span class="o">(</span><span class="nb">t </span><span class="o">-</span><span class="nb"> </span><span class="nv">\tau</span><span class="o">)</span><span class="nb"> d</span><span class="nv">\tau</span><span class="p">$$</span>
</code></pre></div></div>]]></content><author><name>K. Kotaro</name></author><category term="markdown" /><category term="test" /><summary type="html"><![CDATA[この記事は、Markdown環境における数式（LaTeX形式）のレンダリングテストと、基本的な数式から深層学習で頻出の数式までの書き方をまとめた備忘録です。全てブロック形式で記載しています。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">第7回全国医療AIコンテスト開催について</title><link href="https://qumiclub.github.io/club-welcome-page/2026/03/16/%E7%AC%AC7%E5%9B%9E%E5%85%A8%E5%9B%BD%E5%8C%BB%E7%99%82AI%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E9%96%8B%E5%82%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html" rel="alternate" type="text/html" title="第7回全国医療AIコンテスト開催について" /><published>2026-03-16T00:00:00+00:00</published><updated>2026-03-16T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2026/03/16/%E7%AC%AC7%E5%9B%9E%E5%85%A8%E5%9B%BD%E5%8C%BB%E7%99%82AI%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E9%96%8B%E5%82%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2026/03/16/%E7%AC%AC7%E5%9B%9E%E5%85%A8%E5%9B%BD%E5%8C%BB%E7%99%82AI%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E9%96%8B%E5%82%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html"><![CDATA[<h1 id="主催第7回-全国医療aiコンテスト開催のお知らせ">【主催】第7回 全国医療AIコンテスト開催のお知らせ</h1>

<p>九州大学医学部情報研が主催する、国内最大級の医療AIイベント「第7回 全国医療AIコンテスト」の開催が決定いたしました。</p>

<p>今回は<strong>参加資格を撤廃</strong>し、学生・社会人・学部を問わず、<strong>どなたでも</strong>ご参加いただけます。
MicrosoftやNVIDIA、第一線で活躍する研究者による豪華講演も同時開催されますので、ぜひ奮ってご参加ください！</p>

<h2 id="イベントの注目ポイント">イベントの注目ポイント</h2>
<ul>
  <li><strong>✅ 誰でも参加OK:</strong> 今回から社会人や非医療系の方も参加可能です。</li>
  <li><strong>💰 賞金あり:</strong> 優勝10万円ほか、上位入賞者には賞金が授与されます。</li>
  <li><strong>🎤 豪華講演:</strong> 12/27のキックオフでは、生成AI・ロボティクス・創薬など最先端の講演を実施。</li>
  <li><strong>🏅 学会登壇:</strong> 上位入賞者は「第25回日本再生医療学会総会」での招待講演権が得られます。</li>
</ul>

<h2 id="開催概要">開催概要</h2>
<ul>
  <li><strong>キックオフ:</strong> 2025年12月27日（土）オンライン開催</li>
  <li><strong>コンテスト期間:</strong> 2026年2月21日（土）まで</li>
  <li><strong>参加費:</strong> 無料</li>
</ul>

<p>▼ 参加登録・タイムテーブル等の詳細は、以下の特設サイトをご覧ください。</p>

<p><a href="https://medical-ai-contest.org/7th/">👉 <strong>第7回 全国医療AIコンテスト 公式サイトはこちら</strong></a></p>]]></content><author><name>K. Hikaru</name></author><category term="お知らせ" /><summary type="html"><![CDATA[【主催】第7回 全国医療AIコンテスト開催のお知らせ]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">医療AIの最前線、覗いてみませんか？超入門講義＆ハンズオン！（4/25 天神エンジニアカフェ）</title><link href="https://qumiclub.github.io/club-welcome-page/2026/03/16/%E5%8C%BB%E7%99%82AI%E3%81%AE%E6%9C%80%E5%89%8D%E7%B7%9A-%E8%A6%97%E3%81%84%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B-%E8%B6%85%E5%85%A5%E9%96%80%E8%AC%9B%E7%BE%A9-%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-4-25-%E5%A4%A9%E7%A5%9E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%82%AB%E3%83%95%E3%82%A7.html" rel="alternate" type="text/html" title="医療AIの最前線、覗いてみませんか？超入門講義＆ハンズオン！（4/25 天神エンジニアカフェ）" /><published>2026-03-16T00:00:00+00:00</published><updated>2026-03-16T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2026/03/16/%E5%8C%BB%E7%99%82AI%E3%81%AE%E6%9C%80%E5%89%8D%E7%B7%9A%E3%80%81%E8%A6%97%E3%81%84%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%EF%BC%9F%E8%B6%85%E5%85%A5%E9%96%80%E8%AC%9B%E7%BE%A9%EF%BC%86%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3%EF%BC%81%EF%BC%884-25-%E5%A4%A9%E7%A5%9E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%82%AB%E3%83%95%E3%82%A7%EF%BC%89</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2026/03/16/%E5%8C%BB%E7%99%82AI%E3%81%AE%E6%9C%80%E5%89%8D%E7%B7%9A-%E8%A6%97%E3%81%84%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B-%E8%B6%85%E5%85%A5%E9%96%80%E8%AC%9B%E7%BE%A9-%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-4-25-%E5%A4%A9%E7%A5%9E%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%82%AB%E3%83%95%E3%82%A7.html"><![CDATA[<h1 id="医療aiの最前線覗いてみませんか">医療AIの最前線、覗いてみませんか？</h1>

<p>初心者向けの入門講座とGoogle Colabを使ったハンズオンで、医療でのAI活用を体験していただきます！</p>

<p>本イベントは、九州大学医学部情報研が主催する、機械学習や深層学習の初心者、そして医療AI分野に興味をお持ちの方を対象とした特別企画です。プログラミング未経験の方でも安心してご参加いただける初心者レベルのハンズオンに加え、九州大学 データ駆動イノベーション推進本部 教授であり当サークル顧問の新岡宏彦先生による超入門講座を通じて、医療AIの最新知見を学ぶことができます。</p>

<h2 id="九州大学医学部情報研について">九州大学医学部情報研について</h2>
<p>九州大学医学部情報研は、情報技術と医療の融合領域に関心を持つ学生が集まるコミュニティです。医療や社会に対して確かな貢献ができる実力の養成を目指します。</p>

<h2 id="開催概要">開催概要</h2>

<ul>
  <li><strong>日時:</strong> 4月25日（土）14:00〜16:30（受付開始 13:30）</li>
  <li><strong>場所:</strong> エンジニアカフェ（福岡市中央区天神・赤煉瓦文化館内）</li>
  <li><strong>対象:</strong> 機械学習・深層学習の初心者、医療AIに興味がある方</li>
  <li><strong>持参物:</strong> ノートパソコン（ハンズオン演習で使用します）</li>
</ul>

<h2 id="タイムテーブル">タイムテーブル</h2>

<ul>
  <li><strong>13:30〜14:00</strong> 受付</li>
</ul>

<h3 id="第0部">【第0部】</h3>
<ul>
  <li><strong>14:00〜14:10</strong> 情報研の活動紹介（活動内容、入部案内）</li>
</ul>

<h3 id="第1部">【第1部】</h3>
<ul>
  <li><strong>14:15〜15:00</strong> 新岡先生より特別講演「医療×AIの最前線」</li>
</ul>

<h3 id="第2部">【第2部】</h3>
<ul>
  <li><strong>15:15〜16:15</strong> Google Colab超入門ハンズオン演習</li>
  <li><strong>16:15〜16:30</strong> 質疑応答</li>
</ul>

<h2 id="ご参加にあたっての注意事項">ご参加にあたっての注意事項</h2>

<ul>
  <li>サークルへの入部は学生に限ります。</li>
  <li>途中入退室可能です。</li>
</ul>

<h2 id="お申し込み">お申し込み</h2>
<p>こちらの<a href="https://docs.google.com/forms/d/e/1FAIpQLScBLmRESnHk5D_HVwGzgDiyvqTS6cDzXDGKX5MOGBxW4Q_ynw/viewform?usp=header">Googleフォーム</a>よりご登録ください。</p>]]></content><author><name>K.Hikaru</name></author><category term="新歓" /><summary type="html"><![CDATA[医療AIの最前線、覗いてみませんか？]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">RSNA2025上位解法まとめ</title><link href="https://qumiclub.github.io/club-welcome-page/2025/12/01/RSNA2025%E4%B8%8A%E4%BD%8D%E8%A7%A3%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81.html" rel="alternate" type="text/html" title="RSNA2025上位解法まとめ" /><published>2025-12-01T00:00:00+00:00</published><updated>2025-12-01T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2025/12/01/RSNA2025%E4%B8%8A%E4%BD%8D%E8%A7%A3%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2025/12/01/RSNA2025%E4%B8%8A%E4%BD%8D%E8%A7%A3%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81.html"><![CDATA[<h1 id="はじめに">はじめに</h1>

<p><a href="https://www.kaggle.com/competitions/rsna-intracranial-aneurysm-detection/overview">RSNA Intracranial Aneurysm Detection</a> という Kaggle コンペに参加しました。自分の復習も兼ねて上位（1st〜7th）の解法を読み、その内容をまとめます。特に各解法に出てくる図を理解したかったので、図をメインに整理しています。</p>

<blockquote>
  <p>筆者がポンコツなので、記事にミスがある・重要なところを見逃している可能性があります。記事の最後に各解法へのリンクをつけていますので、必ず原典も参考にしてください。（もし間違いに気づいたら、こっそり教えてもらえると助かります）</p>
</blockquote>

<h1 id="コンペ概要">コンペ概要</h1>

<h2 id="説明">説明</h2>

<ul>
  <li>
    <p>頭蓋内脳動脈瘤は世界人口の約 3％に影響を与え、毎年 50 万人以上が亡くなっており、その約半数は 50 歳未満です。</p>
  </li>
  <li>
    <p>今回のコンペでは、様々な施設から得られたデータを用いて、実際の臨床で起こるようなバイアス（施設ごとの撮像条件の差や、画像コントラストの違いなど）を考慮しつつ、汎用的に動くモデルの構築が課題とされました。</p>
  </li>
  <li>
    <p>評価指標は、動脈瘤が存在するかどうか（aneurysm_present; AP）と、脳動脈瘤の位置に対応した 13 個のラベルを合わせた 14 ラベルに対する AUC です。</p>
  </li>
</ul>

<h2 id="データ">データ</h2>

<p>学習には CTA、MRA、T1 MRI、T2 MRI など、複数モダリティで撮影された約 4,000 症例分の画像が提供されました。</p>

<ul>
  <li>
    <p><code class="language-plaintext highlighter-rouge">series</code> は各患者ごとに 1 セット与えられ、その中に頭部全体の 3D 画像がスライスとして並べられています。データ形式は DICOM です。</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">train.csv</code> には動脈瘤の有無と 13 個の位置ラベルのほか、年齢や性別などの情報が含まれています。</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">train_localizer.csv</code> では、動脈瘤の中心座標が与えられています。</p>
  </li>
  <li>
    <p>一部の series（約 200 個）には、血管セグメンテーションも提供されていました。</p>
  </li>
</ul>

<h1 id="上位解法の全体的な傾向">上位解法の全体的な傾向</h1>

<ul>
  <li>どのチームも何らかの <strong>マルチステージ構成（ROI 抽出 → 本タスク）</strong> を採用していました。</li>
  <li>3D モデル（nnU-Net, 3D ResNet など）を軸にしつつ、2D ベースのモデルや外部データも積極的に活用していました。</li>
</ul>

<h1 id="1-位解法">1 位解法</h1>

<h2 id="1st-stage--nnu-net-を用いた-roi-抽出">1st stage : nnU-Net を用いた ROI 抽出</h2>

<p><img src="/club-welcome-page/assets/images/1764402539603-image.png" alt="image.png" /></p>

<h3 id="preprocessed-volume">Preprocessed volume</h3>

<ul>
  <li>DICOM データを NIfTI に変換し、その後座標系を RAS に揃えたうえで読み込み、nnU-Net の標準前処理を適用しています。</li>
</ul>

<h3 id="coarse-scan">Coarse Scan</h3>

<ul>
  <li>
    <p>脳スキャンのボリュームを等方 1 mm にリサンプリングし、粗い nnU-Net（Model1）に入力します。このモデルは各ボクセルに対して 13+1 クラスではなく、4 クラス（0: 背景 + 3 つの血管グループ）のラベルを出力します。</p>
  </li>
  <li>
    <p>後処理としては、</p>
    <ol>
      <li>出力ラベルを「血管あり / 血管なし」の 2 値に変換</li>
      <li>血管ありボクセルの座標をすべて取得</li>
      <li>それらに対して <code class="language-plaintext highlighter-rouge">DBSCAN</code> によるクラスタリングを実施</li>
      <li>最も大きいクラスタの重心座標を計算</li>
      <li>その座標を中心として 140 mm の立方体 ROI をクロップし、ボクセルとして切り出す</li>
    </ol>

    <p>…という流れになっています。</p>
  </li>
</ul>

<h3 id="fine-inference">Fine Inference</h3>

<ul>
  <li>
    <p>先ほど抽出した ROI を <code class="language-plaintext highlighter-rouge">(0.80, 0.45, 0.44)</code> のボクセル間隔にリサンプリングします（この値は nnU-Net の学習結果から採用したと書かれていました）。この ROI を、設定の異なる 2 つの nnU-Net（Model2 / Model3）に入力します。</p>
  </li>
  <li>
    <p>Model2 の損失関数は <code class="language-plaintext highlighter-rouge">Dice + CE + SkeletonRecall(weight=1)</code>、Model3 は <code class="language-plaintext highlighter-rouge">Tversky + CE + SkeletonRecall(weight=3)</code> です。前者はバランス重視、後者は見逃しを極力減らすことを狙っていると考えられます。</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">ROI refine</code> では、Model2 のセグメンテーション結果から最小の bbox を作成し、そこに margin を追加して新しい ROI を定義します。それを分類モデルの入力サイズに合わせて補間し、最終的な <code class="language-plaintext highlighter-rouge">Final ROI</code> を作成します。このとき同時に、13 クラスの血管マスクも Model2/Model3 から出力しています。</p>
  </li>
</ul>

<h2 id="2nd-stage--13-クラス--動脈瘤有無--補助タスク">2nd stage : 13 クラス + 動脈瘤有無 + 補助タスク</h2>

<h3 id="nnu-net-backbone">nnU-Net Backbone</h3>

<p><img src="/club-welcome-page/assets/images/1764412257679-image.png" alt="image.png" /></p>

<ul>
  <li>
    <p>この図は、1st stage で抽出した情報を使って最終的な予測をどのように出しているかを示したものです。</p>
  </li>
  <li>
    <p>左上の <code class="language-plaintext highlighter-rouge">ROI Volume</code> が先ほどの <code class="language-plaintext highlighter-rouge">Final ROI</code> に対応します。<code class="language-plaintext highlighter-rouge">Vessel mask</code> は Model2/3 の出力を統合したものです。</p>
  </li>
  <li>
    <p>nnU-Net Backbone では、<code class="language-plaintext highlighter-rouge">1 × 128 × 256 × 256</code> の ROI から、エンコーダ最終層で <code class="language-plaintext highlighter-rouge">320 × 8 × 8 × 8</code>、デコーダ最終層で <code class="language-plaintext highlighter-rouge">64 × 64 × 128 × 128</code> の特徴マップを出力します。前者は最終的に ROI の特徴を集約した 64 次元のベクトルになり、後者は補助タスクや Union（動脈瘤が存在するかどうか）、13 クラスの推定に用いられます。</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">Aneurysm Detection Head</code> では、nnU-Net デコーダの特徴マップに Conv ヘッドを付け、補助タスクとして「動脈瘤の存在する球」を予測し、そのロスを計算しています。この教師データには、おそらく <code class="language-plaintext highlighter-rouge">train_localizer.csv</code> の動脈瘤座標を使っていると思われます。</p>
  </li>
</ul>

<h3 id="vessel-region-masked-pooling">Vessel Region-Masked Pooling</h3>

<p><img src="/club-welcome-page/assets/images/1764414914932-image.png" alt="image.png" /></p>

<ul>
  <li>
    <p>この図は、上の図にも出てきた <code class="language-plaintext highlighter-rouge">Vessel Region-Masked Pooling</code> を説明しています。まず、Vessel Mask をデコーダ出力と同じ解像度にダウンサンプリングし、Decoder の特徴量と要素ごとに掛け合わせます。</p>
  </li>
  <li>
    <p>Mask は 0〜1 の値を取るので、Mask が 0 の位置の特徴は 0 に、1 の位置の特徴はそのまま残ります。これにより「どこに注目すべきか」を明示した状態で特徴量を集約できるようになります。掛け合わせた特徴量をチャネルごとに、マスクが 1 の領域内で平均してベクトルとして出力します。</p>
  </li>
  <li>
    <p>1 つ前の図では <code class="language-plaintext highlighter-rouge">Union</code> と書かれていましたが、これは 13 クラスを「動脈瘤が存在するかどうか」の 1 クラスにまとめたもので、処理自体は同様です。</p>
  </li>
</ul>

<h3 id="location-aware-transformer">Location-Aware Transformer</h3>

<p><img src="/club-welcome-page/assets/images/1764416118197-image.png" alt="image.png" /></p>

<ul>
  <li>
    <p>この図は、2 つ前の図の <code class="language-plaintext highlighter-rouge">Location-Aware Transformer</code> に入力される特徴量の構成を説明しています。</p>
  </li>
  <li>
    <p>緑色のベクトルが、先ほどの Vessel Mask によるマスク付きプーリングで得た 13 クラス分の特徴量です。これに、nnU-Net エンコーダから抽出したグローバルな特徴量を複数コピーして結合し、<code class="language-plaintext highlighter-rouge">Linear Projection</code> ブロックで Transformer 用の埋め込みベクトルに射影しています。</p>
  </li>
</ul>

<h3 id="その他の工夫">その他の工夫</h3>

<ul>
  <li>フェイルセーフ機構を用いて、セグメンテーションや ROI 抽出で異常が発生した場合は、事前に計算しておいた OOF の確率を返すようにしていた。</li>
  <li>推論時には TTA（Flip など）を使用。</li>
  <li>強めの Data Augmentation を適用。</li>
  <li>TensorRT による推論高速化。</li>
</ul>

<h1 id="2-位解法">2 位解法</h1>

<h2 id="データの前処理">データの前処理</h2>

<ul>
  <li>
    <p>今回のデータセットは、①モダリティがバラバラ、②スライス間隔（SliceThickness / SpacingBetweenSlices）がバラバラ、③1 ファイルに複数フレームが入っているケースがある、などの理由で、画一的な前処理が難しい問題設定でした。</p>
  </li>
  <li>
    <p>DICOM データを pydicom で読み込み、SliceThickness 等のメタデータが存在しない場合でもスライス間隔を推定できるようなロジックを用意していました。</p>
  </li>
  <li>
    <p>また、T2 画像は他のシリーズとは画像の向きが異なることがあるため、<strong>T2 専用の方向分類器</strong> を作成し、向きの正規化を行っていました。</p>
  </li>
</ul>

<h2 id="1st-stage">1st stage</h2>

<p><img src="/club-welcome-page/assets/images/1764429623005-image.png" alt="image.png" /></p>

<ul>
  <li>
    <p>axial / sagittal / coronal の 3 方向それぞれから 3 枚ずつ、計 9 枚のスライスを取得します。</p>
  </li>
  <li>
    <p>これら 2D 画像を 2D nnU-Net に入力し、背景と血管の 2 値マスクを作成します。</p>
  </li>
  <li>
    <p>axial / sagittal / coronal それぞれの方向でマスクが得られるので、それらを組み合わせることで 3D の ROI をクロップします。</p>
  </li>
</ul>

<h2 id="2nd-stage">2nd stage</h2>

<p><img src="/club-welcome-page/assets/images/1764432101942-image.png" alt="image.png" /></p>

<ul>
  <li>
    <p>この図は、1st stage で作成した ROI を入力とした nnU-Net + Cross Attention による分類機構を示しています。</p>
  </li>
  <li>
    <p>nnU-Net ResEnc からの出力は <code class="language-plaintext highlighter-rouge">[B, 320, 7, 7, 7]</code> で、これを <code class="language-plaintext highlighter-rouge">[7*7*7, B, 320]</code> に reshape し、Cross Attention Pooling に入力します。ここで、動脈瘤の有無、13 クラス分類、モダリティ分類で query を分け、それぞれ別の Head を付けています。</p>
  </li>
  <li>
    <p>また、血管セグメンテーション（図の左側）と動脈瘤セグメンテーション（右側）を同時に学習しており、これにより学習が安定したと報告されています。</p>
  </li>
</ul>

<h2 id="セグメンテーションについて">セグメンテーションについて</h2>

<ul>
  <li>
    <p>元の RSNA データには血管セグメンテーションが一部（約 200 例）しかありませんが、両 stage でセグメンテーションを利用している点が気になったので、論文を少し深掘りしてみました。</p>
  </li>
  <li>
    <p>結論としては、<strong>TopCoW / TopBrain という外部データセットから事前学習したセグメンテーションモデルを使い、疑似ラベルを作りながら学習を回している</strong> という形です。</p>
  </li>
</ul>

<h3 id="1st-stage-のセグメンテーション">1st stage のセグメンテーション</h3>

<ul>
  <li>外部データセットには CTA/MRA の血管セグメンテーションが付いているので、これをそのまま 2D セグメンテーションタスクとして学習し、そのモデルを使って ROI を作っています。</li>
</ul>

<h3 id="2nd-stage-のセグメンテーション">2nd stage のセグメンテーション</h3>

<ul>
  <li>
    <p>血管セグメンテーションについては、TopCoW / TopBrain データセットに、ウィリス動脈輪などの <strong>フル 3D 血管セグメ + 解剖学的クラスラベル</strong> が付いているので、まずこれで CoW セグメントモデルを作成します。それを RSNA データに適用して疑似血管マスクを生成し、手動での微修正も加えて pseudo mask を作成しています。</p>
  </li>
  <li>
    <p>動脈瘤セグメンテーションは、RSNA の <code class="language-plaintext highlighter-rouge">train_localizer.csv</code> にある動脈瘤中心座標を用いて、半径 2〜5 mm のランダムな立方体を作成し、それをボクセルマスクに変換します。この粗いボックスマスクを教師として U-Net を学習し、その出力をさらに洗練させていきます。具体的には：</p>
    <ol>
      <li>モデル出力を閾値でバイナリ化</li>
      <li>3D connected component で塊に分割</li>
      <li>中心点から最も近い塊だけを残す</li>
      <li>血管セグメンテーションを用いて、血管からあまりに離れている領域を削除</li>
      <li>それを新しい教師マスクとして再学習</li>
    </ol>

    <p>…というように、pseudo label を iterative に洗練しているようです。</p>
  </li>
</ul>

<h3 id="その他の工夫-1">その他の工夫</h3>

<ul>
  <li>TTA では、画像・ラベルを左右反転したものも追加していました。</li>
  <li>前処理部分をかなり作り込んでおり、「読めない DICOM があってフォールバックする」のではなく、<strong>すべての画像を確実に読み込めるように</strong> 実装していたそうです。</li>
</ul>

<h1 id="3-位解法">3 位解法</h1>

<h2 id="1st-stage-1">1st stage</h2>

<p><img src="/club-welcome-page/assets/images/1764480696186-image.png" alt="image.png" /></p>

<ul>
  <li>
    <p>図の上半分が 1st stage です。</p>
  </li>
  <li>
    <p>まず、3D volume の血管セグメンテーションマスクから、Sagittal / Coronal 方向の 2D MIP（最大値投影）画像を生成します。このセグメンテーションマスクをどう作成しているかは論文中で明確ではなく、正直よく分かりませんでした……。おそらく、与えられている一部の血管セグメンテーション（約 200 例）を教師にしているか、外部データで事前学習している可能性があります。</p>
  </li>
  <li>
    <p>作成した 2D MIP 画像に対して YOLOv8 で BBox 検出を行い、その BBox を基に 3D の ROI を作成します。</p>
  </li>
</ul>

<h2 id="2nd-stage-1">2nd stage</h2>

<ul>
  <li>
    <p>図の下半分が 2nd stage です。</p>
  </li>
  <li>
    <p>1st stage で得られた 3D ROI を 3D ResNet-18 に入力します。3D モデルなので出力も 3D 特徴マップですが、デフォルトでは空間解像度が <code class="language-plaintext highlighter-rouge">4 × 4 × 4</code> になります。ここを <code class="language-plaintext highlighter-rouge">25 × 25 × 25</code> のように高解像度に変更することで、性能が向上したと報告されていました。</p>
  </li>
  <li>
    <p>最後に、この 3D 特徴マップを全結合層にかけ、14 クラス分類を行います。特徴マップ内のセルごとに予測を出しており、背景セルが多数を占めるため、推論時には Top-N のセルだけを集約して平均を取る（Top-N mean）という工夫を入れています。</p>
  </li>
</ul>

<h2 id="その他の工夫-2">その他の工夫</h2>

<ul>
  <li>テストデータの DICOM には spacing に関するタグがなく、1 ピクセルあたりの mm 単位やスライス間隔が分かりませんでした。そこで、各症例の画像を z 軸方向に積み重ねた volume を入力として、EfficientNetV2-S で <code class="language-plaintext highlighter-rouge">x_spacing, y_spacing, z_spacing</code> を回帰し、推定 spacing を使って前処理を行っていました。</li>
</ul>

<h1 id="4-位解法">4 位解法</h1>

<p><img src="/club-welcome-page/assets/images/1764485668708-image.png" alt="image.png" /></p>

<p>図にある <strong>青（Preprocessing）→ オレンジ（Segmentation Crop）→ 黄緑（Binary Classification try7）→ 紫（Pseudo‑Distillation）→ 水色（Training try8）→ ピンク（Inference Ensemble）</strong> の流れに沿って説明します。</p>

<h2 id="preprocessing青">Preprocessing（青）</h2>

<ul>
  <li>
    <p><code class="language-plaintext highlighter-rouge">train.csv</code> を読み込み、各シリーズごとにサイズが揃っているスライスのみを採用します。例えば CT の試し撮りのようなスライスは画像サイズが異なることが多いため、それらを除外するイメージです。</p>
  </li>
  <li>
    <p>各スライスを <code class="language-plaintext highlighter-rouge">.npy</code> として保存し、同時にスライス単位のメタ情報テーブル <code class="language-plaintext highlighter-rouge">train_sampled.csv</code> も作成します。</p>
  </li>
  <li>
    <p>modality をラベルにして stratified K-fold を行い、その fold 情報を <code class="language-plaintext highlighter-rouge">train_fold.csv</code> として保存します。</p>
  </li>
</ul>

<h2 id="segmentation-cropオレンジ">Segmentation crop（オレンジ）</h2>

<ul>
  <li>
    <p>各患者の DICOM から 3D volume を構築し、軸方向に等間隔で 48 枚をサンプリングして <code class="language-plaintext highlighter-rouge">.npy</code>（volume）に保存します。</p>
  </li>
  <li>
    <p>さらに、元の動脈瘤セグメンテーションマスクから画像内での bbox（<code class="language-plaintext highlighter-rouge">x1, x2, y1, y2</code>）を計算し（座標は 0〜1 に正規化）、それらを 1 行にまとめた <code class="language-plaintext highlighter-rouge">segmentations_window1.csv</code> を作成します。</p>
  </li>
  <li>ここで ViT-Small-Plus DINOv3 を使った bbox 回帰モデルを学習します。
    <ul>
      <li>入力: <code class="language-plaintext highlighter-rouge">segmentations_window1.csv</code> の <code class="language-plaintext highlighter-rouge">window_file</code> から読み込んだ volume を、48 枚スライス → 3ch × 16 枚画像に reshape し、最終的に <code class="language-plaintext highlighter-rouge">[batch, 16, 3, 128, 128]</code> 形式に変換。</li>
      <li>出力: 正規化済み bbox 座標（<code class="language-plaintext highlighter-rouge">x1, x2, y1, y2</code>）。</li>
      <li>損失: L1（MAE）。4-fold で学習。</li>
    </ul>
  </li>
  <li>学習した Crop モデルを使って、全 train/test の volume に対して bbox を推論し、患者ごとの ROI を取得します。</li>
</ul>

<h2 id="binary-classification-try7黄緑">Binary classification try7（黄緑）</h2>

<ul>
  <li>
    <p>各スライス画像を患者ごとの crop bbox で切り抜き、<code class="language-plaintext highlighter-rouge">aneurysm_present + 13 部位 = 14 クラス</code> をターゲットに CoaT / ViT 系モデルで学習します。</p>
  </li>
  <li>モデルバージョンを簡単に整理すると：
    <ul>
      <li><strong>Train v6</strong>: ベースラインモデル。OOF 予測から怪しいスライスを集めて <code class="language-plaintext highlighter-rouge">Filter v6</code>（filt1.csv）を作成。</li>
      <li><strong>Train v8 &amp; v9</strong>: v6 で絞ったデータ＋全体データを使い、より強いモデルを学習。OOF を使って <code class="language-plaintext highlighter-rouge">Filter v8</code> を作成。</li>
      <li><strong>Train v10 &amp; v13</strong>: v8 Filter などを利用し、さらにチューニングしたモデル。</li>
    </ul>
  </li>
  <li>
    <p>これらのうち、特に v8 / v9 / v10 / v13 が try7 のベストモデル群とされます。</p>
  </li>
  <li>各モデルで OOF（Out-of-Fold）予測の OUTPUTS / TARGETS / IDS を全て保存しておき、後の pseudo-distillation に用います。</li>
</ul>

<h2 id="pseudodistillation紫">Pseudo‑Distillation（紫）</h2>

<ul>
  <li>
    <p>ベストモデル群の OOF 確率を読み込み、モデル間で平均して教師確率ベクトル（teacher_prob）を作成し、pseudo label として保存します。</p>
  </li>
  <li>この teacher_prob を元ラベルと並べて新しい教師信号とし、知識蒸留（distillation）を行います。対象モデルは：
    <ul>
      <li>MaxViT-tiny v1</li>
      <li>MaxViT-small v1</li>
      <li>CoaT-Lite-Medium v3</li>
    </ul>
  </li>
  <li>これらのモデルに対し、Segmentation Crop で切り抜いた ROI 画像を入力し、
    <ul>
      <li>0/1 の hard ラベル（train_sampled / train.csv）</li>
      <li>pseudo teacher の確率分布（teacher_prob）</li>
    </ul>

    <p>の両方を予測させます。損失は例えば以下のような形です：</p>
  </li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">loss</span> <span class="o">=</span> <span class="n">BCE_with_logits</span><span class="p">(</span><span class="n">logits</span><span class="p">,</span> <span class="n">hard_targets</span><span class="p">)</span> \
     <span class="o">+</span> <span class="n">λ</span> <span class="o">*</span> <span class="n">KL</span><span class="p">(</span><span class="n">sigmoid</span><span class="p">(</span><span class="n">logits</span><span class="p">)</span> <span class="o">||</span> <span class="n">teacher_prob</span><span class="p">)</span>
</code></pre></div></div>

<ul>
  <li>こうして try7 のアンサンブルが持っていた知識を、より強力な構造（MaxViT / CoaT v3）を持つ 1 モデルに蒸留することで、try8 の強力な最終モデル群が完成します。</li>
</ul>

<h2 id="inference-ensembleピンク">Inference Ensemble（ピンク）</h2>

<ul>
  <li>
    <p>テストデータに対しては、まず ViT-Small-Plus DINOv3 Crop Model を走らせて bbox（ROI）を推定し、その bbox でスライスを crop してモデル入力を作成します。</p>
  </li>
  <li>次に、以下の 4 系統のモデルから出力を取得します：
    <ul>
      <li>try7 CoaT-Lite-Medium v13（fold 2, 3）</li>
      <li>try8 CoaT-Lite-Medium v3（fold 0, 1）</li>
      <li>try8 MaxViT-small v1（fold 2, 3）</li>
      <li>try8 MaxViT-tiny v1（fold 0, 1）</li>
    </ul>

    <p>（図には fold 割り当てが明記されており、合わせて 0〜3 の 4 fold をカバーしています。）</p>
  </li>
  <li>各モデルの 14 クラス確率をアンサンブルして、最終的な提出用の予測を作成します。</li>
</ul>

<h1 id="5-位解法">5 位解法</h1>

<p><img src="/club-welcome-page/assets/images/1764513913085-image.png" alt="image.png" /></p>

<h2 id="rsna-データから基礎モデルの作成">RSNA データから基礎モデルの作成</h2>

<h3 id="rsna-localizer--rsna-series-label緑">RSNA Localizer / RSNA Series Label（緑）</h3>

<ul>
  <li>RSNA 公式で提供されているラベル（シリーズレベルラベルおよび動脈瘤中心座標）です。</li>
</ul>

<h3 id="動脈瘤検出exp0">動脈瘤検出（exp0）</h3>

<ul>
  <li>
    <p>Localizer の重心座標の前後 ±10 スライス程度を表示し、LabelImg で動脈瘤を囲む bbox を人手でアノテーションします。</p>
  </li>
  <li>
    <p>得られた bbox を教師データとして、YOLOv11（物体検出モデル）を学習します。</p>
  </li>
</ul>

<h3 id="マルチクラス分類--マルチタスクモデルexp2--exp3">マルチクラス分類 + マルチタスクモデル（exp2 / exp3）</h3>

<ul>
  <li>
    <p><strong>exp2-cls</strong>: ViT Large / EVA Large による 14 クラス分類モデル。陰性シリーズは「全スライス」を使用し、陽性シリーズは exp0 で作成した bbox を含むスライスのみを使用して学習します。</p>
  </li>
  <li>
    <p><strong>exp3-aux</strong>: MIT-B4 + FPN で構成される「分類 + セグメンテーション」のマルチタスクモデルです。分類ラベルは 14 クラス、セグメンテーションラベルは exp0 の bbox を塗りつぶして作成したマスクです。</p>
  </li>
</ul>

<h3 id="脳検出モデルexp1">脳検出モデル（exp1）</h3>

<ul>
  <li>
    <p>各シリーズの全スライスを平均して 1 枚の画像を生成し、その画像に対して脳領域の bbox を人手でアノテーションします。</p>
  </li>
  <li>
    <p>その bbox を教師として YOLOv5n で脳検出モデルを学習します。</p>
  </li>
</ul>

<h2 id="外部データセットの活用">外部データセットの活用</h2>

<ul>
  <li>
    <p>Lausanne_TOFMRA, Royal_Brisbane_TOFMRA の 2 つの外部 TOF-MRA データセットを使用します。最初はラベルがなく、どこに動脈瘤があるかは分かりません。</p>
  </li>
  <li>
    <p>RSNA で学習済みの</p>
    <ul>
      <li>exp2-cls（シリーズレベル 14 クラス分類）</li>
      <li>exp3-aux（分類 + セグメンテーション）</li>
      <li>exp0-Aneurysm det（YOLO 検出）</li>
    </ul>

    <p>を使い、外部データセットに pseudo labeling を施します。前 2 つでシリーズレベルの aneurysm 有無を推定し、exp0 で bbox を予測し位置を推定します。</p>
  </li>
</ul>

<h2 id="rsna-ラベルのクリーニング">RSNA ラベルのクリーニング</h2>

<ul>
  <li>
    <p>pseudo label の発想を RSNA の元トレーニングデータにも適用し、ラベルの誤りを修正します。</p>
  </li>
  <li>
    <p>具体的には、RSNA の Negative シリーズのうち、exp2-cls と exp3-aux の両方で <code class="language-plaintext highlighter-rouge">aneurysm positive &gt; 0.9</code> となるシリーズを探します。これらはラベルミスである可能性が高いとみなし、Negative → Positive に変更し、exp0 の YOLO で bbox を取得してラベルを付与します。</p>
  </li>
</ul>

<h2 id="クリーニングした-rsna--外部-pseudo-データで再学習">クリーニングした RSNA + 外部 pseudo データで再学習</h2>

<ul>
  <li>クリーニング済み RSNA データセットと、外部 pseudo labeled データセットを合わせて、exp4-cls / exp5-aux を新たに学習します。どちらも exp2-cls / exp3-aux の強化版に相当します。</li>
</ul>

<h2 id="テストセットでの推論と提出">テストセットでの推論と提出</h2>

<ul>
  <li>Kaggle テストデータに対し、exp4-cls / exp5-aux / exp0 / exp1 など、計 4 つ前後のモデルで予測を出し、それらをアンサンブルして最終的な提出用予測とします。</li>
</ul>

<hr />

<h1 id="6-位解法">6 位解法</h1>

<p><img src="/club-welcome-page/assets/images/1764557060541-image.png" alt="image.png" /></p>

<p>6 位解法はコードが共有されておらず、詳細を深追いしきれなかったので、論文から読み取れた範囲でまとめます。</p>

<h2 id="skull-segmentation">Skull Segmentation</h2>

<ul>
  <li>volume を 3D-ResNet18 U-Net に入力し、頭蓋骨マスクを推定します。これにより、「頭蓋骨以外の部分」が中心になるように ROI を自動的に切り出せます。</li>
</ul>

<h2 id="vessel-segmentation">Vessel Segmentation</h2>

<ul>
  <li>
    <p>ROI 化した volume を axial 方向に揃えてリサイズし、左右方向の位置エンコーディングを付加したうえで、3D-ResNet18 U-Net に入力し、血管マスクを得ます。</p>
  </li>
  <li>
    <p>得られた血管マスクは、訓練中に「良い Negative（血管はあるが動脈瘤はない場所）」をサンプリングするためにも使用されます。</p>
  </li>
</ul>

<h2 id="aneurysm-2d-classification">Aneurysm 2D Classification</h2>

<ul>
  <li>
    <p>1 症例の中で動脈瘤が写っているスライスはごく一部で、さらに「画面の端」や「ほとんど何も写っていない」スライスも多く含まれます。そのまま全スライスを使うとクラス不均衡がひどくなるため、<strong>陽性フレームを漏らさず拾いつつ、陰性フレームも適度に難しいものだけを選ぶ</strong> ことが重要になります。</p>
  </li>
  <li>
    <p>ここでは、複数スライスをまとめたものを 1 つの「フレーム」と呼んでいます（この用語が論文の完全な定義と一致しているかは自信がありません）。</p>
  </li>
  <li>陽性フレーム：
    <ul>
      <li>与えられた動脈瘤位置情報から手動で修正した動脈瘤マスクを使い、そのマスクを含むスライスと、その前後数スライスを <code class="language-plaintext highlighter-rouge">near-positive</code> として取得します。</li>
    </ul>
  </li>
  <li>陰性フレーム：
    <ul>
      <li>血管マスクを含むスライスのうち、ある閾値以上の血管画素を含んでいるものだけを選びます。これにより、「血管はしっかり写っているが動脈瘤はない」ような難しめの陰性サンプルを集められます。</li>
    </ul>
  </li>
  <li>
    <p>こうして作成した陽性・陰性フレームをさらに小さなパッチに固定比率で切り出し、リサイズし、隣接 2 フレームを 3 チャンネル画像にまとめるような前処理を行っています。</p>
  </li>
  <li>各 2D フレームを CoAtNet や MaxViT に入力します。これらのネットワークには、相対位置エンコーディング用の MLP が付加されています。ネットワークの最後で特徴マップを 2 つのヘッドに分岐し、それぞれ「動脈瘤の有無」と「部位クラス」を推定しています。</li>
</ul>

<h2 id="sequence-model">Sequence Model</h2>

<ul>
  <li>
    <p>各 3D volume は多数の 2D フレームに分割されているので、フレーム単位の予測を患者単位にまとめるためのシーケンスモデルを用います。</p>
  </li>
  <li>
    <p>まず、各フレームの出力を時系列順に並べ、これを MLP + RNN に入力します。</p>
  </li>
  <li>
    <p>RNN の最終出力と、「単純にフレームごとの出力を平均したもの」を組み合わせ、それを分類ヘッドに入力して最終的な予測を得ます。</p>
  </li>
</ul>

<h1 id="7-位解法">7 位解法</h1>

<p><img src="/club-welcome-page/assets/images/1764576106361-image.png" alt="image.png" /></p>

<p>7 位解法はパイプライン全体を示す図がなく、ポイントだけ簡単にまとめます。</p>

<h2 id="モデルについて">モデルについて</h2>

<ul>
  <li>
    <p>特徴的なのは、<strong>3D nnU-Net を使ってヒートマップ回帰を行っている</strong> 点です。</p>
  </li>
  <li>
    <p>nnU-Net はもともとセマンティックセグメンテーション用で、整数ラベル（クラス ID）を前提とします。</p>
  </li>
  <li>
    <p>そこでクラスごとに 0/1 マスクを作成し、それに対してユークリッド距離変換をかけて「距離マップ」を生成し、あらかじめ決めた半径の範囲を blob 化することで「連続値のピーク（ヒートマップ）」のようなラベルを作っています。</p>
  </li>
</ul>

<h2 id="roi-について">ROI について</h2>

<ul>
  <li>他の解法と比べると、ROI 抽出はかなりシンプルです。具体的には：
    <ul>
      <li>画像の物理座標の中心を求め、</li>
      <li>その位置から上方向（頭頂側）に一定量だけずらした位置を中心として、</li>
      <li><code class="language-plaintext highlighter-rouge">[200, 160, 160] mm</code> の立方体を単純にくり抜く、</li>
    </ul>

    <p>というロジックになっています。</p>
  </li>
</ul>

<h1 id="まとめ">まとめ</h1>

<ul>
  <li>ほぼ全ての上位解法で、ROI 抽出 → 本タスク（分類 or セグメント + 集約）という <strong>マルチステージ構成</strong> が採用されていました。</li>
  <li>1st stage では、nnU-Net や U-Net 系、YOLO、2D/3D ResNet などを駆使して「頭蓋骨や血管・脳」をきれいに切り出し、そこから動脈瘤がありそうな領域をさらに絞り込んでいます。</li>
  <li>2nd stage では、3D nnU-Net backbone + attention、3D ResNet、高性能 2D ViT/MaxViT 系などを利用し、さらに pseudo label・distillation・外部データを組み合わせてモデルを強化していました。</li>
</ul>

<h1 id="参考資料リンク">参考資料・リンク</h1>
<ul>
  <li><a href="https://www.kaggle.com/competitions/rsna-intracranial-aneurysm-detection/writeups/1st-place-solution">1 位解法</a></li>
  <li><a href="https://www.kaggle.com/competitions/rsna-intracranial-aneurysm-detection/writeups/2nd-place-solution">2 位解法</a></li>
  <li><a href="https://www.kaggle.com/competitions/rsna-intracranial-aneurysm-detection/writeups/3rd-place-solution">3 位解法</a></li>
  <li><a href="https://www.kaggle.com/competitions/rsna-intracranial-aneurysm-detection/writeups/4th-place-solution">4 位解法</a></li>
  <li><a href="https://www.kaggle.com/competitions/rsna-intracranial-aneurysm-detection/writeups/5th-place-solution">5 位解法</a></li>
  <li><a href="https://www.kaggle.com/competitions/rsna-intracranial-aneurysm-detection/writeups/6th-place-solution">6 位解法</a></li>
  <li><a href="https://www.kaggle.com/competitions/rsna-intracranial-aneurysm-detection/writeups/7th-place-solution">7 位解法</a></li>
</ul>

<p>※ 記事中の各解法の詳細は、必ず元の Kaggle Discussion / 論文を参照してください（本記事は図を中心にした私的な要約です）。もし明らかな誤りや「ここはこう解釈したほうが近いかも」といった点があれば、教えていただけると嬉しいです。</p>]]></content><author><name>K. Hikaru</name></author><category term="Kaggle" /><summary type="html"><![CDATA[はじめに]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Markdown Features Test</title><link href="https://qumiclub.github.io/club-welcome-page/2025/12/01/markdown-test.html" rel="alternate" type="text/html" title="Markdown Features Test" /><published>2025-12-01T00:00:00+00:00</published><updated>2025-12-01T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2025/12/01/markdown-test</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2025/12/01/markdown-test.html"><![CDATA[<h1 id="heading-1">Heading 1</h1>
<h2 id="heading-2">Heading 2</h2>
<h3 id="heading-3">Heading 3</h3>
<h4 id="heading-4">Heading 4</h4>
<h5 id="heading-5">Heading 5</h5>
<h6 id="heading-6">Heading 6</h6>

<h2 id="text-formatting">Text Formatting</h2>
<p><strong>Bold Text</strong>
<em>Italic Text</em>
<strong><em>Bold and Italic</em></strong>
<del>Strikethrough</del>
<code class="language-plaintext highlighter-rouge">Inline Code</code></p>

<h2 id="lists">Lists</h2>
<h3 id="unordered-list">Unordered List</h3>
<ul>
  <li>Item 1</li>
  <li>Item 2
    <ul>
      <li>Nested Item 2.1</li>
      <li>Nested Item 2.2
        <ul>
          <li>Nested Item 2.2.1</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h3 id="ordered-list">Ordered List</h3>
<ol>
  <li>First Item</li>
  <li>Second Item
    <ol>
      <li>Nested Item 2.1</li>
      <li>Nested Item 2.2</li>
    </ol>
  </li>
</ol>

<h2 id="blockquotes">Blockquotes</h2>
<blockquote>
  <p>This is a blockquote.
It can span multiple lines.</p>

  <blockquote>
    <p>It can be nested.</p>
  </blockquote>
</blockquote>

<h2 id="code-blocks">Code Blocks</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">hello_world</span><span class="p">():</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"Hello, World!"</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Hello, World!</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="math">Math</h2>
<p>Inline math: $E = mc^2$</p>

<p>Block math:
\(\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}\)</p>

<h2 id="tables">Tables</h2>
<p>| Header 1 | Header 2 | Header 3 |
| :— | :—: | —: |
| Left | Center | Right |
| Item 1 | Item 2 | Item 3 |</p>

<h2 id="links-and-images">Links and Images</h2>
<p><a href="https://google.com">Google</a></p>

<p><img src="https://via.placeholder.com/150" alt="Placeholder Image" /></p>

<h2 id="horizontal-rule">Horizontal Rule</h2>
<hr />
<p>End of test.</p>]]></content><author><name>K. Hikaru</name></author><category term="test" /><category term="markdown" /><summary type="html"><![CDATA[Heading 1 Heading 2 Heading 3 Heading 4 Heading 5 Heading 6]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">RustでPythonと連携する</title><link href="https://qumiclub.github.io/club-welcome-page/2025/11/28/Rust%E3%81%A7Python%E3%81%A8%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B.html" rel="alternate" type="text/html" title="RustでPythonと連携する" /><published>2025-11-28T00:00:00+00:00</published><updated>2025-11-28T00:00:00+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2025/11/28/Rust%E3%81%A7Python%E3%81%A8%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2025/11/28/Rust%E3%81%A7Python%E3%81%A8%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B.html"><![CDATA[<h2 id="はじめに">はじめに</h2>

<p>近年、Rustは<strong>高速で安全なシステムプログラミング言語</strong>として注目を集めています。一方、AIやデータ処理の分野ではPythonが圧倒的な存在感を持ちます。
この記事では、Rustの利点や開発環境、さらにPythonと連携する方法を初心者向けに解説します。</p>

<hr />

<h2 id="1-rustとは">1. Rustとは？</h2>

<p>Rustは以下の特徴を持つ言語です：</p>

<ul>
  <li>
    <p><strong>安全性</strong></p>

    <ul>
      <li>メモリ管理をコンパイラがチェックするため、Segmentation Faultやデータ競合を防止</li>
    </ul>
  </li>
  <li>
    <p><strong>高速性</strong></p>

    <ul>
      <li>C/C++と同等の性能で、ゼロコスト抽象化を実現</li>
      <li>Ruffもuvもrust製</li>
    </ul>
  </li>
  <li>
    <p><strong>並列処理が得意</strong></p>

    <ul>
      <li>安全な並列処理を簡単に書ける</li>
    </ul>
  </li>
  <li>
    <p><strong>バイナリ単体で配布可能</strong></p>

    <ul>
      <li>Pythonのように仮想環境や依存関係を気にせず配布できる</li>
      <li>簡単なアプリを作成して配布する場合は有用</li>
    </ul>
  </li>
</ul>

<p>Rustはシステム開発だけでなく、CLIツールやWebバックエンド、さらにはAI推論の高速化にも向いています。</p>

<hr />

<h2 id="2-rustの開発環境">2. Rustの開発環境</h2>

<h3 id="21-wsl--docker-の選択">2.1 WSL / Docker の選択</h3>

<ul>
  <li>
    <p><strong>WSL</strong></p>

    <ul>
      <li>Windows環境でRustをネイティブに動かす</li>
      <li>VSCodeと相性が良く、開発効率が高い</li>
    </ul>
  </li>
</ul>

<blockquote>
  <p>多くのケースでは WSL 上で Rust 開発 → リリース時にバイナリ化 という流れが最も現実的</p>
</blockquote>

<h3 id="22-vscodeとの統合">2.2 VSCodeとの統合</h3>

<ul>
  <li>
    <p><strong>拡張機能</strong></p>

    <ul>
      <li>Rust (rust-analyzer)</li>
      <li>CodeLLDB（デバッグ用）</li>
    </ul>
  </li>
  <li>
    <p><strong>自動フォーマット / lint</strong></p>

    <ul>
      <li>保存時に <code class="language-plaintext highlighter-rouge">rustfmt</code> で整形</li>
      <li><code class="language-plaintext highlighter-rouge">clippy</code> で警告・改善点を表示</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="3-pythonとの連携の必要性">3. Pythonとの連携の必要性</h2>

<p>Rustは高速で安全ですが、AIやデータ処理のライブラリはPythonの方が豊富です。</p>

<ul>
  <li><strong>AIモデルの推論や学習</strong> → PyTorch / TensorFlow / HuggingFace</li>
  <li><strong>データ処理・解析</strong> → pandas / numpy / scikit-learn</li>
</ul>

<p>Rustで処理できる部分はRust、AI部分だけPythonを呼び出す設計が現実的です。</p>

<hr />

<h2 id="4-rustとpythonを連携する方法">4. RustとPythonを連携する方法</h2>

<ol>
  <li>
    <p><strong>Python側でAPIを用意</strong></p>

    <ul>
      <li>FastAPIやFlaskなどでREST APIを作成</li>
    </ul>
  </li>
  <li>
    <p><strong>RustからHTTPリクエストで呼び出す</strong></p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">reqwest</code> や <code class="language-plaintext highlighter-rouge">ureq</code> などのHTTPクライアントを使用</li>
    </ul>
  </li>
  <li>
    <p><strong>JSONで入出力を統一</strong></p>

    <ul>
      <li>RustとPythonの間でデータ形式を固定することで互換性を維持</li>
    </ul>
  </li>
</ol>

<blockquote>
  <p>Rust単体でもAPIで動く構造にしておくと、将来的にある処理でAIを使おうと思ったときにPythonを入れることが可能です。</p>
</blockquote>

<blockquote>
  <p>Rust単体でも推論ならOnnx runtime等でAIの活用が可能</p>
</blockquote>

<h4 id="例rust側">例：Rust側</h4>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">reqwest</span><span class="p">::</span><span class="nn">blocking</span><span class="p">::</span><span class="n">Client</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">serde</span><span class="p">::{</span><span class="n">Deserialize</span><span class="p">,</span> <span class="n">Serialize</span><span class="p">};</span>

<span class="nd">#[derive(Serialize)]</span>
<span class="k">struct</span> <span class="n">RequestData</span> <span class="p">{</span>
    <span class="n">input</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Deserialize)]</span>
<span class="k">struct</span> <span class="n">ResponseData</span> <span class="p">{</span>
    <span class="n">result</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">call_python_api</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="p">(),</span> <span class="nb">Box</span><span class="o">&lt;</span><span class="k">dyn</span> <span class="nn">std</span><span class="p">::</span><span class="nn">error</span><span class="p">::</span><span class="n">Error</span><span class="o">&gt;&gt;</span> <span class="p">{</span>
    <span class="k">let</span> <span class="n">client</span> <span class="o">=</span> <span class="nn">Client</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
    <span class="k">let</span> <span class="n">req</span> <span class="o">=</span> <span class="n">RequestData</span> <span class="p">{</span> <span class="n">input</span><span class="p">:</span> <span class="s">"Hello"</span><span class="nf">.into</span><span class="p">()</span> <span class="p">};</span>
    <span class="k">let</span> <span class="n">resp</span><span class="p">:</span> <span class="n">ResponseData</span> <span class="o">=</span> <span class="n">client</span><span class="nf">.post</span><span class="p">(</span><span class="s">"http://127.0.0.1:8000/run"</span><span class="p">)</span>
        <span class="nf">.json</span><span class="p">(</span><span class="o">&amp;</span><span class="n">req</span><span class="p">)</span>
        <span class="nf">.send</span><span class="p">()</span><span class="o">?</span>
        <span class="nf">.json</span><span class="p">()</span><span class="o">?</span><span class="p">;</span>
    <span class="nd">println!</span><span class="p">(</span><span class="s">"Pythonからの結果: {}"</span><span class="p">,</span> <span class="n">resp</span><span class="py">.result</span><span class="p">);</span>
    <span class="nf">Ok</span><span class="p">(())</span>
<span class="p">}</span>
</code></pre></div></div>
<hr />

<h2 id="5-rustを主体にする設計の利点">5. Rustを主体にする設計の利点</h2>

<ul>
  <li><strong>高速で安全な処理を担保</strong></li>
  <li><strong>UIや設定処理をRustで統一</strong></li>
  <li><strong>PythonはAI部分だけ</strong></li>
  <li><strong>将来的にPythonをRustに置き換えやすい</strong></li>
  <li><strong>設定ファイルはYAMLで、APIはJSONで統一すると互換性を維持しやすい</strong></li>
</ul>

<hr />

<h2 id="6-まとめ">6. まとめ</h2>

<ul>
  <li>Rustは<strong>高速・安全・配布が容易</strong>な言語</li>
  <li>Pythonは<strong>AI・データ処理に強いエコシステム</strong>を持つ</li>
  <li>RustとPythonを連携することで、両言語の強みを最大限活かせる</li>
  <li>API形式で連携する設計を取ると、<strong>互換性と将来性を確保</strong>できる</li>
</ul>]]></content><author><name>N.Haruto</name></author><category term="Rust" /><category term="Python" /><summary type="html"><![CDATA[はじめに]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AIコンペ用環境構築 WSL</title><link href="https://qumiclub.github.io/club-welcome-page/2025/11/27/AI-E3-82-B3-E3-83-B3-E3-83-9A-E7-94-A8-E7-92-B0-E5-A2-83-E6-A7-8B-E7-AF-89-WSL.html" rel="alternate" type="text/html" title="AIコンペ用環境構築 WSL" /><published>2025-11-27T08:21:31+00:00</published><updated>2025-11-27T08:21:31+00:00</updated><id>https://qumiclub.github.io/club-welcome-page/2025/11/27/AI%E3%82%B3%E3%83%B3%E3%83%9A%E7%94%A8%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89-WSL</id><content type="html" xml:base="https://qumiclub.github.io/club-welcome-page/2025/11/27/AI-E3-82-B3-E3-83-B3-E3-83-9A-E7-94-A8-E7-92-B0-E5-A2-83-E6-A7-8B-E7-AF-89-WSL.html"><![CDATA[<p>Windows 上で AI コンペ向けの開発環境を構築する手順をまとめました。Python / PyTorch / VSCode を中心に、WSL2 での作業を前提としています。</p>

<hr />

<h2 id="1-wsl2-セットアップ">1. WSL2 セットアップ</h2>

<h3 id="11-wsl2-インストール">1.1 WSL2 インストール</h3>

<ol>
  <li>
    <p><strong>Windows機能の有効化</strong>
管理者権限で PowerShell を開き、以下を実行：</p>

    <div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">wsl</span><span class="w"> </span><span class="nt">--install</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="nx">Ubuntu-22.04</span><span class="w">
</span></code></pre></div>    </div>
  </li>
  <li>
    <p><strong>WSL2 バージョン確認</strong></p>

    <div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">wsl</span><span class="w"> </span><span class="nt">-l</span><span class="w"> </span><span class="nt">-v</span><span class="w">
</span></code></pre></div>    </div>
  </li>
</ol>

<hr />

<h3 id="12-必要ツールのインストール-例">1.2 必要ツールのインストール 例</h3>
<p>WSL初回起動時はUnixユーザー名とパスワード登録がある。
WSL 内で以下を実行：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install</span> <span class="nt">-y</span> curl git build-essential unzip wget
</code></pre></div></div>

<hr />

<h3 id="13-python-環境管理uv">1.3 Python 環境管理（uv）</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-LsSf</span> https://astral.sh/uv/install.sh | sh
</code></pre></div></div>
<hr />

<h2 id="2-vscode-セットアップ">2. VSCode セットアップ</h2>

<h3 id="21-vscode-インストール">2.1 VSCode インストール</h3>

<p>公式サイトから Windows 版をインストール：<a href="https://code.visualstudio.com/">VSCode ダウンロード</a></p>

<hr />

<h3 id="22-remote---wsl-拡張">2.2 Remote - WSL 拡張</h3>

<ul>
  <li>VSCode の拡張機能からRemote Development (の中に含まれるWSL)をインストール。</li>
  <li>CtrL + Shift + P でコマンドを出してから、</li>
  <li>wsl connect Using Distro
    <ul>
      <li>Ubuntuを選択</li>
    </ul>
  </li>
</ul>

<hr />

<h3 id="24-推奨拡張機能">2.4 推奨拡張機能</h3>

<ul>
  <li>Python</li>
  <li>Pylance</li>
  <li>Jupyter</li>
  <li>Git Graph</li>
  <li>Docker（必要に応じて）</li>
</ul>

<hr />

<h2 id="3-プロジェクト-initialize">3. プロジェクト Initialize</h2>
<p>uv init</p>
<h3 id="31-pytorch-インストール">3.1 PyTorch インストール</h3>

<p>GPU 対応の場合は CUDA バージョンに合わせて：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="c"># With a command-line argument.</span>
<span class="nv">$ </span>uv pip <span class="nb">install </span>torch <span class="nt">--torch-backend</span><span class="o">=</span>auto

</code></pre></div></div>

<p>確認：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">torch</span>
<span class="k">print</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="n">is_available</span><span class="p">())</span>
</code></pre></div></div>

<hr />

<h3 id="32-データセット配置と-io">3.2 データセット配置と I/O</h3>

<ol>
  <li>ディレクトリ作成：</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> ~/ai_competition/data
<span class="nb">cd</span> ~/ai_competition/data
</code></pre></div></div>

<ol>
  <li>WSL 内に直接ダウンロード：</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-O</span> https://example.com/dataset/train.csv
curl <span class="nt">-O</span> https://example.com/dataset/test.csv
</code></pre></div></div>

<ul>
  <li>大容量の場合は <code class="language-plaintext highlighter-rouge">wget</code> が便利：</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget https://example.com/dataset/large_dataset.zip
unzip large_dataset.zip
</code></pre></div></div>

<ol>
  <li>Python からの読み込み：</li>
</ol>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="n">pd</span>

<span class="n">train_df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">'~/ai_competition/data/train.csv'</span><span class="p">)</span>
<span class="n">test_df</span>  <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s">'~/ai_competition/data/test.csv'</span><span class="p">)</span>
</code></pre></div></div>
<p>Kaggle apiを使うと便利</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>kaggle <span class="nt">--upgrade</span>

kaggle competitions <span class="o">{</span>list, files, download, submit, submissions, leaderboard<span class="o">}</span>
kaggle datasets <span class="o">{</span>list, files, download, create, version, init<span class="o">}</span>

</code></pre></div></div>]]></content><author><name>Haruto Nishioka</name></author><category term="dev-env" /><category term="python" /><category term="AI" /><category term="Kaggle" /><summary type="html"><![CDATA[Windows 上で AI コンペ向けの開発環境を構築する手順をまとめました。Python / PyTorch / VSCode を中心に、WSL2 での作業を前提としています。]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" /><media:content medium="image" url="https://qumiclub.github.io/club-welcome-page/assets/images/ogp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>