1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| import numpy as np from dataclasses import dataclass
@dataclass class FatigueLevel: NORMAL = 0 MILD = 1 MODERATE = 2 SEVERE = 3
class FourLayerFatigueModel: """四层生理-行为融合疲劳分级""" def __init__(self): self.ecg_features = [ 'heart_rate', 'hrv_sdnn', 'hrv_rmssd', 'lf_hf_ratio', 'poincare_sd1', 'poincare_sd2' ] self.behavior_features = [ 'steering_reversals', 'lane_deviation', 'speed_var', 'brake_frequency', 'accelerator_jerk', 'reaction_time' ] self.correlation_matrix = None self.weights = np.ones(len(self.ecg_features) + len(self.behavior_features)) / 12 def compute_pearson(self, ecg_data, behavior_data): """计算Pearson相关系数矩阵""" n_ecg = len(self.ecg_features) n_beh = len(self.behavior_features) corr = np.zeros((n_ecg, n_beh)) for i in range(n_ecg): for j in range(n_beh): if len(ecg_data[i]) > 1 and len(behavior_data[j]) > 1: r = np.corrcoef(ecg_data[i], behavior_data[j])[0, 1] corr[i, j] = r if not np.isnan(r) else 0 self.correlation_matrix = corr return corr def adaptive_weights(self, corr_matrix): """基于Pearson相关性计算自适应权重""" abs_corr = np.abs(corr_matrix) feature_importance = abs_corr.mean(axis=1) total = np.concatenate([feature_importance, abs_corr.mean(axis=0)]) self.weights = total / (total.sum() + 1e-8) return self.weights def classify(self, ecg_values, behavior_values): """分级疲劳分类""" all_values = np.concatenate([ecg_values, behavior_values]) fatigue_score = np.dot(self.weights, all_values) if fatigue_score < 0.3: level = FatigueLevel.NORMAL elif fatigue_score < 0.5: level = FatigueLevel.MILD elif fatigue_score < 0.7: level = FatigueLevel.MODERATE else: level = FatigueLevel.SEVERE return { 'level': level, 'score': fatigue_score, 'ecg_contribution': np.dot(self.weights[:6], ecg_values), 'behavior_contribution': np.dot(self.weights[6:], behavior_values), }
if __name__ == "__main__": model = FourLayerFatigueModel() ecg = np.array([75, 45, 25, 1.8, 0.03, 0.05]) beh = np.array([15, 0.3, 5.2, 8, 0.8, 0.8]) ecg_norm = (ecg - np.mean(ecg)) / (np.std(ecg) + 1e-8) beh_norm = (beh - np.mean(beh)) / (np.std(beh) + 1e-8) result = model.classify(np.abs(ecg_norm), np.abs(beh_norm)) levels = {0: '正常', 1: '轻度疲劳', 2: '中度疲劳', 3: '重度疲劳'} print(f"疲劳分级: {levels[result['level']]}") print(f"疲劳分数: {result['score']:.3f}") print(f"ECG贡献: {result['ecg_contribution']:.3f}") print(f"行为贡献: {result['behavior_contribution']:.3f}")
|