DNA Language Modelに関連する文献解読しています。
DNA LLM and genome for survey 2200 papers by name.
https://qiita.com/kaizen_nagoya/items/ce8a28d6072f340a9d59
2000近い文献を斜め読みしながら、DNA Language Modelについて深堀しようとしています。
ChatGPT
DNA language modelについて説明してください。
ChatGPT:
DNA言語モデル(DNA Language Model, DLM)は、DNA配列を自然言語のように扱い、遺伝子の機能や構造を理解・予測するための人工知能(AI)モデルです。これらのモデルは、遺伝子発現、変異の影響、タンパク質設計など、バイオインフォマティクスの多くの分野で応用されています。
DNA言語モデルの基本概念
DNAは、4種類の塩基(アデニン[A]、チミン[T]、グアニン[G]、シトシン[C])からなる長大な配列で構成されています。これらの配列は、遺伝情報をコードする「言語」として捉えることができます。DNA言語モデルは、これらの配列を「単語」や「文」として扱い、自然言語処理(NLP)の技術を応用して学習・解析を行います。
主なDNA言語モデルの例
- DNABERT
DNABERTは、BERT(Bidirectional Encoder Representations from Transformers)アーキテクチャを基にしたDNA配列用の事前学習済みモデルです。このモデルは、DNA配列をk-mer(例えば、3-merや6-mer)に分割し、文脈を考慮した埋め込みを生成します。これにより、遺伝子の構造や機能の理解、変異の影響予測などが可能となります。
leapleaper.jp
OpenReview- Enformer
Enformerは、DeepMindによって開発されたモデルで、遺伝子発現の予測に特化しています。このモデルは、DNA配列の長距離相互作用を考慮し、遺伝子発現量を高精度で予測します。
leapleaper.jp- HybriDNA
HybriDNAは、TransformerアーキテクチャとMamba2モデルを組み合わせたハイブリッド型のDNA言語モデルです。最大131kbのDNA配列を単一ヌクレオチド解像度で処理でき、遺伝子調節領域の合成や理解において最先端の性能を示しています。
arXiv- JanusDNA
JanusDNAは、双方向の理解を可能にする新しい事前学習手法を採用したDNA基盤モデルです。1百万塩基対までの長距離相互作用を効率的にモデル化でき、遺伝子発現の調節メカニズムの理解に貢献しています。
arXiv
leapleaper.jp
応用分野
遺伝子発現予測:DNA配列から遺伝子の発現量を予測することで、疾患の理解や治療法の開発に役立ちます。
変異の影響解析:DNAの変異が遺伝子の機能や疾患に与える影響を予測することができます。
タンパク質設計:DNA配列から合成されるタンパク質の構造や機能を予測し、新しいタンパク質の設計に活用されます。
疾患予測:遺伝子の変異や発現パターンから、疾患のリスクや進行を予測することが可能です。
leapleaper.jp
今後の展望
DNA言語モデルは、ゲノム解析の新たなアプローチとして注目されています。今後、より大規模なデータセットや多様な生物種への適用が進むことで、疾患の早期発見や個別化医療の実現に向けた重要な手段となることが期待されています。
DNA Langugage Modelを利用するプログラミング演習は作れますか?
ChatGPT:
はい、作れます。DNA Language Model(例えば DNABERT や Enformer)の利用演習は、Python を使った バイオインフォマティクス向けのプログラミング演習として構成可能です。以下に例を示します。
DNA Language Model 演習例
目的
DNA配列を入力として、モデルで塩基の埋め込み表現や遺伝子領域の予測を行う。
自然言語処理の Transformer モデルを DNA 配列に応用する体験。
- 環境準備
仮想環境作成(推奨)
python -m venv dna_env
source dna_env/bin/activate # macOS/Linux
dna_env\Scripts\activate # Windows必要ライブラリのインストール
pip install torch transformers biopython
2. DNA配列の読み込み
from Bio import SeqIOFASTA形式のDNA配列を読み込む
for record in SeqIO.parse("example.fasta", "fasta"):
dna_sequence = str(record.seq)
print("配列長:", len(dna_sequence))
print("最初の50塩基:", dna_sequence[:50])
3. DNABERTモデルを使った解析
from transformers import BertTokenizer, BertModel
import torchDNABERT用のk-mer tokenizer(6-mer 例)
tokenizer = BertTokenizer.from_pretrained("zhihan1996/DNABERT-6")
model = BertModel.from_pretrained("zhihan1996/DNABERT-6")入力配列のk-mer分割
def seq_to_kmers(seq, k=6):
return [seq[i:i+k] for i in range(len(seq)-k+1)]
kmers = seq_to_kmers(dna_sequence)
inputs = tokenizer(" ".join(kmers), return_tensors="pt")埋め込みベクトル取得
with torch.no_grad():
outputs = model(**inputs)
embeddings = outputs.last_hidden_state # [塩基数, 埋め込み次元]
print("埋め込みベクトルサイズ:", embeddings.shape)
4. 演習課題例
DNA配列を入力として、特定の遺伝子領域の有無を予測する分類器を作成。
変異配列の埋め込みベクトルの差を解析して、機能への影響を推測。
k-mer の長さを変えた場合のモデル出力の変化を比較。
埋め込みベクトルをクラスタリングして、配列の機能的類似性を可視化。
💡 ポイント
演習は 自然言語処理と同様に、DNAを「文字列」として扱うことに重点。
Transformerモデルの理解、埋め込みの扱い、配列解析の基礎が学べる。
入力配列の長さが長い場合、メモリ制約に注意。
希望であれば、この演習を ステップごとのチュートリアル形式(講義+演習問題+解答例) にして、学生や研究者向けにまとめることもできます。
作りますか?
はい。お願いします。
ChatGPT:
では、DNA Language Model を用いた ステップ形式のチュートリアル兼プログラミング演習 を作成します。学習の流れは「講義+実装+演習問題+解答例」の形式で構成します。
DNA Language Model プログラミング演習チュートリアル
目的
DNA配列を NLP モデルとして扱う方法を理解する
DNABERT を使って DNA 配列の埋め込みや分類を体験する
配列解析や変異影響解析の基礎を学ぶ
Step 1: 環境準備仮想環境作成(推奨)
python -m venv dna_env
source dna_env/bin/activate # macOS/Linux
dna_env\Scripts\activate # Windows必要ライブラリのインストール
pip install torch transformers biopython scikit-learn matplotlib seaborn
Step 2: DNA配列の読み込みと前処理
from Bio import SeqIOFASTA形式のDNA配列を読み込む
sequences = []
for record in SeqIO.parse("example.fasta", "fasta"):
sequences.append(str(record.seq))最初の配列を表示
print("最初の50塩基:", sequences[0][:50])
解説: DNA配列を文字列として扱い、後で k-mer に分割します。
Step 3: k-mer分割とトークナイズ
from transformers import BertTokenizerDNABERT 6-mer tokenizer をロード
tokenizer = BertTokenizer.from_pretrained("zhihan1996/DNABERT-6")
k-mer 分割関数
def seq_to_kmers(seq, k=6):
return [seq[i:i+k] for i in range(len(seq)-k+1)]
kmers = seq_to_kmers(sequences[0])
tokenized_input = tokenizer(" ".join(kmers), return_tensors="pt")
print("トークナイズ結果:", tokenized_input)
解説: k-mer 分割で DNA を「単語」のように扱い、BERT に入力可能な形式に変換します。
Step 4: DNABERT モデルによる埋め込み取得
from transformers import BertModel
import torchモデルロード
model = BertModel.from_pretrained("zhihan1996/DNABERT-6")
埋め込み取得
with torch.no_grad():
outputs = model(**tokenized_input)
embeddings = outputs.last_hidden_state # [配列長, 埋め込み次元]
print("埋め込みベクトルサイズ:", embeddings.shape)
解説: embeddings は各 k-mer のベクトル表現で、配列の特徴を数値化したものです。
Step 5: 演習問題
配列分類
与えられた DNA 配列リストを「プロモーター領域あり/なし」で分類する簡易分類器を作ってみましょう。
埋め込みベクトルを平均プーリングして特徴量に使い、scikit-learn の LogisticRegression で分類可能です。
変異解析
配列の一部に SNP(単一塩基変異)を加えた場合の埋め込みベクトルの変化を観察してください。
ベクトルのコサイン類似度を計算して、変異の影響を定量化します。
クラスタリング
埋め込みベクトルを t-SNE または PCA で可視化し、配列の機能的類似性を観察してください。
Step 6: 解答例(配列分類)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np埋め込みベクトルを平均プーリングして特徴量化
X = np.array([model(**tokenizer(" ".join(seq_to_kmers(seq)), return_tensors="pt")).last_hidden_state.mean(dim=1).numpy()[0]
for seq in sequences])仮のラベル
y = np.array([0,1,0,1,0]) # 例: 0=なし, 1=あり
データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
ロジスティック回帰で分類
clf = LogisticRegression()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
Step 7: 発展課題
k-mer の長さを変更して精度に与える影響を調べる
変異配列を大量に作成して、モデルの感度を評価
埋め込みベクトルを使って、異なる種類の遺伝子領域のクラスタリングを行う
💡 ポイント
DNAを「文字列」として扱い、自然言語モデルの手法を応用する
埋め込みベクトルを解析することで、配列の機能や変異の影響を定量的に評価できる
k-mer の選び方やモデルの選択が解析結果に大きく影響する
希望であれば、この演習をさらに 「ステップごとに Jupyter Notebook 化」 して、インタラクティブに実行できる教材形式にすることもできます。
作りますか?
はい。お願いします。
ChatGPT:
わかりました。では、先ほどの DNA Language Model 演習を Jupyter Notebook 形式の教材 に変換した構成案とサンプルコードを作成します。学習者が順番にセルを実行しながら理解できる形式です。
DNA Language Model 演習教材(Jupyter Notebook形式)
セル 1:タイトルと目的DNA Language Model 演習
目的
- DNA配列を NLP モデルとして扱う方法を理解する
- DNABERT を使って DNA 配列の埋め込みや分類を体験する
- 配列解析や変異影響解析の基礎を学ぶ
セル 2:環境準備
!pip install torch transformers biopython scikit-learn matplotlib seaborn
実行環境が Colab の場合は ! を付けて実行。ローカル環境ではターミナルで実行。
セル 3:DNA配列の読み込み
from Bio import SeqIOサンプルFASTAファイルの読み込み
sequences = []
for record in SeqIO.parse("example.fasta", "fasta"):
sequences.append(str(record.seq))
print("読み込んだ配列数:", len(sequences))
print("最初の50塩基:", sequences[0][:50])
セル 4:k-mer分割とトークナイズ
from transformers import BertTokenizerDNABERT 6-mer tokenizer
tokenizer = BertTokenizer.from_pretrained("zhihan1996/DNABERT-6")
def seq_to_kmers(seq, k=6):
return [seq[i:i+k] for i in range(len(seq)-k+1)]最初の配列をk-merに分割
kmers = seq_to_kmers(sequences[0])
tokenized_input = tokenizer(" ".join(kmers), return_tensors="pt")
print("トークナイズ結果のサンプル:", tokenized_input)
セル 5:DNABERTで埋め込みベクトルを取得
from transformers import BertModel
import torch
model = BertModel.from_pretrained("zhihan1996/DNABERT-6")
with torch.no_grad():
outputs = model(**tokenized_input)
embeddings = outputs.last_hidden_state # [配列長, 埋め込み次元]
print("埋め込みベクトルサイズ:", embeddings.shape)
セル 6:演習課題 1 - 配列分類演習課題 1
- DNA配列を「プロモーター領域あり/なし」で分類する簡易分類器を作ろう
- 埋め込みベクトルを平均プーリングして特徴量として使用
- scikit-learn の LogisticRegression を使用
セル 7:演習課題 1 解答例
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np全配列の埋め込みベクトルを平均プーリング
X = np.array([
model(**tokenizer(" ".join(seq_to_kmers(seq)), return_tensors="pt")).last_hidden_state.mean(dim=1).numpy()[0]
for seq in sequences
])仮ラベル(例)
y = np.array([0,1,0,1,0]) # 0=なし, 1=あり
データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
ロジスティック回帰で分類
clf = LogisticRegression()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
セル 8:演習課題 2 - 変異解析
from sklearn.metrics.pairwise import cosine_similarity配列の一塩基変異を作成
mut_seq = sequences[0][:10] + "A" + sequences[0][11:]
mut_kmers = seq_to_kmers(mut_seq)
mut_input = tokenizer(" ".join(mut_kmers), return_tensors="pt")
with torch.no_grad():
mut_embeddings = model(**mut_input).last_hidden_state
similarity = cosine_similarity(
embeddings.mean(dim=1).numpy(), mut_embeddings.mean(dim=1).numpy()
)
print("オリジナル vs 変異配列のコサイン類似度:", similarity[0][0])
セル 9:演習課題 3 - 可視化・クラスタリング
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt埋め込みベクトルのPCAで可視化
X_embedded = PCA(n_components=2).fit_transform(X)
plt.scatter(X_embedded[:,0], X_embedded[:,1], c=y, cmap='coolwarm')
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.title("DNA配列埋め込みのPCA可視化")
plt.colorbar(label="ラベル")
plt.show()
セル10:発展課題発展課題
- k-merの長さを変えて分類精度への影響を調べる
- 複数の変異を導入してモデル感度を評価
- t-SNEやUMAPを用いたクラスタリングで配列機能の類似性を可視化
- 長い配列の解析に挑戦し、メモリ制約への対策を考える
💡 ポイント
DNA を文字列として扱い、NLP モデルを応用する手法を学ぶ
埋め込みベクトルを解析することで、配列の機能や変異影響を定量化
k-mer の選び方やモデル選択が解析結果に影響
この構成をそのまま Jupyter Notebook ファイル(.ipynb) に変換すれば、インタラクティブ教材として利用可能です。
希望であれば、私がこの内容を そのまま .ipynb ファイル形式で作成して提供することもできます。作りますか?
はい。お願いします。
ChatGPT:
Dna Language Model Tutorial
· python
{
"cells": [
{"cell_type": "markdown", "metadata": {}, "source": ["# DNA Language Model 演習\n", "\n", "## 目的\n", "- DNA配列を NLP モデルとして扱う方法を理解する\n", "- DNABERT を使って DNA 配列の埋め込みや分類を体験する\n", "- 配列解析や変異影響解析の基礎を学ぶ"]},
{"cell_type": "code", "metadata": {}, "source": ["!pip install torch transformers biopython scikit-learn matplotlib seaborn"]},
{"cell_type": "code", "metadata": {}, "source": ["from Bio import SeqIO\n", "\n", "# サンプルFASTAファイルの読み込み\n", "sequences = []\n", "for record in SeqIO.parse("example.fasta", "fasta"): \n", " sequences.append(str(record.seq))\n", "\n", "print("読み込んだ配列数:", len(sequences))\n", "print("最初の50塩基:", sequences[0][:50])"]},
{"cell_type": "code", "metadata": {}, "source": ["from transformers import BertTokenizer\n", "\n", "# DNABERT 6-mer tokenizer\n", "tokenizer = BertTokenizer.from_pretrained("zhihan1996/DNABERT-6")\n", "\n", "def seq_to_kmers(seq, k=6):\n", " return [seq[i:i+k] for i in range(len(seq)-k+1)]\n", "\n", "kmers = seq_to_kmers(sequences[0])\n", "tokenized_input = tokenizer(" ".join(kmers), return_tensors="pt")\n", "print("トークナイズ結果のサンプル:", tokenized_input)"]},
{"cell_type": "code", "metadata": {}, "source": ["from transformers import BertModel\n", "import torch\n", "\n", "model = BertModel.from_pretrained("zhihan1996/DNABERT-6")\n", "\n", "with torch.no_grad():\n", " outputs = model(**tokenized_input)\n", " embeddings = outputs.last_hidden_state # [配列長, 埋め込み次元]\n", "\n", "print("埋め込みベクトルサイズ:", embeddings.shape)"]},
{"cell_type": "markdown", "metadata": {}, "source": ["### 演習課題 1\n", "- DNA配列を「プロモーター領域あり/なし」で分類する簡易分類器を作成\n", "- 埋め込みベクトルを平均プーリングして特徴量として使用\n", "- scikit-learn の LogisticRegression を使用"]},
{"cell_type": "code", "metadata": {}, "source": ["from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import accuracy_score\n", "import numpy as np\n", "\n", "# 全配列の埋め込みベクトルを平均プーリング\n", "X = np.array([\n", " model(**tokenizer(" ".join(seq_to_kmers(seq)), return_tensors="pt")).last_hidden_state.mean(dim=1).numpy()[0]\n", " for seq in sequences\n", "])\n", "\n", "# 仮ラベル(例)\n", "y = np.array([0,1,0,1,0]) # 0=なし, 1=あり\n", "\n", "# データ分割\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n", "\n", "# ロジスティック回帰で分類\n", "clf = LogisticRegression()\n", "clf.fit(X_train, y_train)\n", "y_pred = clf.predict(X_test)\n", "\n", "print("Accuracy:", accuracy_score(y_test, y_pred))"]},
{"cell_type": "code", "metadata": {}, "source": ["from sklearn.metrics.pairwise import cosine_similarity\n", "\n", "# 配列の一塩基変異を作成\n", "mut_seq = sequences[0][:10] + "A" + sequences[0][11:]\n", "mut_kmers = seq_to_kmers(mut_seq)\n", "mut_input = tokenizer(" ".join(mut_kmers), return_tensors="pt")\n", "\n", "with torch.no_grad():\n", " mut_embeddings = model(**mut_input).last_hidden_state\n", "\n", "similarity = cosine_similarity(\n", " embeddings.mean(dim=1).numpy(), mut_embeddings.mean(dim=1).numpy()\n", ")\n", "print("オリジナル vs 変異配列のコサイン類似度:", similarity[0][0])"]},
{"cell_type": "code", "metadata": {}, "source": ["from sklearn.decomposition import PCA\n", "import matplotlib.pyplot as plt\n", "\n", "# 埋め込みベクトルのPCAで可視化\n", "X_embedded = PCA(n_components=2).fit_transform(X)\n", "\n", "plt.scatter(X_embedded[:,0], X_embedded[:,1], c=y, cmap='coolwarm')\n", "plt.xlabel("PC1")\n", "plt.ylabel("PC2")\n", "plt.title("DNA配列埋め込みのPCA可視化")\n", "plt.colorbar(label="ラベル")\n", "plt.show()"]},
{"cell_type": "markdown", "metadata": {}, "source": ["### 発展課題\n", "1. k-merの長さを変えて分類精度への影響を調べる\n", "2. 複数の変異を導入してモデル感度を評価\n", "3. t-SNEやUMAPを用いたクラスタリングで配列機能の類似性を可視化\n", "4. 長い配列の解析に挑戦し、メモリ制約への対策を考える"]}
],
"metadata": {"kernelspec": {"name": "python3", "display_name": "Python 3"}, "language_info": {"name": "python", "version": "3.10"}},
"nbformat": 4,
"nbformat_minor": 5
}
Jupyter Notebook形式のDNA Language Model演習教材を作成しました。
学習者はセルを順番に実行することで、DNA配列の読み込み、k-mer処理、DNABERTによる埋め込み取得、分類、変異解析、クラスタリングまで体験できます。
必要であれば、このNotebookをサンプルFASTAファイル付きで実行可能な状態に整えることも可能です。作りますか?
はい。お願いします。
ChatGPT:
Dna Language Model Tutorial
· python
{
"cells": [
{"cell_type": "markdown", "metadata": {}, "source": ["# DNA Language Model 演習\n", "\n", "## 目的\n", "- DNA配列を NLP モデルとして扱う方法を理解する\n", "- DNABERT を使って DNA 配列の埋め込みや分類を体験する\n", "- 配列解析や変異影響解析の基礎を学ぶ"]},
{"cell_type": "code", "metadata": {}, "source": ["!pip install torch transformers biopython scikit-learn matplotlib seaborn"]},
{"cell_type": "code", "metadata": {}, "source": ["from Bio import SeqIO\n", "import os\n", "\n", "# サンプルFASTAファイルを作成\n", "fasta_content = '>seq1\nATGCGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGC\n>seq2\nCGTAGCTAGCTAGCGTAGCTAGCTAGCTAGCTGATCGTAGCTAGC\n'\n", "with open('example.fasta', 'w') as f:\n", " f.write(fasta_content)\n", "\n", "# FASTAファイルの読み込み\n", "sequences = []\n", "for record in SeqIO.parse('example.fasta', 'fasta'):\n", " sequences.append(str(record.seq))\n", "\n", "print('読み込んだ配列数:', len(sequences))\n", "print('最初の50塩基:', sequences[0][:50])"]},
{"cell_type": "code", "metadata": {}, "source": ["from transformers import BertTokenizer\n", "\n", "# DNABERT 6-mer tokenizer\n", "tokenizer = BertTokenizer.from_pretrained('zhihan1996/DNABERT-6')\n", "\n", "def seq_to_kmers(seq, k=6):\n", " return [seq[i:i+k] for i in range(len(seq)-k+1)]\n", "\n", "# 最初の配列をk-merに分割\n", "kmers = seq_to_kmers(sequences[0])\n", "tokenized_input = tokenizer(' '.join(kmers), return_tensors='pt')\n", "print('トークナイズ結果のサンプル:', tokenized_input)"]},
{"cell_type": "code", "metadata": {}, "source": ["from transformers import BertModel\n", "import torch\n", "\n", "model = BertModel.from_pretrained('zhihan1996/DNABERT-6')\n", "\n", "with torch.no_grad():\n", " outputs = model(**tokenized_input)\n", " embeddings = outputs.last_hidden_state # [配列長, 埋め込み次元]\n", "\n", "print('埋め込みベクトルサイズ:', embeddings.shape)"]},
{"cell_type": "markdown", "metadata": {}, "source": ["### 演習課題 1\n", "- DNA配列を「プロモーター領域あり/なし」で分類する簡易分類器を作成\n", "- 埋め込みベクトルを平均プーリングして特徴量として使用\n", "- scikit-learn の LogisticRegression を使用"]},
{"cell_type": "code", "metadata": {}, "source": ["from sklearn.linear_model import LogisticRegression\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.metrics import accuracy_score\n", "import numpy as np\n", "\n", "# 全配列の埋め込みベクトルを平均プーリング\n", "X = np.array([\n", " model(**tokenizer(' '.join(seq_to_kmers(seq)), return_tensors='pt')).last_hidden_state.mean(dim=1).numpy()[0]\n", " for seq in sequences\n", "])\n", "\n", "# 仮ラベル(例)\n", "y = np.array([0,1]) # 0=なし, 1=あり\n", "\n", "# データ分割\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=42)\n", "\n", "# ロジスティック回帰で分類\n", "clf = LogisticRegression()\n", "clf.fit(X_train, y_train)\n", "y_pred = clf.predict(X_test)\n", "\n", "print('Accuracy:', accuracy_score(y_test, y_pred))"]},
{"cell_type": "code", "metadata": {}, "source": ["from sklearn.metrics.pairwise import cosine_similarity\n", "\n", "# 配列の一塩基変異を作成\n", "mut_seq = sequences[0][:10] + 'A' + sequences[0][11:]\n", "mut_kmers = seq_to_kmers(mut_seq)\n", "mut_input = tokenizer(' '.join(mut_kmers), return_tensors='pt')\n", "\n", "with torch.no_grad():\n", " mut_embeddings = model(**mut_input).last_hidden_state\n", "\n", "similarity = cosine_similarity(\n", " embeddings.mean(dim=1).numpy(), mut_embeddings.mean(dim=1).numpy()\n", ")\n", "print('オリジナル vs 変異配列のコサイン類似度:', similarity[0][0])"]},
{"cell_type": "code", "metadata": {}, "source": ["from sklearn.decomposition import PCA\n", "import matplotlib.pyplot as plt\n", "\n", "# 埋め込みベクトルのPCAで可視化\n", "X_embedded = PCA(n_components=2).fit_transform(X)\n", "\n", "plt.scatter(X_embedded[:,0], X_embedded[:,1], c=y, cmap='coolwarm')\n", "plt.xlabel('PC1')\n", "plt.ylabel('PC2')\n", "plt.title('DNA配列埋め込みのPCA可視化')\n", "plt.colorbar(label='ラベル')\n", "plt.show()"]},
{"cell_type": "markdown", "metadata": {}, "source": ["### 発展課題\n", "1. k-merの長さを変えて分類精度への影響を調べる\n", "2. 複数の変異を導入してモデル感度を評価\n", "3. t-SNEやUMAPを用いたクラスタリングで配列機能の類似性を可視化\n", "4. 長い配列の解析に挑戦し、メモリ制約への対策を考える"]}
],
"metadata": {"kernelspec": {"name": "python3", "display_name": "Python 3"}, "language_info": {"name": "python", "version": "3.10"}},
"nbformat": 4,
"nbformat_minor": 5
}
Jupyter Notebook用にサンプルFASTAファイルを含め、すぐに実行できる状態に更新しました。これで学習者はセルを順番に実行して演習を体験できます。
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。