Matplotlib散点图添加Pareto front(帕累托前沿)显示异常问题求解
错误原因排查
- 帕累托点识别逻辑错误:
identify_pareto函数的最优判断条件写反,比如你要最小化两个目标却写了最大化的判断逻辑,导致最终只筛选到1-2个有效帕累托点,连线后自然只有极短的线段 - 排序逻辑错误:筛选到帕累托点后,只按第一维(x轴)做升序排序,没有对应匹配第二维(y轴)的顺序,或是排序后错误切片只取了部分点用于绘图
- 绘图参数错误:调用
plot绘制前沿线时,误将单个点的坐标传入,或是线宽、颜色透明度设置异常导致线不可见
修复步骤
- 先修正
identify_pareto函数的判断逻辑,以最常见的两个目标均最小化的场景为例,正确的识别逻辑如下:
import numpy as np def identify_pareto(scores): # scores是形状为(n,2)的numpy数组,每行是一个样本的两个目标值 population_size = scores.shape[0] pareto_front = np.ones(population_size, dtype=bool) for i in range(population_size): for j in range(population_size): # 判断j是否支配i:j的两个目标都小于等于i,且至少一个严格小于 if all(scores[j] <= scores[i]) and any(scores[j] < scores[i]): pareto_front[i] = False break return scores[pareto_front]
- 对返回的帕累托点做正确排序:按第一维目标升序排序,对应第二维目标会自动呈降序排列,符合最小化双目标的帕累托前沿形态
pareto_points = identify_pareto(你的15组二维数据) # 按x轴(第一列)升序排序 sorted_pareto = pareto_points[np.argsort(pareto_points[:, 0])]
- 绘图时传入完整的排序后点坐标,设置合理的线宽:
import matplotlib.pyplot as plt # 先画原始散点 plt.scatter(你的数据[:,0], 你的数据[:,1], c='blue', label='原始样本') # 画帕累托前沿线+帕累托点标记 plt.plot(sorted_pareto[:,0], sorted_pareto[:,1], c='red', linewidth=2, marker='o', label='帕累托前沿') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Reut
相关产品推荐
相关产品推荐

