如何以参考Pareto前沿为基准将近似前沿归一化到0-1区间
问题分析
你之前的实现两次调用了fit_transform()方法,相当于分别拟合了两套独立的最值作为归一化基准,参考前沿和近似前沿的归一化尺度不统一,不符合多目标质量指标的计算要求。
实现方案
MinMaxScaler的fit()方法会记录传入数据集各维度的最大、最小值,后续所有数据集调用transform()时就会复用这套基准做归一化,不需要重复拟合。
完整实现代码如下:
import numpy as np from sklearn.preprocessing import MinMaxScaler # 原始数据定义 reference_front = np.array([[0.5, 2.0], [1, 1.0], [1.2, 0.833], [2.3, 0.435], [3, 0.333]]) approximation_front = np.array([[0.8, 2.5], [1.0, 2.0], [2.1, 0.952], [2.8, 0.714]]) # 仅用参考前沿拟合归一化基准 min_max_scaler = MinMaxScaler() min_max_scaler.fit(reference_front) # 用同一套基准归一化两类前沿 reference_front_norm = min_max_scaler.transform(reference_front) approximation_front_norm = min_max_scaler.transform(approximation_front) # 参考点归一化(修复原代码中参考点第二维度取值错误) reference_point_raw = [ max(approximation_front[:, 0]), max(approximation_front[:, 1]) ] reference_point_norm = min_max_scaler.transform(np.array(reference_point_raw).reshape(1, -1))[0]
注意事项
- 如果近似前沿中存在超出参考前沿最值范围的点,归一化后数值会超出[0,1]区间,属于符合指标计算的常规合理情况
- 若业务要求强制所有归一化结果必须落在[0,1]区间,可对近似前沿归一化结果添加裁剪逻辑:
approximation_front_norm = np.clip(approximation_front_norm, 0, 1)
内容的提问来源于stack exchange,提问作者vp_050
相关产品推荐
相关产品推荐

