# 5. 按key筛选前5个权重最大的模型,归一化权重后预测
predictions = {key: np.zeros((batch_size, 1)) for key in loaded_models.keys()}
for key, models in loaded_models.items():
    # 收集当前key下所有模型及其权重
    model_weight_list = []
    for model in models:
        base_name = model['name'].replace(f'#{key}', '')
        model_weight = name_to_weight[base_name]  # 获取该模型的权重(标量)
        model_weight_list.append((model, model_weight))  # 存储(模型, 权重)
    
    # 按权重降序排序,取前5个模型
    top5_models = sorted(model_weight_list, key=lambda x: x[1], reverse=True)[:5]
    
    # 提取top5模型的权重,进行归一化(确保权重和为1)
    top5_weights = np.array([weight for _, weight in top5_models])
    # 防止所有权重都为0导致除零错误
    if np.sum(top5_weights) > 0:
        normalized_weights = top5_weights / np.sum(top5_weights)
    else:
        # 若所有权重都为0,赋予均等权重
        normalized_weights = np.ones(len(top5_models)) / len(top5_models)
    
    # 用归一化后的权重进行预测和累加
    for (model, _), norm_weight in zip(top5_models, normalized_weights):
        # 批量预测(一次处理整个批次)
        batch_preds = model['model'].predict(diff_x).reshape(-1, 1)  # (batch_size, 1)
        print(f"模型 {model['name']} - 原始权重: {_:.6f}, 归一化权重: {norm_weight:.6f}")
        print(f"预测结果示例: {batch_preds[:3].flatten()}")
        
        # 应用归一化权重并累加
        predictions[key] += batch_preds * norm_weight  # norm_weight为归一化后的权重

# 可选:打印最终预测结果的统计信息
for key, pred in predictions.items():
    print(f"\n{key} 最终预测结果 - 均值: {np.mean(pred):.6f}, 标准差: {np.std(pred):.6f}")