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)