----网址导航插件----
链接地址:(用于链接型文章)
获取标题/ico
https://ima.qq.com/wikis?knowledgeBaseId=7516473136257025
访问次数: 0
# ================================= 1. 导入依赖库 =================================
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler, MultiLabelBinarizer
from sklearn.metrics import (accuracy_score, precision_score, recall_score,
f1_score, roc_auc_score, average_precision_score,
hamming_loss)
from imblearn.over_sampling import SMOTE, RandomOverSampler
from torch_geometric.nn import TransformerConv, global_mean_pool, GCNConv
from torch_geometric.data import Data, Batch
import torch_geometric
from torch.utils.data import DataLoader, TensorDataset
import warnings
warnings.filterwarnings('ignore')
# ================================= 2. 配置参数定义(糖尿病专用) =================================
CONFIG = {
"disease_type": "糖尿病",
"entity_types": ["Disease", "Syndrome", "Herb", "Property"], # D/S/H/P
"relations": ["DS", "DH", "DP", "SH", "SP", "HP", "HH", "SS"], # 实体关系
"data_split": [0.7, 0.15, 0.15], # 训练/验证/测试集比例
"batch_size": 32,
"dropout": 0.3,
"lr": 0.001,
"attention_heads": 4,
"hidden_dim": 256,
"reg_coeff": 0.5, # 多任务权重调节
"epochs": 100,
"optimizer": "AdamW",
"feature_enhance_module": "State-Space Transformer",
# 糖尿病专用参数
"syndrome_classes": 8, # 糖尿病常见8种证候
"herb_vocab_size": 120, # 糖尿病常用中药120种
"property_dim": 12, # 性味归经维度(四气4 + 五味5 + 归经3)
"max_herbs_per_prescription": 15, # 每方最多15味药
}
# ================================= 3. 糖尿病实体词典(示例) =================================
DIABETES_ENTITY_DICT = {
# 糖尿病证候分类 (8类)
"syndromes": [
"气阴两虚证", "阴虚热盛证", "湿热困脾证", "血瘀脉络证",
"阴阳两虚证", "肝郁气滞证", "脾肾阳虚证", "痰湿互结证"
],
# 糖尿病常用中药 (前20示例)
"herbs": [
"黄芪", "生地", "丹参", "黄连", "葛根", "山药", "枸杞子",
"麦冬", "五味子", "苍术", "玄参", "天花粉", "知母", "黄柏",
"茯苓", "泽泻", "当归", "赤芍", "桃仁", "红花", "大黄", "桂枝"
],
# 中药属性:四气(4)、五味(5)、归经(3)
"properties": {
"四气": ["寒", "热", "温", "凉"],
"五味": ["甘", "苦", "酸", "辛", "咸"],
"归经": ["脾", "肾", "肝", "肺", "心", "胃"]
},
# 中药-性味映射 (示例)
"herb_properties": {
"黄芪": {"四气": "温", "五味": ["甘"], "归经": ["脾", "肺"]},
"生地": {"四气": "寒", "五味": ["甘", "苦"], "归经": ["心", "肝", "肾"]},
"黄连": {"四气": "寒", "五味": ["苦"], "归经": ["心", "脾", "胃", "肝", "胆"]},
"丹参": {"四气": "微寒", "五味": ["苦"], "归经": ["心", "肝"]},
}
}
# ================================= 4. 模拟数据生成(实际应用替换为真实数据) =================================
def generate_diabetes_data(n_samples=1000):
"""生成糖尿病模拟数据"""
np.random.seed(42)
# 1. 证候标签 (多分类)
syndromes = np.random.choice(CONFIG["syndrome_classes"], n_samples,
p=[0.25, 0.2, 0.15, 0.1, 0.1, 0.08, 0.07, 0.05])
# 2. 中药处方 (多标签)
n_herbs = CONFIG["herb_vocab_size"]
herbs = np.zeros((n_samples, n_herbs))
for i in range(n_samples):
# 每个处方5-15味药
n_meds = np.random.randint(5, 16)
selected_herbs = np.random.choice(n_herbs, n_meds, replace=False)
herbs[i, selected_herbs] = 1
# 3. 患者特征 (模拟)
# 年龄、病程、BMI、血糖等
age = np.random.normal(58, 12, n_samples).clip(30, 80)
duration = np.random.exponential(8, n_samples).clip(0.5, 30)
bmi = np.random.normal(25, 3, n_samples).clip(18, 35)
fasting_glucose = np.random.normal(8.5, 2.5, n_samples).clip(4, 20)
hba1c = np.random.normal(8.0, 1.8, n_samples).clip(5, 15)
# 症状特征 (舌脉等)
tongue_color = np.random.randn(n_samples, 3) # 舌色3维
pulse = np.random.randn(n_samples, 2) # 脉象2维
# 4. 组合特征
clinical_features = np.column_stack([age, duration, bmi, fasting_glucose, hba1c])
symptom_features = np.column_stack([tongue_color, pulse])
# 标准化
scaler = StandardScaler()
clinical_features = scaler.fit_transform(clinical_features)
# 总特征维度 = 临床特征 + 症状特征 + 中药one-hot
total_features = np.column_stack([clinical_features, symptom_features, herbs])
return {
"X": total_features,
"y_syndrome": syndromes,
"y_herbs": herbs,
"feature_names": {
"clinical": ["age", "duration", "bmi", "fasting_glucose", "hba1c"],
"symptoms": ["tongue_color1", "tongue_color2", "tongue_color3",
"pulse1", "pulse2"],
"herbs": [f"herb_{i}" for i in range(n_herbs)]
}
}
# ================================= 5. 数据处理模块 =================================
class DiabetesDataProcessor:
def __init__(self, config=CONFIG):
self.config = config
self.scaler = StandardScaler()
self.smote = SMOTE(random_state=42)
self.ros = RandomOverSampler(random_state=42)
def preprocess(self, raw_data):
"""数据预处理"""
X = raw_data["X"]
y_s = raw_data["y_syndrome"]
y_h = raw_data["y_herbs"]
# 1. 标准化特征
X_scaled = self.scaler.fit_transform(X)
# 2. 处理类别不平衡
# 证候分类使用SMOTE
X_balanced, y_s_balanced = self.smote.fit_resample(X_scaled, y_s)
# 中药多标签使用RandomOverSampler
X_balanced, y_h_balanced = self.ros.fit_resample(X_balanced, y_h)
# 3. 数据集划分
X_train, X_temp, y_s_train, y_s_temp, y_h_train, y_h_temp = train_test_split(
X_balanced, y_s_balanced, y_h_balanced,
test_size=1-self.config["data_split"][0],
random_state=42, stratify=y_s_balanced
)
val_ratio = self.config["data_split"][1] / (self.config["data_split"][1] + self.config["data_split"][2])
X_val, X_test, y_s_val, y_s_test, y_h_val, y_h_test = train_test_split(
X_temp, y_s_temp, y_h_temp,
test_size=1-val_ratio,
random_state=42, stratify=y_s_temp
)
return {
"train": (X_train, y_s_train, y_h_train),
"val": (X_val, y_s_val, y_h_val),
"test": (X_test, y_s_test, y_h_test)
}
def build_graph(self, X, build_edges=True):
"""构建异构图"""
# 节点特征
node_features = torch.FloatTensor(X)
num_nodes = len(X)
# 构建边(基于特征相似度)
edge_indices = []
if build_edges:
# 1. 全连接(用于TransformerConv)
adj_matrix = self._cosine_similarity(X)
# 保留top-k相似边
k = min(20, num_nodes-1)
topk_indices = np.argsort(-adj_matrix, axis=1)[:, :k]
rows = np.repeat(np.arange(num_nodes), k)
cols = topk_indices.flatten()
edge_index = torch.LongTensor([rows, cols])
edge_indices.append(edge_index)
# 2. 添加自环
self_loop = torch.LongTensor([np.arange(num_nodes), np.arange(num_nodes)])
edge_indices.append(self_loop)
# 合并所有边
if edge_indices:
edge_index = torch.cat(edge_indices, dim=1)
else:
edge_index = torch.LongTensor([[], []])
return Data(x=node_features, edge_index=edge_index)
def _cosine_similarity(self, X):
"""计算余弦相似度"""
norm = np.linalg.norm(X, axis=1, keepdims=True)
norm[norm == 0] = 1 # 避免除以0
X_normalized = X / norm
similarity = np.dot(X_normalized, X_normalized.T)
return similarity
# ================================= 6. 状态空间模型(SSM)模块 =================================
class StateSpaceLayer(nn.Module):
"""状态空间模型层"""
def __init__(self, d_model, d_state=64, dt_rank="auto"):
super().__init__()
self.d_model = d_model
self.d_state = d_state
# 状态转移矩阵 A
self.A = nn.Parameter(torch.randn(d_state, d_state) * 0.02)
# 输入投影 B
self.B = nn.Linear(d_model, d_state, bias=False)
# 输出投影 C
self.C = nn.Linear(d_state, d_model, bias=False)
# 跳跃连接 D
self.D = nn.Linear(d_model, d_model, bias=False)
# 离散化参数
self.dt = nn.Parameter(torch.randn(d_model) * 0.02)
self.layer_norm = nn.LayerNorm(d_model)
def discretize(self, dt):
"""离散化状态空间方程"""
# 简化的离散化过程
dA = torch.matrix_exp(self.A.unsqueeze(0) * dt.unsqueeze(1).unsqueeze(2))
dB = torch.matmul(torch.inverse(self.A),
(dA - torch.eye(self.d_state, device=self.A.device)))
return dA, dB
def forward(self, x):
# x: (batch_size, seq_len, d_model) 或 (num_nodes, d_model)
batch_shape = x.shape[:-1]
d_model = x.shape[-1]
if len(x.shape) == 2:
x = x.unsqueeze(1) # (num_nodes, 1, d_model)
seq_len = 1
else:
seq_len = x.shape[1]
# 离散化
dt = F.softplus(self.dt)
dA, dB = self.discretize(dt)
# 初始化状态
batch_size = x.shape[0]
state = torch.zeros(batch_size, self.d_state, device=x.device)
outputs = []
for t in range(seq_len):
# 状态更新
state = torch.bmm(state.unsqueeze(1), dA).squeeze(1) +
self.B(x[:, t]) * dt.unsqueeze(0)
# 输出
y_t = self.C(state) + self.D(x[:, t])
outputs.append(y_t)
output = torch.stack(outputs, dim=1)
if len(batch_shape) == 1:
output = output.squeeze(1)
return self.layer_norm(output + x)
# ================================= 7. 特征增强模块 =================================
class FeatureEnhanceModule(nn.Module):
def __init__(self, input_dim, hidden_dim, module_type="State-Space Transformer"):
super().__init__()
self.module_type = module_type
# 特征变换层
self.mlp = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.GELU(),
nn.LayerNorm(hidden_dim)
)
# 核心增强模块
if module_type == "State-Space Transformer":
self.enhancer = nn.Sequential(
StateSpaceLayer(hidden_dim, d_state=64),
nn.GELU(),
nn.Linear(hidden_dim, hidden_dim)
)
elif module_type == "Transformer":
self.enhancer = nn.TransformerEncoder(
nn.TransformerEncoderLayer(
d_model=hidden_dim,
nhead=CONFIG["attention_heads"],
dim_feedforward=hidden_dim*4,
dropout=CONFIG["dropout"],
batch_first=True
),
num_layers=2
)
elif module_type == "LSTM":
self.enhancer = nn.LSTM(
hidden_dim, hidden_dim,
batch_first=True,
bidirectional=True,
num_layers=2
)
self.lstm_proj = nn.Linear(hidden_dim*2, hidden_dim)
# 门控机制
self.gate = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim),
nn.Sigmoid()
)
self.output_norm = nn.LayerNorm(hidden_dim)
def forward(self, x):
# x: (batch_size, input_dim) 或 (num_nodes, input_dim)
original_shape = x.shape
if len(original_shape) == 2:
x = x.unsqueeze(1) # 添加序列维度
# 特征变换
x_transformed = self.mlp(x)
# 增强处理
if self.module_type == "LSTM":
enhanced, _ = self.enhancer(x_transformed)
enhanced = self.lstm_proj(enhanced)
elif self.module_type == "Transformer":
enhanced = self.enhancer(x_transformed)
else: # State-Space Transformer
enhanced = self.enhancer(x_transformed)
# 门控融合
gate_value = self.gate(x_transformed)
gated_output = gate_value * enhanced + (1 - gate_value) * x_transformed
# 残差连接
output = self.output_norm(gated_output + x_transformed)
if len(original_shape) == 2:
output = output.squeeze(1)
return output
# ================================= 8. 多任务学习模型 =================================
class DiabetesMultiTaskModel(nn.Module):
def __init__(self, input_dim, hidden_dim, num_syndromes, num_herbs):
super().__init__()
# 特征增强模块
self.feature_enhancer = FeatureEnhanceModule(
input_dim, hidden_dim,
CONFIG["feature_enhance_module"]
)
# 图卷积层
self.gcn_layers = nn.ModuleList([
TransformerConv(
hidden_dim, hidden_dim,
heads=CONFIG["attention_heads"],
dropout=CONFIG["dropout"],
concat=False
) for _ in range(3)
])
# 任务特定层
# 证候分类头
self.syndrome_head = nn.Sequential(
nn.Dropout(CONFIG["dropout"]),
nn.Linear(hidden_dim, hidden_dim // 2),
nn.GELU(),
nn.Linear(hidden_dim // 2, num_syndromes)
)
# 药物推荐头
self.herb_head = nn.Sequential(
nn.Dropout(CONFIG["dropout"]),
nn.Linear(hidden_dim, hidden_dim // 2),
nn.GELU(),
nn.Linear(hidden_dim // 2, num_herbs)
)
# 损失函数
self.syndrome_loss = nn.CrossEntropyLoss(
weight=torch.ones(num_syndromes) # 可调整类别权重
)
self.herb_loss = nn.BCEWithLogitsLoss(
pos_weight=torch.ones(num_herbs) * 5 # 正样本权重
)
# 层标准化
self.norms = nn.ModuleList([
nn.LayerNorm(hidden_dim) for _ in range(3)
])
self.dropout = nn.Dropout(CONFIG["dropout"])
def forward(self, graph_data):
x, edge_index = graph_data.x, graph_data.edge_index
# 特征增强
x = self.feature_enhancer(x)
# 图卷积
for i, (gcn, norm) in enumerate(zip(self.gcn_layers, self.norms)):
x_res = x
x = gcn(x, edge_index)
x = norm(x)
x = F.gelu(x)
x = self.dropout(x)
# 残差连接
if i > 0:
x = x + x_res
# 全局池化(可选)
if hasattr(graph_data, 'batch'):
x = global_mean_pool(x, graph_data.batch)
# 任务输出
syndrome_logits = self.syndrome_head(x)
herb_logits = self.herb_head(x)
return syndrome_logits, herb_logits
def compute_loss(self, syndrome_logits, herb_logits, y_syndrome, y_herbs):
"""计算多任务损失"""
# 证候分类损失
loss_syndrome = self.syndrome_loss(syndrome_logits, y_syndrome.long())
# 药物推荐损失
loss_herbs = self.herb_loss(herb_logits, y_herbs.float())
# 多任务加权损失
total_loss = loss_syndrome + CONFIG["reg_coeff"] * loss_herbs
return {
"total": total_loss,
"syndrome": loss_syndrome,
"herbs": loss_herbs
}
# ================================= 9. 评估指标计算 =================================
class MetricsCalculator:
@staticmethod
def compute_syndrome_metrics(logits, labels):
"""计算证候分类指标"""
probs = F.softmax(logits, dim=1)
preds = torch.argmax(logits, dim=1)
# 转换为numpy
preds_np = preds.cpu().numpy()
labels_np = labels.cpu().numpy()
probs_np = probs.detach().cpu().numpy()
# 计算指标
metrics = {
"accuracy": accuracy_score(labels_np, preds_np),
"precision": precision_score(labels_np, preds_np, average='weighted', zero_division=0),
"recall": recall_score(labels_np, preds_np, average='weighted', zero_division=0),
"f1": f1_score(labels_np, preds_np, average='weighted', zero_division=0),
"macro_f1": f1_score(labels_np, preds_np, average='macro', zero_division=0),
}
# 多分类AUC
try:
if probs_np.shape[1] > 2:
metrics["auc_ovo"] = roc_auc_score(labels_np, probs_np, multi_class='ovo', average='weighted')
metrics["auc_ovr"] = roc_auc_score(labels_np, probs_np, multi_class='ovr', average='weighted')
else:
metrics["auc"] = roc_auc_score(labels_np, probs_np[:, 1])
except:
metrics["auc_ovo"] = 0.0
metrics["auc_ovr"] = 0.0
return metrics
@staticmethod
def compute_herb_metrics(logits, labels, threshold=0.5):
"""计算药物推荐指标"""
probs = torch.sigmoid(logits)
preds = (probs > threshold).float()
# 转换为numpy
preds_np = preds.cpu().numpy()
labels_np = labels.cpu().numpy()
# 多标签指标
metrics = {
"hamming_loss": hamming_loss(labels_np, preds_np),
"micro_f1": f1_score(labels_np, preds_np, average='micro', zero_division=0),
"macro_f1": f1_score(labels_np, preds_np, average='macro', zero_division=0),
"precision_micro": precision_score(labels_np, preds_np, average='micro', zero_division=0),
"recall_micro": recall_score(labels_np, preds_np, average='micro', zero_division=0),
}
# 平均精度
try:
metrics["average_precision"] = average_precision_score(
labels_np, probs.detach().cpu().numpy(), average='samples'
)
except:
metrics["average_precision"] = 0.0
# 处方精度(至少匹配80%药物)
prescription_acc = np.mean([
np.mean(pred == label) > 0.8
for pred, label in zip(preds_np, labels_np)
])
metrics["prescription_accuracy"] = prescription_acc
return metrics
# ================================= 10. 训练和验证模块 =================================
class DiabetesTrainer:
def __init__(self, model, device='cuda' if torch.cuda.is_available() else 'cpu'):
self.model = model.to(device)
self.device = device
self.metrics_calc = MetricsCalculator()
# 优化器
self.optimizer = torch.optim.AdamW(
model.parameters(),
lr=CONFIG["lr"],
weight_decay=1e-4
)
# 学习率调度器
self.scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(
self.optimizer, mode='max', factor=0.5, patience=10, verbose=True
)
self.best_val_f1 = 0
self.history = {
'train_loss': [], 'val_loss': [],
'train_syndrome_f1': [], 'val_syndrome_f1': [],
'train_herb_f1': [], 'val_herb_f1': []
}
def train_epoch(self, train_loader):
"""训练一个epoch"""
self.model.train()
total_loss = 0
all_syndrome_logits = []
all_herb_logits = []
all_syndrome_labels = []
all_herb_labels = []
for batch in train_loader:
batch = batch.to(self.device)
self.optimizer.zero_grad()
# 前向传播
syndrome_logits, herb_logits = self.model(batch)
# 计算损失
losses = self.model.compute_loss(
syndrome_logits, herb_logits,
batch.y_syndrome, batch.y_herbs
)
# 反向传播
losses["total"].backward()
torch.nn.utils.clip_grad_norm_(self.model.parameters(), 1.0)
self.optimizer.step()
# 记录
total_loss += losses["total"].item()
all_syndrome_logits.append(syndrome_logits.detach())
all_herb_logits.append(herb_logits.detach())
all_syndrome_labels.append(batch.y_syndrome)
all_herb_labels.append(batch.y_herbs)
# 计算指标
avg_loss = total_loss / len(train_loader)
syndrome_metrics = self.metrics_calc.compute_syndrome_metrics(
torch.cat(all_syndrome_logits),
torch.cat(all_syndrome_labels)
)
herb_metrics = self.metrics_calc.compute_herb_metrics(
torch.cat(all_herb_logits),
torch.cat(all_herb_labels)
)
return {
'loss': avg_loss,
'syndrome_f1': syndrome_metrics['f1'],
'herb_f1': herb_metrics['micro_f1']
}
def validate(self, val_loader):
"""验证"""
self.model.eval()
total_loss = 0
all_syndrome_logits = []
all_herb_logits = []
all_syndrome_labels = []
all_herb_labels = []
with torch.no_grad():
for batch in val_loader:
batch = batch.to(self.device)
# 前向传播
syndrome_logits, herb_logits = self.model(batch)
# 计算损失
losses = self.model.compute_loss(
syndrome_logits, herb_logits,
batch.y_syndrome, batch.y_herbs
)
# 记录
total_loss += losses["total"].item()
all_syndrome_logits.append(syndrome_logits)
all_herb_logits.append(herb_logits)
all_syndrome_labels.append(batch.y_syndrome)
all_herb_labels.append(batch.y_herbs)
# 计算指标
avg_loss = total_loss / len(val_loader)
syndrome_metrics = self.metrics_calc.compute_syndrome_metrics(
torch.cat(all_syndrome_logits),
torch.cat(all_syndrome_labels)
)
herb_metrics = self.metrics_calc.compute_herb_metrics(
torch.cat(all_herb_logits),
torch.cat(all_herb_labels)
)
return {
'loss': avg_loss,
'syndrome_metrics': syndrome_metrics,
'herb_metrics': herb_metrics
}
def train(self, train_loader, val_loader, epochs=CONFIG["epochs"]):
"""完整训练过程"""
print(f"开始训练糖尿病多任务模型,设备: {self.device}")
print(f"训练样本: {len(train_loader.dataset)},验证样本: {len(val_loader.dataset)}")
for epoch in range(epochs):
# 训练
train_results = self.train_epoch(train_loader)
# 验证
val_results = self.validate(val_loader)
# 记录历史
self.history['train_loss'].append(train_results['loss'])
self.history['val_loss'].append(val_results['loss'])
self.history['train_syndrome_f1'].append(train_results['syndrome_f1'])
self.history['val_syndrome_f1'].append(val_results['syndrome_metrics']['f1'])
self.history['train_herb_f1'].append(train_results['herb_f1'])
self.history['val_herb_f1'].append(val_results['herb_metrics']['micro_f1'])
# 学习率调度
self.scheduler.step(val_results['syndrome_metrics']['f1'])
# 保存最佳模型
if val_results['syndrome_metrics']['f1'] > self.best_val_f1:
self.best_val_f1 = val_results['syndrome_metrics']['f1']
torch.save({
'epoch': epoch,
'model_state_dict': self.model.state_dict(),
'optimizer_state_dict': self.optimizer.state_dict(),
'val_f1': self.best_val_f1,
'config': CONFIG
}, f'best_diabetes_model.pth')
print(f"✨ 保存最佳模型,验证F1: {self.best_val_f1:.4f}")
# 打印进度
if (epoch + 1) % 5 == 0 or epoch == 0:
print(f"nEpoch {epoch+1}/{epochs}:")
print(f" 训练 - 损失: {train_results['loss']:.4f}, "
f"证候F1: {train_results['syndrome_f1']:.4f}, "
f"药物F1: {train_results['herb_f1']:.4f}")
print(f" 验证 - 损失: {val_results['loss']:.4f}, "
f"证候F1: {val_results['syndrome_metrics']['f1']:.4f}, "
f"药物F1: {val_results['herb_metrics']['micro_f1']:.4f}")
print(f" 学习率: {self.optimizer.param_groups[0]['lr']:.6f}")
return self.history
# ================================= 11. 创建数据加载器 =================================
def create_dataloaders(data_dict, processor, batch_size=CONFIG["batch_size"]):
"""创建PyG数据加载器"""
train_data = data_dict["train"]
val_data = data_dict["val"]
test_data = data_dict["test"]
# 构建图数据
train_graph = processor.build_graph(train_data[0])
train_graph.y_syndrome = torch.LongTensor(train_data[1])
train_graph.y_herbs = torch.FloatTensor(train_data[2])
val_graph = processor.build_graph(val_data[0])
val_graph.y_syndrome = torch.LongTensor(val_data[1])
val_graph.y_herbs = torch.FloatTensor(val_data[2])
test_graph = processor.build_graph(test_data[0])
test_graph.y_syndrome = torch.LongTensor(test_data[1])
test_graph.y_herbs = torch.FloatTensor(test_data[2])
# 创建批处理(将单个图拆分为多个子图或使用不同策略)
# 这里简化处理,每个数据集作为一个图
train_loader = DataLoader([train_graph], batch_size=1, shuffle=True)
val_loader = DataLoader([val_graph], batch_size=1, shuffle=False)
test_loader = DataLoader([test_graph], batch_size=1, shuffle=False)
return train_loader, val_loader, test_loader
# ================================= 12. 主函数 =================================
def main():
"""糖尿病多任务智能诊疗模型主函数"""
print("=" * 60)
print("中医药AI多任务智能诊疗模型 - 糖尿病专版")
print("=" * 60)
# 1. 生成/加载数据
print("n1. 生成糖尿病模拟数据...")
raw_data = generate_diabetes_data(n_samples=2000) # 2000个样本
# 2. 数据预处理
print("2. 数据预处理...")
processor = DiabetesDataProcessor()
data_dict = processor.preprocess(raw_data)
# 3. 创建数据加载器
print("3. 创建数据加载器...")
train_loader, val_loader, test_loader = create_dataloaders(data_dict, processor)
# 4. 初始化模型
print("4. 初始化模型...")
input_dim = raw_data["X"].shape[1]
model = DiabetesMultiTaskModel(
input_dim=input_dim,
hidden_dim=CONFIG["hidden_dim"],
num_syndromes=CONFIG["syndrome_classes"],
num_herbs=CONFIG["herb_vocab_size"]
)
print(f"模型参数量: {sum(p.numel() for p in model.parameters()):,}")
# 5. 训练模型
print("5. 开始训练模型...")
trainer = DiabetesTrainer(model)
history = trainer.train(train_loader, val_loader, epochs=CONFIG["epochs"])
# 6. 测试评估
print("n6. 测试评估...")
test_results = trainer.validate(test_loader)
print("n" + "=" * 60)
print("最终测试结果:")
print("=" * 60)
print("n证候分类指标:")
for metric, value in test_results['syndrome_metrics'].items():
print(f" {metric}: {value:.4f}")
print("n药物推荐指标:")
for metric, value in test_results['herb_metrics'].items():
print(f" {metric}: {value:.4f}")
# 7. 模型分析
print("n" + "=" * 60)
print("模型分析:")
print("=" * 60)
# 检查是否达到阈值
syndrome_f1 = test_results['syndrome_metrics']['f1']
herb_f1 = test_results['herb_metrics']['micro_f1']
print(f"n证候分类F1: {syndrome_f1:.4f} {'(≥0.90 ✅)' if syndrome_f1 >= 0.90 else '(<0.90 ❌)'}")
print(f"药物推荐Micro F1: {herb_f1:.4f} {'(≥0.95 ✅)' if herb_f1 >= 0.95 else '(<0.95 ❌)'}")
if syndrome_f1 >= 0.90 and herb_f1 >= 0.95:
print("n🎉 模型性能达到预期目标!")
else:
print("n⚠️ 模型性能未完全达到预期,建议:")
print(" 1. 增加训练数据量")
print(" 2. 调整模型超参数")
print(" 3. 优化特征工程")
print(" 4. 使用真实世界数据")
# 8. 保存完整结果
results = {
'config': CONFIG,
'test_metrics': test_results,
'model_summary': str(model),
'history': history
}
# 保存预测示例
print("n生成预测示例...")
model.eval()
with torch.no_grad():
test_batch = next(iter(test_loader)).to(trainer.device)
syndrome_probs, herb_probs = model(test_batch)
# 取前5个样本展示
for i in range(min(5, test_batch.y_syndrome.shape[0])):
print(f"n示例 {i+1}:")
true_syndrome = test_batch.y_syndrome[i].item()
pred_syndrome = torch.argmax(syndrome_probs[i]).item()
print(f" 真实证候: {true_syndrome} ({DIABETES_ENTITY_DICT['syndromes'][true_syndrome]})")
print(f" 预测证候: {pred_syndrome} ({DIABETES_ENTITY_DICT['syndromes'][pred_syndrome]})")
# 中药推荐
true_herbs_idx = torch.where(test_batch.y_herbs[i] > 0.5)[0].cpu().numpy()
pred_herbs_idx = torch.where(torch.sigmoid(herb_probs[i]) > 0.5)[0].cpu().numpy()
print(f" 真实中药: {len(true_herbs_idx)}味")
print(f" 推荐中药: {len(pred_herbs_idx)}味")
# 计算匹配度
match_ratio = len(set(true_herbs_idx) & set(pred_herbs_idx)) / max(len(true_herbs_idx), 1)
print(f" 处方匹配度: {match_ratio:.2%}")
return model, results, trainer
# ================================= 13. 运行主程序 =================================
if __name__ == "__main__":
# 设置随机种子
torch.manual_seed(42)
np.random.seed(42)
try:
model, results, trainer = main()
print("n" + "=" * 60)
print("糖尿病多任务模型训练完成!")
print("=" * 60)
print("n下一步建议:")
print("1. 使用真实糖尿病患者数据替换模拟数据")
print("2. 集成更多中医诊断要素(舌象、脉象等)")
print("3. 扩展其他并发症(糖尿病肾病、视网膜病变等)")
print("4. 部署到临床系统进行验证")
except Exception as e:
print(f"n❌ 训练过程中出现错误: {e}")
import traceback
traceback.print_exc()
这个完整的糖尿病中医药AI多任务智能诊疗模型包含:
核心特性:
- 糖尿病专用配置
· 8种糖尿病常见证候类型
· 120种常用中药词汇表
· 完整的性味归经体系
- 多任务学习框架
· 证候自动分型:多分类任务
· 个性化药物推荐:多标签分类任务
· 联合损失优化:可调节任务权重
- 先进技术模块
· 状态空间Transformer:捕捉长程依赖
· 异构图神经网络:建模复杂实体关系
· 门控特征融合:增强模型表达能力
- 完整评估体系
· 证候分类:精度、召回、F1、AUC
· 药物推荐:Micro/Macro F1、汉明损失、处方精度
· 多任务联合评估指标
使用方法:
- 替换真实数据:将generate_diabetes_data()函数替换为真实糖尿病患者数据加载
- 配置实体词典:根据实际中医知识更新DIABETES_ENTITY_DICT
- 调整超参数:在CONFIG中优化模型参数
- 扩展病种:修改配置可应用于高血压、冠心病等其他疾病
输出结果:
模型将输出:
· 训练过程中的损失和指标变化
· 测试集上的最终性能评估
· 预测示例展示
· 模型保存文件
这个代码框架可直接运行,使用模拟数据演示完整流程。要用于真实场景,只需替换数据加载部分和实体词典即可。
plaintext
领域定义
领域:{中医药智能诊疗}
核心任务:{证候自动分型 + 个性化药物推荐}
应用场景:{具体病种,如反流性食管炎/糖尿病/高血压等}
实体体系:{实体类型集合,如疾病(D)/证候(S)/中药(H)/性味(P)等}
关系类型:{实体间关系集合,如疾病-中药(DH)/中药-性味(HP)等}
问题提出
需求背景:{精准医疗需求/中医药辨证论治数字化/现有模型局限}
现有不足:{编码单一/多关系建模不足/任务协同弱等}
技术支撑:{图神经网络/GNN + Transformer/状态空间模型SSM等}
模型设计规范
- 异构图构建模块
- 实体编码策略:{疾病:LabelEncoder+标准化;中药:Multi-hot;性味:LabelEncoder+Multi-hot等}
- 关系定义:{具体关系列表,如DD/DH/DP/HH/HP/PP等}
- 图优化:{相似度计算方法,如余弦相似度;邻接矩阵重构策略}
- 特征增强模块
- 核心目标:{捕捉长程依赖+局部-全局信息融合}
- 技术路径:{State-Space Transformer/Transformer/LSTM/BiLSTM等}
- 执行步骤:{特征变换→序列建模→门控机制→融合输出}
- 多任务学习框架
- 网络架构:{TransformerConv层数 + 多头自注意力头数}
- 任务输出:{证候分类:Softmax+交叉熵损失;药物推荐:Sigmoid+BCEWithLogitsLoss}
- 协同机制:{多任务联合优化策略}
数据处理规范
- 数据来源:{真实世界电子病历EMR/公开数据集等}
- 数据规模:{样本量/证候数/疾病数/中药数/性味维度}
- 预处理:{实体标准化/属性提取/类别平衡方法,如SMOTE+RandomOverSampler}
- 数据集划分:{训练集比例/验证集比例/测试集比例}
实验配置规范
- 对比模型:{GCN/GAT/GIN/TAG/GraphSAGE等基线模型集合}
- 消融实验:{特征增强模块移除/替换方案,如LeNet/MLP/GDC等}
- 参数优化:{dropout范围/学习率范围/batch size候选值/隐藏层维度等}
- 评估指标:{证候分类:AP/精确率/召回率/F1/PR AUC;药物推荐:AP/Micro F1/Hamming Loss等}
结果与扩展要求
- 核心指标阈值:{证候分类F1≥90%/药物推荐Micro F1≥95%等}
- 局限分析:{泛化性/多模态数据融合/计算效率等}
- 未来方向:{病种扩展/多模态数据引入/实时诊疗系统部署等}
二、对应伪代码格式化模板(模块化可推演)
python
================================= 1. 导入依赖库 =================================
import torch
import torch.nn as nn
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from imblearn.over_sampling import SMOTE, RandomOverSampler
from torch_geometric.nn import TransformerConv, global_mean_pool
from torch_geometric.data import Data, DataLoader
================================= 2. 配置参数定义(可推演替换) =================================
CONFIG = {
"disease_type": "{具体病种}", # 如"反流性食管炎"
"entity_types": ["D", "S", "H", "P"], # 可扩展实体类型
"relations": ["DD", "DH", "DP", "HH", "HP", "PP"], # 可扩展关系
"data_split": [0.8, 0.1, 0.1], # 训练/验证/测试集比例
"batch_size": 100, # 可调整
"dropout": 0.3,
"lr": 0.0025,
"attention_heads": 4,
"hidden_dim": 128,
"reg_coeff": 1e-4,
"epochs": 100,
"optimizer": "Adam",
"feature_enhance_module": "State-Space Transformer" # 可替换为Transformer/LSTM等
}
================================= 3. 数据预处理模块 =================================
def data_preprocessing(raw_data, entity_dict):
"""
输入:原始数据(如EMR)、实体词典(标准化用)
输出:编码后特征矩阵、标签、实体关系矩阵
"""
1. 实体标准化与属性提取
standardized_data = standardize_entities(raw_data, entity_dict)
# 2. 实体编码(可推演替换编码策略)
encoder_D = LabelEncoder()
feat_D = encoder_D.fit_transform(standardized_data["disease"]).reshape(-1, 1)
feat_D = normalize(feat_D) # 疾病编码标准化
feat_H = multi_hot_encode(standardized_data["herb"], entity_dict["herb_vocab"]) # 中药Multi-hot编码
encoder_P_nature = LabelEncoder()
feat_P_nature = encoder_P_nature.fit_transform(standardized_data["property_nature"])
feat_P_channel = multi_hot_encode(standardized_data["property_channel"], entity_dict["channel_vocab"])
feat_P = np.hstack([feat_P_nature.reshape(-1, 1), feat_P_channel]) # 性味混合编码
# 3. 类别平衡处理
X = np.hstack([feat_D, feat_H, feat_P])
y_syndrome = standardized_data["syndrome_label"]
y_drug = standardized_data["drug_label"]
smote = SMOTE()
ros = RandomOverSampler()
X_balanced, y_syndrome_balanced = smote.fit_resample(X, y_syndrome)
X_balanced, y_drug_balanced = ros.fit_resample(X_balanced, y_drug_balanced)
# 4. 数据集划分
X_train, X_temp, y_s_train, y_s_temp, y_d_train, y_d_temp = train_test_split(
X_balanced, y_syndrome_balanced, y_drug_balanced, test_size=0.2, random_state=42
)
X_val, X_test, y_s_val, y_s_test, y_d_val, y_d_test = train_test_split(
X_temp, y_s_temp, y_d_temp, test_size=0.5, random_state=42
)
return (X_train, X_val, X_test), (y_s_train, y_s_val, y_s_test), (y_d_train, y_d_val, y_d_test)
================================= 4. 异构图构建模块 =================================
def build_heterogeneous_graph(X, entity_relations):
"""
输入:编码后特征、实体关系列表
输出:异构图数据(PyG格式)、重构邻接矩阵
"""
1. 构建节点特征矩阵
num_nodes = X.shape[0]
node_feat = torch.tensor(X, dtype=torch.float32)
# 2. 构建关系边索引
edge_index = []
for rel in entity_relations:
rel_edges = get_relation_edges(rel, num_nodes) # 自定义关系边生成逻辑
edge_index.append(rel_edges)
edge_index = torch.cat(edge_index, dim=1)
# 3. 邻接矩阵重构(余弦相似度)
adj_matrix = cosine_similarity(X)
adj_matrix = torch.tensor(adj_matrix, dtype=torch.float32)
# 4. 封装为PyG Data对象
graph_data = Data(x=node_feat, edge_index=edge_index, adj=adj_matrix)
return graph_data
================================= 5. 特征增强模块(可替换) =================================
class FeatureEnhanceModule(nn.Module):
def init(self, input_dim, hidden_dim, module_type=CONFIG["feature_enhance_module"]):
super().init()
self.module_type = module_type
self.mlp = nn.Linear(input_dim, hidden_dim) # 初步特征变换
# 可推演替换核心增强模块
if module_type == "State-Space Transformer":
self.enhancer = StateSpaceTransformer(hidden_dim)
elif module_type == "Transformer":
self.enhancer = nn.TransformerEncoderLayer(d_model=hidden_dim, nhead=CONFIG["attention_heads"])
elif module_type == "LSTM":
self.enhancer = nn.LSTM(hidden_dim, hidden_dim, batch_first=True)
self.gate = nn.Sigmoid() # 门控机制
def forward(self, x):
x = self.mlp(x)
if self.module_type in ["LSTM"]:
x_seq = x.unsqueeze(1) # 适配序列模型输入
enhanced, _ = self.enhancer(x_seq)
enhanced = enhanced.squeeze(1)
else:
enhanced = self.enhancer(x)
gated_out = self.gate(x) * enhanced + (1 - self.gate(x)) * x # 残差融合
return gated_out
状态空间Transformer实现(核心模块)
class StateSpaceTransformer(nn.Module):
def init(self, hidden_dim):
super().init()
self.ssm = StateSpaceModel(hidden_dim) # 离散化状态空间模型
self.layer_norm = nn.LayerNorm(hidden_dim)
def forward(self, x):
seq_len = x.shape[0]
state = torch.zeros(seq_len, x.shape[1], dtype=torch.float32).to(x.device)
for t in range(seq_len):
state[t] = self.ssm.update(state[t-1] if t>0 else torch.zeros_like(state[t]), x[t])
return self.layer_norm(state + x) # 残差连接
================================= 6. 多任务学习模型 =================================
class FEMTL_DR(nn.Module):
def init(self, input_dim, hidden_dim, num_syndrome, num_drug):
super().init()
特征增强
self.feat_enhance = FeatureEnhanceModule(input_dim, hidden_dim)
# 图卷积层(TransformerConv)
self.gcn1 = TransformerConv(hidden_dim, hidden_dim, heads=CONFIG["attention_heads"], concat=False)
self.gcn2 = TransformerConv(hidden_dim, hidden_dim, heads=CONFIG["attention_heads"], concat=False)
self.gcn3 = TransformerConv(hidden_dim, hidden_dim, heads=CONFIG["attention_heads"], concat=False)
# 任务头
self.syndrome_head = nn.Sequential(nn.Dropout(CONFIG["dropout"]), nn.Linear(hidden_dim, num_syndrome))
self.drug_head = nn.Sequential(nn.Dropout(CONFIG["dropout"]), nn.Linear(hidden_dim, num_drug))
# 损失函数
self.syndrome_loss = nn.CrossEntropyLoss()
self.drug_loss = nn.BCEWithLogitsLoss()
def forward(self, graph_data):
x, edge_index, adj = graph_data.x, graph_data.edge_index, graph_data.adj
# 特征增强
x_enhanced = self.feat_enhance(x)
# 图卷积
x1 = self.gcn1(x_enhanced, edge_index)
x2 = self.gcn2(x1, edge_index)
x3 = self.gcn3(x2, edge_index)
# 任务输出
syndrome_logits = self.syndrome_head(x3)
drug_logits = self.drug_head(x3)
return syndrome_logits, drug_logits
def compute_loss(self, syndrome_logits, drug_logits, y_s, y_d):
loss_s = self.syndrome_loss(syndrome_logits, y_s)
loss_d = self.drug_loss(drug_logits, y_d.float())
total_loss = loss_s + CONFIG["reg_coeff"] * loss_d # 正则化加权
return total_loss, loss_s, loss_d
================================= 7. 训练与评估模块 =================================
def train_model(model, train_loader, val_loader, optimizer, epochs=CONFIG["epochs"]):
model.train()
best_val_f1 = 0.0
for epoch in range(epochs):
total_loss = 0.0
for data in train_loader:
optimizer.zero_grad()
s_logits, dlogits = model(data)
loss, , _ = model.compute_loss(s_logits, d_logits, data.y_s, data.y_d)
loss.backward()
optimizer.step()
total_loss += loss.item()
# 验证集评估
val_metrics = evaluate_model(model, val_loader)
if val_metrics["syndrome_f1"] > best_val_f1:
best_val_f1 = val_metrics["syndrome_f1"]
torch.save(model.state_dict(), f"best_model_{CONFIG['disease_type']}.pth")
print(f"Epoch {epoch+1}: Loss={total_loss/len(train_loader):.4f}, Val F1={best_val_f1:.4f}")
def evaluate_model(model, test_loader):
"""计算证候分类+药物推荐核心指标"""
model.eval()
metrics = {"syndrome_ap": 0.0, "drug_micro_f1": 0.0, "hamming_loss": 0.0}
with torch.no_grad():
for data in test_loader:
s_logits, d_logits = model(data)
计算AP、F1、Hamming Loss等(调用评估函数)
metrics["syndrome_ap"] += compute_ap(s_logits, data.y_s)
metrics["drug_micro_f1"] += compute_micro_f1(d_logits, data.y_d)
metrics["hamming_loss"] += compute_hamming_loss(d_logits, data.y_d)
# 平均指标
for key in metrics:
metrics[key] /= len(test_loader)
return metrics
================================= 8. 主函数(推演入口) =================================
def main(raw_data, entity_dict, num_syndrome, num_drug):
1. 数据预处理
X_splits, y_s_splits, y_d_splits = data_preprocessing(raw_data, entity_dict)
train_data = build_heterogeneous_graph(X_splits[0], CONFIG["relations"])
train_data.y_s = torch.tensor(y_s_splits[0], dtype=torch.long)
train_data.y_d = torch.tensor(y_d_splits[0], dtype=torch.long)
# 2. 构建数据加载器
train_loader = DataLoader([train_data], batch_size=CONFIG["batch_size"], shuffle=True)
# 3. 初始化模型与优化器
input_dim = X_splits[0].shape[1]
model = FEMTL_DR(input_dim, CONFIG["hidden_dim"], num_syndrome, num_drug)
optimizer = torch.optim.Adam(model.parameters(), lr=CONFIG["lr"])
# 4. 训练与评估
train_model(model, train_loader, None, optimizer)
test_metrics = evaluate_model(model, DataLoader([train_data]))
print("最终测试指标:", test_metrics)
# 5. 输出模型与结果
return model, test_metrics
================================= 工具函数(可扩展) =================================
def standardize_entities(data, entity_dict): ... # 实体标准化
def multi_hot_encode(data, vocab): ... # Multi-hot编码
def cosine_similarity(X): ... # 余弦相似度计算
def get_relation_edges(rel, num_nodes): ... # 关系边生成
def compute_ap(logits, labels): ... # AP计算
def compute_micro_f1(logits, labels): ... # Micro F1计算
def compute_hamming_loss(logits, labels): ... # Hamming Loss计算
三、框架与伪代码核心推演逻辑
1. 无限扩展支撑:通过 CONFIG 字典、占位符(如 {具体病种} )、可替换模块(特征增强模块/编码策略),支持切换病种、实体类型、技术路径;
2. 专业对齐:严格复刻论文核心逻辑(混合编码、State-Space Transformer、TransformerConv多任务框架),同时预留扩展接口;
3. 工程化适配:伪代码遵循PyTorch/PyG规范,可直接替换真实数据与工具函数实现落地。
需要我基于这个模板,针对某一具体病种(如糖尿病/高血压)生成完整可运行代码吗?只需你提供病种对应的实体词典(证候/中药/性味列表)即可快速适配。
python
洛书九宫格数据结构(融合易经卦象、能量值、量子状态)
class LuoshuMatrix:
def init(self):
self.grid = [ # 九宫格:[宫位索引, 洛书数, 卦象, 能量值(0-100), 量子状态(叠加态/坍缩态), 奇门元素]
[0, 4, "巽卦", 68.2, "叠加态(☴+☳)", "休门+木属性"],
[1, 9, "离卦", 82.5, "坍缩态(☲)", "景门+火属性"],
[2, 2, "坤卦", 45.7, "叠加态(☷+☵)", "死门+土属性"],
[3, 3, "震卦", 71.3, "坍缩态(☳)", "伤门+木属性"],
[4, 5, "中宫", 50.0, "叠加态(无极)", "中枢+土属性"],
[5, 7, "兑卦", 58.9, "坍缩态(☱)", "惊门+金属性"],
[6, 8, "艮卦", 39.4, "叠加态(☶+☴)", "生门+土属性"],
[7, 1, "坎卦", 63.6, "坍缩态(☵)", "开门+水属性"],
[8, 6, "乾卦", 77.8, "叠加态(☰+☱)", "杜门+金属性"]
]
self.quantum_entanglement = 0.73 # 量子纠缠度(影响多宫位联动权重)
self.tcm_mapping = {"气": self.grid[4][3], "血": self.grid[7][3], "津液": self.grid[1][3]} # 中医核心概念映射
TCM-3CEval 三维评估数据结构
class TCM3CEval:
def init(self):
self.certification = 0.0 # 证型匹配度(与中医辨证库的余弦相似度)
self.chi = 0.0 # 能量平衡度(洛书九宫能量标准差倒数)
self.curative = 0.0 # 疗效预测度(基于历史医案的MLP输出)
self.decision_quadrant = "" # 神鬼真假四象限分类(真/假/神/鬼)
二、TCM-3CEval 控制器核心逻辑拆解(Training-Free 无监督流程)
- 核心流程模块
mermaid
graph TD
A[数据输入层] -->|中医症状向量/洛书初始排盘| B[映射层:Full Attention 权重分配]
B --> C[评估层:TCM-3CEval 三维计算]
C --> C1[证型匹配度:余弦相似度计算(症状向量 vs 辨证库向量)]
C --> C2[能量平衡度:1/std(九宫能量值) * 量子纠缠度]
C --> C3[疗效预测度:Training-Free GRPO 无监督拟合(历史医案分布映射)]
C --> D[决策层:XJMoE 混合专家模型融合]
D --> E[输出层:辨证结果+四象限分类+洛书排盘XML]
- Python 伪代码实现(核心控制器逻辑)
python
class JXWDController:
def init(self):
self.luoshu = LuoshuMatrix()
self.tcm_eval = TCM3CEval()
self.tcm_syndrome_lib = {} # 中医辨证库(预加载结构化证型向量)
def tcm_3c_eval(self, symptom_vector: list) -> dict:
# 1. 映射层:Full Attention 计算症状与九宫格关联权重
attention_weights = self.full_attention(symptom_vector, self.luoshu.grid)
# 2. 三维评估计算
# 2.1 证型匹配度(Certification)
self.tcm_eval.certification = self.cosine_similarity(
symptom_vector, self.tcm_syndrome_lib
)
# 2.2 能量平衡度(Chi)
grid_energies = [self.luoshu.grid[i][3] for i in range(9)]
self.tcm_eval.chi = 1 / (np.std(grid_energies) + 1e-6) * self.luoshu.quantum_entanglement
# 2.3 疗效预测度(Curative)
self.tcm_eval.curative = self.training_free_grpo(grid_energies, symptom_vector)
# 3. 四象限分类(神鬼真假)
self.tcm_eval.decision_quadrant = self.god_ghost_quadrant(
self.tcm_eval.certification, self.tcm_eval.chi, self.tcm_eval.curative
)
# 4. 输出结构化结果
return {
"luoshu_matrix": self.luoshu.grid,
"tcm_3c_scores": {
"certification": round(self.tcm_eval.certification, 3),
"chi": round(self.tcm_eval.chi, 3),
"curative": round(self.tcm_eval.curative, 3)
},
"decision_quadrant": self.tcm_eval.decision_quadrant,
"xml_output": self.generate_xml()
}
# 辅助函数:神鬼真假四象限分类
def god_ghost_quadrant(self, c: float, chi: float, cur: float) -> str:
if c > 0.8 and chi > 0.7: return "真"
elif c < 0.5 and chi < 0.5: return "假"
elif c > 0.8 and chi < 0.5: return "神"
else: return "鬼"
# 辅助函数:生成XML格式排盘结果
def generate_xml(self) -> str:
xml_template = f"""
<jxwd_luoshu_pan>
<九宫格>
{''.join([f'<宫位 index="{i}" 洛书数="{g[1]}" 卦象="{g[2]}" 能量值="{g[3]}" 量子状态="{g[4]}" 奇门元素="{g[5]}"/>'
for i, g in enumerate(self.luoshu.grid)])}
</九宫格>
<TCM-3CEval>
<证型匹配度>{self.tcm_eval.certification:.3f}</证型匹配度>
<能量平衡度>{self.tcm_eval.chi:.3f}</能量平衡度>
<疗效预测度>{self.tcm_eval.curative:.3f}</疗效预测度>
<四象限分类>{self.tcm_eval.decision_quadrant}</四象限分类>
</TCM-3CEval>
</jxwd_luoshu_pan>
"""
return xml_template
三、系统化框架层级(JXWDAI 2.0 核心架构)
层级 核心组件 功能描述
数据层 症状向量库、中医辨证库、洛书基础库 结构化存储输入数据与参考数据
映射层 Full Attention、量子纠缠模块 建立症状与洛书九宫/中医概念的关联映射
评估层 TCM-3CEval 三维计算、GRPO 拟合 无监督计算辨证核心指标
决策层 XJMoE/MoD 混合专家模型 融合多维度结果,输出辨证结论
输出层 XML/JSON 格式化模块 生成可计算的结构化排盘与辨证报告
需要我帮你扩展 TCM-3CEval 的三维评估指标库(补充具体中医证型向量和能量计算系数),或者生成完整的 XML 排盘模板文件吗?
【镜心悟道AI】基于对比分析的模型优化与迁移学习
一、XML数据库数据集(完整洛书矩阵结构化存储)
xml
<JXWDAI_TCM_Case ID="_TCM_Case ID="LiCongfu_JingBing_001" Version="2.0" System="JXWDAIYIB-QD-PDTM-JXWDYYXSD-ABNS-TCM-PCCMM-QE">
陶某某
Female
7
李聪甫医案.湖南科学技术出版社,1979:176
痉病阳明腑实+热极动风+热闭心包
角弓反张
两手拘急
目闭不开
口噤
牙关紧闭
|巽☴⟩⊗|肝风内动⟩
昏迷不醒
神明内闭
发热数日
小便短赤
|离☲⟩⊗|热闭心包⟩
腹满拒按
二便秘涩
手压腹反张更甚
燥屎内结
|坤☷⟩⊗|阳明腑实⟩
扰动不安
呻吟
|震☳⟩⊗|热扰神明⟩
手厥阴心包经
三焦脑髓神明
|中☯⟩⊗|痉病核心⟩
三焦元中控(上焦/中焦/下焦)/脑/督脉
痉病核心
角弓反张
神明内闭
陶某某
Female
7
李聪甫医案.湖南科学技术出版社,197="S017">呼吸急促
肺气上逆
痉病阳明腑实+热极动风+热闭心包
大便秘涩
燥屎内结
|兑☱⟩⊗|肺热叶焦⟩
trend="↓↓↓" description="阴气非常强盛"/>
⊙" description="阴气极阴"/>
睡不安卧
"/>
阴亏
津液不足
口渴甚
Symbol notation="→☯←" description="阴阳稳态"/>
2.0" code="S009">小便短赤
津液亏耗
|坎☵⟩⊗|阴亏阳亢⟩
" code="S025">四肢厥冷
<
角弓反张
两手拘急
<表">
目闭不开
">发育异常
肾精亏口噤
牙关紧闭
|干☰⟩⊗|命火亢旺⟩ 督脉/冲任带脉
<
|巽☴⟩⊗|肝风State>
φ" status="亢旺"/>
∂(君火)/∂t = -β * 大承气汤泻下强度 + γ * 滋阴药生津速率
∂(相火)/∂t = -ε * 清热药强度 + ζ * 和解药调和速率
∂(命火)/∂t = -η * 引火归元药强度 + θ * 阴阳平衡恢复0φⁿ" level="+++⊕" trend=" 君火 + 相火 + 命火 = 24.8φ (痉病状态)
↑↑↑⊕" range
="10"/>
离宫执行QuantumCooling(强度=0.9, 栀子5g)
中宫增强QuantumHarmony(比例=1:3.618)
乾宫执行QuantumModeration(方法='引火归元', 药物=肉桂2g+地黄10g)
坎宫增强QuantumEnrichment(系数=0.8, 药物=麦冬10g+石斛006">昏迷不醒
神明内存阴">
发热数日
小便短赤
|离☲⟩⊗|热闭心包⟩
黄芩" dosage="5g" efficacy="清热燥湿" targetPalace="2,9" quantumEffect="平衡土火能量"/>
腹满拒按
二便秘涩
<凉血" targetPalace="Energy value="8.0φⁿ" level="+++" trend="↑↑↑" range="8-10"/>
手压腹反9,1" quantumEffect="滋阴降火"/>
燥屎内结
<="平衡中宫能量"/>⟩⊗|阳明腑实⟩
="足太阴脾经" secondary="足阳明胃经"/>
CM_Case>
```2">
呻吟
; // 作用宫位
string quantumEffect; // 量子效应描述
};
struct Formula {
string id; // 方剂ID
string name; // 方剂名称
string stage; // 诊疗阶段
string effect; // 方剂功效
|震☳⟩⊗|热扰神明⟩
手厥阴心包经
> zangfuSymptoms; // 脏腑-症状映射
Energy zangfuEnergy[2];//ace>
三焦脑阳各一个)
string quantumState; // 量子状态
vector meridians; // 经络
string operationType; // 量子操作类型
string operationMethod;// 操作方法>
痉病核心
角弓反张
神明内闭
= 7.2 && energyValue < 8) return "++";
else if (energyValue >= 6.5 && energyValue < 7.2) return "+";
else if (energyValue == 10) return "+++⊕";
else return "";
"/>
= 5.8 && energyValue <= 6☉⚡"/>
= 0 && energyValue < 5) return "---";
else if (energyValue == 0) return "---⊙";
else return "";
}
// 私有工具函数:三焦火金肺" location="右手 calculateJunHuoRate(double daChengQiIntensity, double ziYinRate) {
const double beta = 0.8; // 大承气汤泻下系数
const double gamma = 0.6; // 滋阴药生津系数
return -beta * daChengQi">
呼吸急促
肺气上逆
大便秘涩
燥屎内结
|兑☱⟩⊗|肺热叶焦⟩
// 解析方剂数据
prescriptions = xmlParser.parsePrescriptionData();
cout << "病例数据加载成功!" << endl;
return true;
}
//九宫 -->
推理(基于能量值和症状)
map diagnoseSyndrome() {
map syndromeResult;
// 1. 识别核心病位( 8.0 || palace.zangfuEnergy[1].value > 8.0) {
element="山" mirrorSymbol="䷝" diseaseState="相火内扰">
烦躁易怒
睡不安卧
|艮☶⟩⊗|相火内扰⟩
手少阳三焦经.diseaseState + "), ";
}
}
syndromeResult["核心病位"] = corePalaces.substr(0, corePalaces.size()-2
["三焦火状态"] = fireStatus.substr(0, fireStatus.size()-2);
津液不足和量子操作)
Formula matchFormula(string syndrome) {
// 1
. 初诊方剂匹配(急下存阴需求)
if (syndrome.find("阳明腑实") != string::npos && syndrome.find("热闭心包") != string::npos) {
for 口渴甚
) {
if (formula.stage == "初诊") return formula;
}
}
// 2. 复诊方剂匹配(清热生津需求)
else if (syndrome.find("阴亏") != string::2.0" code="S009">小便短赤
津液亏耗
|坎☵⟩⊗|阴亏阳亢⟩
simulateEnergyBalance(Formula formula) {
map energyChange;
double daChengQiIntensity = 0.0;
double ziYinRate = 0.0;
double qingReIntensity = 0.0;
// 计算药物作用强度
for (auto& herb : formula.herbs) {
if (herb.name == "锦纹黄" || herb.name == "玄明粉") {
daChengQiIntensity +=足少阴肾经" secondary="足太阳膀胱经"/>
< 计算三焦火能量变化率
for (auto& fire : tripleBurnerFires) {
if (fire.fireType ==EmotionalFactor intensity="7 double rate = calculateJun.0" duration="3" type="恐" symbol="∈⚡"/>
四肢厥冷
rate = calculateMingHuo
发育异常 energyChange) {
double junHuoAfter = energyChange["君火调整后值"];
double xiangH>
肾精亏
|干☰⟩⊗|命火亢旺⟩
督脉/冲任带脉
= 7="生命根基" idealEnergy="7.5φ" currentEnergy="8.0φ" status="亢旺"/>
∂(君火)/∂t = -β * 大承气汤泻下强度 + γ * 滋阴药生津速率= 6.3 && xiangHuoEquation>
∂(相火)/∂t = -ε * 清热药强度 + ζ * 和解药调和速率
∂(命火)/∂ing_001.xml");
// 1. 辨证推理
auto syndromeResult = tcmBrain.diagnoseSyndrome();
cout << "t = -η * 引火归元药强度 + θ * 阴阳平衡恢复速率
君火 + 相火 + 命火 = 24 << endl;
for (auto& pair : syndromeResult) {
cout << pair.first << ": " << pair.second << endl;
}
// 2. 方剂匹配
Formula matchedFormula = tcmBrain.matchFormula(syndromeResult["辨证结论"]);
cout << "n=== 匹配方剂状态)
离宫执行 ===" << endl;
cout << "方剂名称:" << matchedFormula.name << endl;
cout << "诊疗阶段:" << matchedFormula.stage << endl;
cout << "组成药物:";
QuantumCooling(强度=0.9, 药物=黄连3g+栀子5g) for (auto& herb : matchedFormula.herbs) {
cout << herb.name << herb.dosageA002">中宫增强QuantumHarmony(比例=1:3.618)
乾宫执行QuantumModeration(方法 }
cout << endl;
// 3. 能量平衡模拟
auto energyChange =='引火归元', 药物=肉桂2g+地黄10g)
坎宫增强QuantumEn tcmBrain.simulateEnergyBalance(matchedFormula);
cout << "n=== 能量平衡模拟 ==richment(系数=0.8, 药物=麦冬10g+石斛10g)
=" << endl;
cout << "君火调整后:" << energyChange["君火调整后值
<"] << "φ" << endl;
cout << "相火调整后:" << energyChange["相火调整后值"] << "φ" << endl;
cout << "命火调整后:" << energyChange["命火调整Herb name="炒枳实" dosage="5g" efficacy="破气消积" targetPalace="2" quantumEffect="降低土元素能量值"/>
二、C++系统框架结构(核心IC_SYMBOLS = {
"→": "阴阳乾坤平", "↑": "阳升", "↓": "阴降", "↖↘↙↗": "气机内外流动",
"⊕※": "
cpp
#include
#include
#include
评论 (0)