0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【量子AIが変える医療 #3】第1章 量子カーネル法による分子分類(前編)ADMET毒性予測

0
Posted at

1.2 量子カーネル法による分子分類

量子カーネル法は、量子コンピューターを使って高次元特徴空間での内積計算を効率化するアプローチです。ADMET(吸収・分布・代謝・排泄・毒性)特性の分類に特に有効です。

from qiskit_machine_learning.kernels import FidelityQuantumKernel
from qiskit_machine_learning.algorithms import QSVC
from qiskit.circuit.library import ZZFeatureMap
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import pandas as pd

class MolecularClassifier:
    """
    量子カーネルSVM〫よる分子毒性予測
    ADMET特性の分類モデル
    """

    def __init__(self, n_features: int = 4, reps: int = 2):
        self.n_features = n_features
        self.scaler = StandardScaler()

        feature_map = ZZFeatureMap(
            feature_dimension=n_features,
            reps=reps,
            entanglement='circular'
        )
        self.kernel = FidelityQuantumKernel(feature_map=feature_map)
        self.model = QSVC(quantum_kernel=self.kernel)

    def fit(self, X: np.ndarray, y: np.ndarray) -> 'MolecularClassifier':
        X_scaled = self.scaler.fit_transform(X)
        X_normalized = np.arcsin(X_scaled / (np.max(np.abs(X_scaled)) + 1e-8))
        self.model.fit(X_normalized, y)
        return self

    def predict(self, X: np.ndarray) -> np.ndarray:
        X_scaled = self.scaler.transform(X)
        X_normalized = np.arcsin(X_scaled / (np.max(np.abs(X_scaled)) + 1e-8))
        return self.model.predict(X_normalized)

    def evaluate(self, X_test: np.ndarray, y_test: np.ndarray) -> dict:
        y_pred = self.predict(X_test)
        return {
            'classification_report': classification_report(
                y_test, y_pred,
                target_names=['非毒性', '毒性'],
                output_dict=True
            ),
            'confusion_matrix': confusion_matrix(y_test, y_pred).tolist()
        }

def demo_molecular_classification():
    """分子毒性予�測のデモ"""
    np.random.seed(42)
    n_samples = 200
    X = np.random.randn(n_samples, 4)
    y = (X[:, 0] + X[:, 1] > 0).astype(int)

    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42, stratify=y
    )

    classifier = MolecularClassifier(n_features=4)
    classifier.fit(X_train, y_train)
    results = classifier.evaluate(X_test, y_test)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?