【函数讲解】botorch中的函数 is_non_dominated():用于计算非支配(non-dominated)前沿

默认求最大的Pareto前沿

python 复制代码
        # 获取训练目标值,计算Pareto前沿(非支配解集合),然后从样本中提取出Pareto最优解。
        train_obj = self.samples[1]
        pareto_mask = is_non_dominated(train_obj)
        pareto_y = train_obj[pareto_mask]

源码

这里用到了一个函数 is_non_dominated(),来看下该函数的源码:

python 复制代码
from __future__ import annotations

import torch
from torch import Tensor


def is_non_dominated(Y: Tensor, deduplicate: bool = True) -> Tensor:
    r"""Computes the non-dominated front.

    Note: this assumes maximization.

    Args:
        输入:张量 Y,其维度为 (batch_shape) x n x m,这里 n 代表样本数量,m 代表每个样本的目标数量。,其中括号括住的batch_shape意思是可选,可以有这个维度或者没有
        Y: A `(batch_shape) x n x m`-dim tensor of outcomes.
        deduplicate: A boolean indicating whether to only return unique points on the pareto frontier.

    Returns:
        返回:布尔张量,指示每个样本是否是非支配点
        A `(batch_shape) x n`-dim boolean tensor indicating whether each point is non-dominated.
    """
    Y1 = Y.unsqueeze(-3)
    Y2 = Y.unsqueeze(-2)
    dominates = (Y1 >= Y2).all(dim=-1) & (Y1 > Y2).any(dim=-1)
    nd_mask = ~(dominates.any(dim=-1))
    if deduplicate:
        # remove duplicates
        # find index of first occurrence of each unique element
        indices = (Y1 == Y2).all(dim=-1).long().argmax(dim=-1)
        keep = torch.zeros_like(nd_mask)
        keep.scatter_(dim=-1, index=indices, value=1.0)
        return nd_mask & keep
    return nd_mask

示例:

有一组解,每个解有两个目标值,找出这组解中的非支配解:

python 复制代码
import torch
from botorch.utils.multi_objective import is_non_dominated

# 假设有5个解,每个解有2个目标
Y = torch.tensor([
    [0.5, 0.7],
    [0.6, 0.6],
    [0.8, 0.3],
    [0.4, 0.9],
    [0.7, 0.5]
])

# 调用 is_non_dominated 函数
non_dominated_mask = is_non_dominated(Y)

# 打印非支配解
print("Non-dominated solutions:", Y[non_dominated_mask])

实例:

这里就是先拿到所有的目标值,然后计算哪些是Pareto(True或者False),最后再原始数据中选出所有True的数据

python 复制代码
        # 获取训练目标值,计算Pareto前沿(非支配解集合),然后从样本中提取出Pareto最优解。
        train_obj = self.samples[1]
        pareto_mask = is_non_dominated(train_obj)
        pareto_y = train_obj[pareto_mask]
相关推荐
笑容掩饰我的失落5 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
syyjhchou6 小时前
自己搭企业内部中转站,怎么让请求更容易命中缓存
人工智能·后端·语言模型·aigc
Pniubi6 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
张然Adolf6 小时前
人工智能电力系统应用新手实战指南
人工智能
高洁016 小时前
数据同化与动态状态估计:让孪生持续贴合现实
人工智能·python·深度学习·transformer·迁移学习
feasibility.6 小时前
一物降一物?AI逆向没有终局:REA拆App,BLA设套,LASIK清场
人工智能·爬虫·github·逆向·skill·rea
꧁细听勿语情꧂6 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
IT古董7 小时前
AI 资讯日报 | 2026年10月25日:Kimi K3.1 Pro开源逼近前沿,OpenAI改离线训练,Claude合并Cowork,神经网络黑箱获新解,具身智能竞技场落幕
人工智能·神经网络·开源
小虎AI生活7 小时前
WorkBuddy + Loomy 实操教程:装开源技能反推任意图片提示词(附完整流程与提示词包)
人工智能·超级个体·一人公司·青玥ai
Rattenking7 小时前
OpenCV 轨迹栏操作和键盘响应操作
人工智能·opencv·计算机外设