PyTorch中多项分布中随机采样(multinomial)和张量范数(norm)函数使用详解

torch.multinomial 是 PyTorch 中用于从多项分布中随机采样的函数,常用于按照给定的概率分布从候选项中抽取若干个索引(如下采样点、选择候选项等)。


函数原型:

torch.multinomial(input, num_samples, replacement=False, *, generator=None, out=None) → Tensor

🔹 参数说明:

参数名说明
inputTensor,概率分布向量,shape 为 (n,) 或 (batch_size, n),必须为非负
num_samples要采样的样本数量
replacement是否放回抽样(True 表示可重复选取)

返回值:

  • 返回一个长整型 Tensor,表示按 input 概率分布采样得到的索引值。
  • shape 为 (num_samples,)(batch_size, num_samples)

示例 1:从概率分布中采样索引

import torch

probs = torch.tensor([0.1, 0.3, 0.6])  # 概率和为 1,不要求必须归一化,但必须非负
sample = torch.multinomial(probs, 2, replacement=False)
print(sample)

可能输出:

tensor([1, 2])  # 表示采样到了索引 1 和 2

示例 2:批量采样

batch_probs = torch.tensor([[0.2, 0.5, 0.3],
                            [0.1, 0.1, 0.8]])

samples = torch.multinomial(batch_probs, 2, replacement=True)
print(samples)

可能输出:

tensor([[1, 2],
        [2, 2]])

常见用途:

用途描述
点云 / 特征选择根据得分权重采样下一个子集(如图采样、NMS 替代)
数据增强 / 负样本采样按照某些权重选取负样本
图神经网络 / 图采样按节点度分布或图结构对节点采样
RL / 强化学习根据策略概率分布选择动作(如 policy sampling)

注意事项:

  • input 不必须是归一化的概率(即不要求总和为 1),但 必须是非负的实数
  • 如果 replacement=False,且 num_samples > input 中非零元素个数,将报错。

torch.norm 是 PyTorch 中用于计算张量范数(norm)的函数,它支持 各种范数类型(L1、L2、无穷范数、Frobenius 范数等),可以灵活指定维度、保持维度形状。


一、函数定义

torch.norm(input, p='fro', dim=None, keepdim=False, out=None, dtype=None) → Tensor
参数说明
input输入张量(Tensor)
p范数类型,常见如 'fro'、1、2、float(‘inf’) 等
dim指定在哪个维度上计算范数(可为 int 或 tuple)
keepdim是否保留计算后的维度(True/False)
dtype设置返回的精度,如 torch.float32
out可选,输出结果张量(in-place 操作)

二、常用范数类型说明(p 参数)

p类型定义 / 含义
'fro'Frobenius 范数(矩阵)√(sum(x[i,j]²)),默认值
2L2 范数Euclidean norm:√(x₁² + x₂² + …)
1L1 范数sum(x₁+x₂+ …)
float('inf')∞ 范数max(x₁,x₂, …)
-float('inf')-∞ 范数min(x₁,x₂, …)

三、示例代码

示例 1:向量的 L2 范数(欧几里得范数)

import torch

x = torch.tensor([3.0, 4.0])
norm = torch.norm(x, p=2)
print(norm)  # 输出: tensor(5.0000)

示例 2:矩阵 Frobenius 范数(默认)

A = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
frob = torch.norm(A)  # 等价于 torch.norm(A, p='fro')
print(frob)  # 输出: tensor(5.4772)

计算公式:

∥ A ∥ F = 1 2 + 2 2 + 3 2 + 4 2 = 30 ≈ 5.4772 \|A\|_F = \sqrt{1^2 + 2^2 + 3^2 + 4^2} = \sqrt{30} \approx 5.4772 AF=12+22+32+42 =30 5.4772


示例 3:对某一维计算 L1 范数

B = torch.tensor([[1.0, -2.0], [-3.0, 4.0]])
l1 = torch.norm(B, p=1, dim=1)
print(l1)  # 输出: tensor([3., 7.])

含义:
按行计算 L1 范数
行1: |1| + |−2| = 3
行2: |−3| + |4| = 7


示例 4:保留维度 keepdim=True

x = torch.tensor([[3.0, 4.0]])
l2 = torch.norm(x, p=2, dim=1, keepdim=True)
print(l2)  # 输出: tensor([[5.]])

保留维度,输出形状仍为 (1, 1)


示例 5:计算批次向量的 L2 范数

batch = torch.tensor([[3., 4.], [5., 12.]])  # shape: [2, 2]
norms = torch.norm(batch, p=2, dim=1)
print(norms)  # 输出: tensor([ 5., 13.])

四、常见注意事项

注意点说明
默认行为torch.norm(x) 默认执行 Frobenius 范数(适用于 2D)
对于向量建议明确 pdim防止错误推断维度
float('inf')-float('inf') 支持极大/极小范数
不支持高阶范数如 p=3你可以设置任意 p(实数)用于计算,但并不用于某些特殊范数名

五、总结表

用法示例含义
torch.norm(x)Frobenius norm(2D)
torch.norm(x, p=2)L2 范数
torch.norm(x, p=1, dim=1)每行 L1 范数
torch.norm(x, p=float('inf'))向量最大值(∞ 范数)
torch.norm(x, p=2, dim=0, keepdim=True)L2 范数 + 保留维度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云SLAM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值