注意
RAFT 中的向量搜索和聚类算法正在迁移到名为 cuVS 的新专用向量搜索库。在此迁移过程中,我们将继续支持 RAFT 中的向量搜索算法,但在 RAPIDS 24.06(6 月)版本之后将不再更新它们。我们计划在 RAPIDS 24.10(10 月)版本之前完成迁移,并在 24.12(12 月)版本中将其从 RAFT 中完全移除。
不放回抽样#
#include <raft/random/sample_without_replacement.cuh>
namespace raft::random
-
template<typename DataT, typename IdxT, typename WeightsVectorType, class OutIndexVectorType>
void sample_without_replacement(raft::resources const &handle, RngState &rng_state, raft::device_vector_view<const DataT, IdxT> in, WeightsVectorType &&weights_opt, raft::device_vector_view<DataT, IdxT> out, OutIndexVectorType &&outIdx_opt)# 对输入向量进行不放回抽样,可选地基于数组中每个元素的输入权重向量。
此实现基于 Kirill Mueller 的技术报告“加速加权不放回随机抽样” 中描述的
one-pass sampling
算法。如果没有提供输入权重向量,则将均匀抽样输入元素。否则,从输入向量中抽样的元素将始终按照使用指数分布计算的权重递增的顺序出现。因此,如果您对顺序有特定要求(例如,数组置换),则这可能不是正确的选择。
注意
请不要显式指定模板参数,因为编译器可以从参数中推导它们。
- 模板参数:
DataT – 输入数组
in
中每个元素的类型IdxT – 数组维度的类型;输出索引类型
WeightsVectorType – 权重数组
weights_opt
中每个元素的 std::optional<raft::device_vector_view<const weight_type, IdxT>> 类型OutIndexVectorType – 输出索引
outIdx_opt
的 std::optional<raft::device_vector_view<IdxT, IdxT>> 类型
- 参数:
handle – [in] 包含(除其他资源外)要运行 CUDA 流的 RAFT 句柄。
rng_state – [inout] 伪随机数生成器状态。
in – [in] 要抽样的输入向量。
weights_opt – [in] 可选的权重向量。如果未提供,将使用均匀抽样。
out – [out] 从输入向量中抽取的样本向量。
outIdx_opt – [out] 可选的,从输入数组中抽取的索引向量。
- 前置条件:
样本数量
out.extent(0)
小于或等于输入数量in.extent(0)
。- 前置条件:
权重数量
wts.extent(0)
等于输入数量in.extent(0)
。
-
template<typename ...Args, typename = std::enable_if_t<sizeof...(Args) == 5>>
void sample_without_replacement(Args... args)# sample_without_replacement
的重载,用于帮助编译器找到上述重载,以防用户为其中一个或两个可选参数传入std::nullopt
。有关
sample_without_replacement
的文档,请参见上文。
#include <raft/random/permute.cuh>
namespace raft::random
-
template<typename InputOutputValueType, typename IntType, typename IdxType, typename Layout>
void permute(raft::resources const &handle, raft::device_matrix_view<const InputOutputValueType, IdxType, Layout> in, std::optional<raft::device_vector_view<IntType, IdxType>> permsOut, std::optional<raft::device_matrix_view<InputOutputValueType, IdxType, Layout>> out)# 随机置换输入矩阵的行。
我们不支持原地置换,以便并行计算而无竞争条件。此函数适用于在机器学习算法中混洗输入数据集。
注意
这不是一个均匀置换生成器!它只生成所有可能随机置换中的一小部分。如果您的应用程序需要高质量的置换生成器,我们推荐 Knuth Shuffle。
- 模板参数:
InputOutputValueType – 输入矩阵每个元素的类型,以及输出矩阵(如果提供)每个元素的类型
IntType –
permsOut
中每个元素的整数类型IdxType – mdspan 参数范围的整数类型
Layout –
raft::row_major
或raft::col_major
- 参数:
handle – [in] 包含要运行 CUDA 流的 RAFT 句柄。
in – [in] 输入矩阵
permsOut – [out] 如果提供,则为置换的索引。
out – [out] 如果提供,则为输出矩阵,包含输入矩阵
in
的置换行。(仅在提供permsOut
时,不提供此参数才有意义。)
- 前置条件:
如果
permsOut.has_value()
为true
,则(*permsOut).extent(0) == in.extent(0)
为true
。- 前置条件:
如果
out.has_value()
为true
,则(*out).extents() == in.extents()
为true
。
-
template<typename InputOutputValueType, typename IdxType, typename Layout, typename PermsOutType, typename OutType>
void permute(raft::resources const &handle, raft::device_matrix_view<const InputOutputValueType, IdxType, Layout> in, PermsOutType &&permsOut, OutType &&out)# permute
的重载,如果用户为permsOut
和out
中的一个或两个传入std::nullopt
,此重载会编译成功。