You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从散点图中提取最优收益-风险值对的高效方法

提取高收益低风险的最优组合(帕累托前沿)

问题分析

你需要从(收益,风险)数据对中筛选出帕累托最优的点:不存在其他点同时满足「收益更高且风险更低」,或「收益相同但风险更低」,或「风险相同但收益更高」。这类点构成了所有可选组合中的顶级集合。

高效解决方案(基于Numpy矢量化操作)

利用Numpy的排序和累积计算能力,替代低效的Python循环,适合处理数千级别的数据量:

import numpy as np

# 原始数据:[收益, 风险]
cloud = np.array([[1,2],[4,3],[5.5,2.3],[4,2],[3,3],[.9,1.9],[4,3],[4,3.2],[3,2.2],[2,2.6]])

# 1. 排序:先按风险升序,风险相同时按收益降序排列
# 这样能保证风险从小到大遍历,同时同风险下只保留最高收益的点
sorted_cloud = cloud[np.lexsort((-cloud[:, 0], cloud[:, 1]))]

# 2. 计算累积最大收益:遍历排序后的数组,记录到当前位置为止的最高收益
cum_max_reward = np.maximum.accumulate(sorted_cloud[:, 0])

# 3. 筛选有效点:仅保留收益等于当前累积最大值的点(即比之前所有点收益更高的点)
frontier = sorted_cloud[sorted_cloud[:, 0] == cum_max_reward]

# 4. 去重:移除重复的组合(可选,根据你的数据情况决定)
frontier = np.unique(frontier, axis=0)

print(frontier)

输出结果

运行后得到的有效组合为:

[[0.9  1.9 ]
 [4.   2.  ]
 [5.5  2.3 ]]

(注:你预期结果中的[.9, .9]应为笔误,对应原始数据中的[.9, 1.9])

原理说明

  1. 排序逻辑:按风险升序排列后,我们只需要关注收益的提升——因为风险更小的点如果收益更低,就会被后续风险稍高但收益更高的点覆盖;同风险下保留最高收益,避免无效的重复点。
  2. 累积最大值筛选:通过np.maximum.accumulate快速计算到每个位置的最高收益,只有收益超过之前所有值的点,才是无法被其他点替代的最优组合。
  3. 效率优势:Numpy的操作基于底层C实现,比Python循环快一个数量级以上,处理数千条数据毫无压力。

可选调整

如果希望最终结果按收益降序排列,可添加一行排序代码:

# 按收益从高到低排序前沿点
frontier_sorted = frontier[np.argsort(-frontier[:, 0])]

内容的提问来源于stack exchange,提问作者tibibou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:39:40