为何参考点取极值时归一化超体积(S metric)计算结果异常?
为何此场景下归一化超体积结果异常?
问题背景
帕累托前沿包含两个点(415, 110929)和(78, 258337),参考点设置为[max(X)+1, max(Y)+1]。
计算代码
import pandas as pd import pygmo as pg import numpy as np X = [415, 78] Y = [110929, 258337] df = pd.DataFrame(data=zip(X, Y)) ref_point = [max(X)+1, max(Y)+1] data = df.to_numpy() hyp = pg.hypervolume(data) print(hyp.compute(ref_point)) hv_normalised = hyp.compute(ref_point) / np.prod(ref_point) print(hv_normalised)
预期与实际结果
我推导的结果:此场景下归一化超体积应约为0.125(支配区域约为矩形(258337-0)(415-0)的1/8,支配区域面积约为(258337-110929)(415-78)/2,对应超体积为0.125)。
但实际计算得到的归一化超体积为0.0001!
参考资料
超体积的更多详情可参考PyGMO官方文档及以下论文:
Zitzler, Eckart, and Simon Künzli. "多目标搜索中基于指标的选择",并行问题求解国际会议,Springer,柏林、海德堡,2004。
问题原因分析
- 目标方向不匹配:PyGMO的超体积计算默认以最小化目标为前提,但你的推导是基于最大化目标的逻辑。两者的支配区域计算方向完全相反:PyGMO计算的是参考点被帕累托点支配的区域,而你推导的是帕累托点支配原点的区域。
- 参考点与归一化基准错误:你推导时以原点为下界、目标最大值为上界的矩形作为基准,但代码中用
max(X)+1, max(Y)+1作为参考点,且归一化基准是该参考点的乘积,和你推导的基准数值差距极大,直接导致归一化结果偏差。
修正方案
如果你的目标是最大化X和Y,需将目标值取反转为PyGMO默认的最小化问题,同时调整参考点和归一化基准:
import pandas as pd import pygmo as pg import numpy as np X = [415, 78] Y = [110929, 258337] # 取反转换为最小化目标(原目标越大,取反后越小) data = np.array([[-x, -y] for x, y in zip(X, Y)]) # 参考点对应原目标的最小下界(取反后为[0,0],即原目标的0值) ref_point = [0, 0] hyp = pg.hypervolume(data) hv = hyp.compute(ref_point) # 归一化基准用原目标最大值的乘积,和你的推导逻辑一致 hv_normalised = hv / (max(X) * max(Y)) print(hv_normalised) # 结果接近预期的0.125
如果目标是最小化X和Y,那你的推导逻辑本身错误,此时代码计算的结果是正确的:两个帕累托点都非常接近参考点(max(X)+1, max(Y)+1),因此超体积占参考点乘积的比例极低,结果约为0.0001是合理的。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

