注意

RAFT 中的向量搜索和聚类算法正在迁移到专用于向量搜索的新库 cuVS。在此迁移期间,我们将继续支持 RAFT 中的向量搜索算法,但在 RAPIDS 24.06(六月)版本之后将不再更新它们。我们计划在 RAPIDS 24.10(十月)版本之前完成迁移,并且它们将在 24.12(十二月)版本中完全从 RAFT 中移除。

数据生成#

make_blobs#

#include <raft/random/make_blobs.cuh>

namespace raft::random

template<typename DataT, typename IdxT, typename layout>
void make_blobs(raft::resources const &handle, raft::device_matrix_view<DataT, IdxT, layout> out, raft::device_vector_view<IdxT, IdxT> labels, IdxT n_clusters = 5, std::optional<raft::device_matrix_view<DataT, IdxT, layout>> centers = std::nullopt, std::optional<raft::device_vector_view<DataT, IdxT>> const cluster_std = std::nullopt, const DataT cluster_std_scalar = (DataT)1.0, bool shuffle = true, DataT center_box_min = (DataT)-10.0, DataT center_box_max = (DataT)10.0, uint64_t seed = 0ULL, GeneratorType type = GenPC)#

sklearn.datasets.make_blobs 的 GPU 等效实现。

模板参数:
  • DataT – 输出数据类型

  • IdxT – 索引算术类型

参数:
  • handle[in] 用于管理昂贵资源的 raft 句柄

  • out[out] 生成的数据 [在设备上] [维度 = n_rows x n_cols]

  • labels[out] 生成数据的标签 [在设备上] [长度 = n_rows]

  • n_clusters[in] 要生成的簇(或类别)数量

  • centers[in] 每个簇的中心,如果需要随机生成,则传入 nullptr [在设备上] [维度 = n_clusters x n_cols]

  • cluster_std[in] 每个簇中心的标准差,如果要从 cluster_std_scalar 读取,则传入 nullptr。[在设备上] [长度 = n_clusters]

  • cluster_std_scalar[in] 如果 ‘cluster_std’ 为 nullptr,则将其用作所有维度的标准差。

  • shuffle[in] 打乱生成的数据集和标签

  • center_box_min[in] 用于选择簇中心的框的最小值。仅当 ‘centers’ 为 nullptr 时有用。

  • center_box_max[in] 用于选择簇中心的框的最大值。仅当 ‘centers’ 为 nullptr 时有用。

  • seed[in] RNG 的种子

  • type[in] RNG 类型

make_regression#

#include <raft/random/make_regression.cuh>

namespace raft::random

template<typename DataT, typename IdxT>
void make_regression(raft::resources const &handle, raft::device_matrix_view<DataT, IdxT, raft::row_major> out, raft::device_matrix_view<DataT, IdxT, raft::row_major> values, IdxT n_informative, std::optional<raft::device_matrix_view<DataT, IdxT, raft::row_major>> coef, DataT bias = DataT{}, IdxT effective_rank = static_cast<IdxT>(-1), DataT tail_strength = DataT{0.5}, DataT noise = DataT{}, bool shuffle = true, uint64_t seed = 0ULL, GeneratorType type = GenPC)#

sklearn.datasets.make_regression 的 GPU 等效实现,文档参见:https://scikit-learn.cn/stable/modules/generated/sklearn.datasets.make_regression.html

模板参数:
  • DataT – 标量类型

  • IdxT – 索引类型

参数:
  • handle[in] RAFT 句柄

  • out[out] 行主序 (样本, 特征) 矩阵,用于存储问题数据

  • values[out] 行主序 (样本, 目标) 矩阵,用于存储回归问题的数值

  • n_informative[in] 有信息特征的数量(非零系数)

  • coef[out] 如果存在,一个行主序 (特征, 目标) 矩阵,用于存储生成回归问题数值所使用的系数

  • bias[in] 将添加到数值中的标量

  • effective_rank[in] 数据矩阵的近似秩(用于创建数据中的相关性)。-1 表示使用条件良好的数据。

  • tail_strength[in] 如果 effective_rank 不是 -1,则奇异值曲线的胖噪声尾部的相对重要性

  • noise[in] 应用于输出的高斯噪声的标准差

  • shuffle[in] 打乱样本和特征

  • seed[in] 随机数生成器的种子

  • type[in] 随机生成器类型

R-MAT 生成#

#include <raft/random/rmat_rectangular_generator.cuh>

