# 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}")