namespace raft::random

template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_vector_view<const ProbT, IdxT> theta, raft::device_mdspan<IdxT, raft::extents<IdxT, raft::dynamic_extent, 2>, raft::row_major> out, raft::device_vector_view<IdxT, IdxT> out_src, raft::device_vector_view<IdxT, IdxT> out_dst, IdxT r_scale, IdxT c_scale)#

生成用于矩形邻接矩阵的二分 R-MAT 图。

此函数生成一个由(稀疏)邻接矩阵表示的随机图。如文献 [1] 中所述,为了生成连接,我们将邻接矩阵递归细分为四个大小相等的分区,并以不相等的概率在这些分区内分配边。概率由数字 [a, b, c, d] 描述。我们以概率 a 选择左上分区。选择的分区再次被细分为四个更小的分区,并重复此过程,直到我们达到单个元素(1 x 1 分区)。

我们可以在每次迭代中指定不同的概率分布。theta 数组存储了每个级别的概率值。

[1] “R-MAT: A Recursive Model for Graph Mining” Deepayan Chakrabarti, Yiping Zhan, Christos Faloutsos (2004) https://doi.org/10.1137/1.9781611972740.43

我们将 r_scale != c_scale 的情况称为“矩形邻接矩阵”情况(换句话说,生成二分图)。在这种情况下,当 depth >= r_scale 时,分布假定为

[theta[4 * depth] + theta[4 * depth + 2], theta[4 * depth + 1] + theta[4 * depth + 3]; 0, 0].

然后当 depth >= c_scale 时,分布假定为

[theta[4 * depth] + theta[4 * depth + 1], 0; theta[4 * depth + 2] + theta[4 * depth + 3], 0].

注意

这可能会生成重复的边和自环。调用者有责任相应地清理它们。

注意

这也只生成有向图。如果需要无向图,则预期调用者会执行单独的后处理步骤。

模板参数:
  • IdxT – 每个节点索引的类型

  • ProbT – 用于概率分布的数据类型(fp32 或 fp64)

参数:
  • handle[in] RAFT 句柄,包含用于调度工作的 CUDA 流

  • r[in] 随机生成器的底层状态。当需要多次调用此 API 以生成更大的图时,这尤其有用。在这种情况下,只需使用初始种子创建此对象一次,并在每次调用后继续传递相同的对象进行后续调用。

  • out[out] 生成的边列表 [在设备上],以结构体数组 (array-of-structs) 形式打包。在每一行中,第一个元素是源节点 ID,第二个元素是目标节点 ID。

  • out_src[out] 源节点 ID 列表 [在设备上]。

  • out_dst[out] 目标节点 ID 列表 [在设备上]。out_srcout_dst 一起构成了与 out 相同的输出数据的结构体数组 (struct-of-arrays) 表示。

  • theta[in] 数组 [在设备上],包含每个分辨率级别上每个象限的分布。theta = [a0, b0, c0, d0, a1, b1, c1, d1, …],其中 [a0, b0, c0, d0] 定义了最精细级别 (2x2) 的概率。数组中的最后四个元素描述了最粗略级别(矩阵大小 = [2^r_scale, 2^c_scale])的概率。由于这些是概率,每个 RMAT 级别的四个 [a_i, b_i, c_i, d_i] 值必须总和为一。[维度 = max(r_scale, c_scale) x 2 x 2]。

  • r_scale[in] 2^r_scale 表示源节点的数量

  • c_scale[in] 2^c_scale 表示目标节点的数量

前置条件:

out.extent(0) == 2 *out_src.extent(0)istrue @preout_src.extent(0) == out_dst.extent(0)istrue`

template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_vector_view<const ProbT, IdxT> theta, raft::device_vector_view<IdxT, IdxT> out_src, raft::device_vector_view<IdxT, IdxT> out_dst, IdxT r_scale, IdxT c_scale)#

rmat_rectangular_gen 的重载,仅生成结构体数组 (struct-of-arrays)(两个向量)输出表示。

此重载仅生成结构体数组 (struct-of-arrays)(两个向量)输出表示:包含源节点 ID 的输出向量 out_src 和包含目标节点 ID 的输出向量 out_dst

前置条件:

out_src.extent(0) == out_dst.extent(0)true

template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_mdspan<IdxT, raft::extents<IdxT, raft::dynamic_extent, 2>, raft::row_major> out, IdxT r_scale, IdxT c_scale)#

rmat_rectangular_gen 的重载,仅生成结构体数组 (array-of-structs)(一个向量)输出表示。

此重载仅生成结构体数组 (array-of-structs)(一个向量)输出表示:一个单独的输出向量 out,其中每行的第一个元素是源节点 ID,第二个元素是目标节点 ID。

template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_mdspan<IdxT, raft::extents<IdxT, raft::dynamic_extent, 2>, raft::row_major> out, raft::device_vector_view<IdxT, IdxT> out_src, raft::device_vector_view<IdxT, IdxT> out_dst, ProbT a, ProbT b, ProbT c, IdxT r_scale, IdxT c_scale)#

rmat_rectangular_gen 的重载,假定所有尺度上具有相同的 a, b, c, d 概率分布,并接受所有三个输出向量(out 采用结构体数组 (array-of-structs) 输出表示,out_srcout_dst 采用结构体数组 (struct-of-arrays) 输出表示)。

a, b, andc 有效地取代了上述重载的 theta 参数。

前置条件:

out.extent(0) == 2 *out_src.extent(0)istrue @preout_src.extent(0) == out_dst.extent(0)istrue`

template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_vector_view<IdxT, IdxT> out_src, raft::device_vector_view<IdxT, IdxT> out_dst, ProbT a, ProbT b, ProbT c, IdxT r_scale, IdxT c_scale)#

rmat_rectangular_gen 的重载,假定所有尺度上具有相同的 a, b, c, d 概率分布,并且只接受两个输出向量(结构体数组 (struct-of-arrays) 输出表示)。

a, b, andc 有效地取代了上述重载的 theta 参数。

前置条件:

out_src.extent(0) == out_dst.extent(0)true

template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(raft::resources const &handle, raft::random::RngState &r, raft::device_mdspan<IdxT, raft::extents<IdxT, raft::dynamic_extent, 2>, raft::row_major> out, ProbT a, ProbT b, ProbT c, IdxT r_scale, IdxT c_scale)#

rmat_rectangular_gen 的重载,假定所有尺度上具有相同的 a, b, c, d 概率分布,并且只接受一个输出向量(结构体数组 (array-of-structs) 输出表示)。

a, b, andc 有效地取代了上述重载的 theta 参数。

template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(IdxT *out, IdxT *out_src, IdxT *out_dst, const ProbT *theta, IdxT r_scale, IdxT c_scale, IdxT n_edges, cudaStream_t stream, raft::random::RngState &r)#

rmat_rectangular_gen 的遗留重载,接受原始数组而不是 mdspan。

模板参数:
  • IdxT – 每个节点索引的类型

  • ProbT – 用于概率分布的数据类型(fp32 或 fp64)

参数:
  • out[out] 生成的边列表 [在设备上] [维度 = n_edges x 2]。在每一行中,第一个元素是源节点 ID,第二个元素是目标节点 ID。如果不需要此输出,请传入 nullptr

  • out_src[out] 源节点 ID 列表 [在设备上] [长度 = n_edges]。如果不需要此输出,请传入 nullptr

  • out_dst[输出] 目标节点ID列表 [在设备上] [长度 = n_edges]。如果不需要此输出,则在其位置传递一个 nullptr

  • theta[输入] 在每个分辨率级别上每个象限的分布。由于这些是概率,RMAT 的每个级别对应的 2x2 矩阵之和必须为一。 [在设备上] [维度 = max(r_scale, c_scale) x 2 x 2]。当然,假定每组 2x2 数字的总和都为 1。

  • r_scale[in] 2^r_scale 表示源节点的数量

  • c_scale[in] 2^c_scale 表示目标节点的数量

  • n_edges[输入] 要生成的边的数量

  • stream[输入] 用于安排工作的 CUDA 流

  • r[in] 随机生成器的底层状态。当需要多次调用此 API 以生成更大的图时,这尤其有用。在这种情况下,只需使用初始种子创建此对象一次,并在每次调用后继续传递相同的对象进行后续调用。

template<typename IdxT, typename ProbT>
void rmat_rectangular_gen(IdxT *out, IdxT *out_src, IdxT *out_dst, ProbT a, ProbT b, ProbT c, IdxT r_scale, IdxT c_scale, IdxT n_edges, cudaStream_t stream, raft::random::RngState &r)#

rmat_rectangular_gen 的旧式重载,接受原始数组而非 mdspan。此重载假定在所有尺度上使用相同的 a, b, c, d 概率分布。