注意

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

摘要统计#

协方差#

#include <raft/stats/cov.cuh>

namespace raft::stats

template<typename value_t, typename idx_t, typename layout_t>
void cov(raft::resources const &handle, raft::device_matrix_view<value_t, idx_t, layout_t> data, raft::device_vector_view<const value_t, idx_t> mu, raft::device_matrix_view<value_t, idx_t, layout_t> covar, bool sample, bool stable)#

计算输入矩阵的协方差。

假定对给定列执行均值运算。

注意

如果 stable=true,则输入数据在此函数返回后将被均值中心化!

模板参数:
  • value_t – 数据类型

  • idx_t – 索引类型

  • layout_t – 输入数据的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 输入矩阵(最后会进行均值中心化!)(长度 = nrows * ncols)

  • mu[in] 输入矩阵的均值向量 (长度 = ncols)

  • covar[out] 输出协方差矩阵 (长度 = ncols * ncols)

  • sample[in] 是否计算样本协方差。换句话说,分别对于 true 或 false,是使用 N-1 还是 N 进行归一化

  • stable[in] 是否运行较慢但数值稳定的版本

直方图#

#include <raft/stats/histogram.cuh>

namespace raft::stats

enum HistType#

支持的直方图实现类型。

enumerator HistTypeSmemBits1#

使用共享内存原子操作,但直方图bin为 1 位整数

enumerator HistTypeSmemBits2#

使用共享内存原子操作,但直方图bin为 2 位整数

enumerator HistTypeSmemBits4#

使用共享内存原子操作,但直方图bin为 4 位整数

enumerator HistTypeSmemBits8#

使用共享内存原子操作,但直方图bin为 1 字节整数

enumerator HistTypeSmemBits16#

使用共享内存原子操作,但直方图bin为 2 字节整数

enumerator HistTypeGmem#

仅使用全局原子操作

enumerator HistTypeSmem#

使用共享内存原子操作减少全局流量

enumerator HistTypeSmemMatchAny#

使用带 match_any intrinsic 的共享内存原子操作,进一步减少共享内存流量。这只能在 Volta 及更高架构上启用。如果尝试在旧架构上启用,它将回退到 HistTypeSmem

注意

仅当输入数据集在给定 warp 中有大量重复时才使用此方法,否则此算法可能比 HistTypeSmem 慢得多!

enumerator HistTypeSmemHash#

在共享内存中构建活动直方图bin的哈希表

enumerator HistTypeAuto#

在运行时决定给定输入的最佳算法

template<typename value_t, typename idx_t, typename binner_op = IdentityBinner<value_t, idx_t>>
void histogram(raft::resources const &handle, HistType type, raft::device_matrix_view<const value_t, idx_t, raft::col_major> data, raft::device_matrix_view<int, idx_t, raft::col_major> bins, binner_op binner = IdentityBinner<value_t, idx_t>())#

对输入数据执行直方图计算。它根据输入数据向量长度选择合适的加载大小。它还支持使用专门的基于 smem 的哈希技术处理大直方图bin的情况。

注意

binner_op 的签名是 int func(value_t, IdxT);

模板参数:
  • value_t – 输入数据类型

  • idx_t – 用于计算索引的数据类型

  • binner_op – 接受输入数据并计算其直方图bin索引的操作

参数:
  • handle[in] raft 句柄

  • type[in] 要选择的直方图实现类型

  • data[in] 输入数据(列主序)(长度 = nrows * ncols)

  • bins[out] 输出直方图bin(列主序)(长度 = nbins * ncols)

  • binner[in] 计算输入数据的直方图bin索引的操作

均值#

#include <raft/stats/mean.cuh>

namespace raft::stats

template<typename value_t, typename idx_t, typename layout_t>
void mean(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<value_t, idx_t> mu)#

计算输入矩阵的均值。

假定对给定列执行均值运算。

模板参数:
  • value_t – 数据类型

  • idx_t – 索引类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 输入矩阵

  • mu[out] 输出均值向量

template<typename value_t, typename idx_t, typename layout_t>
void mean(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<value_t, idx_t> mu, bool sample)#

计算输入矩阵的均值。

假定对给定列执行均值运算。注意:此调用已弃用,请使用不带 sample 参数的 mean 调用。

模板参数:
  • value_t – 数据类型

  • idx_t – 索引类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 输入矩阵

  • mu[out] 输出均值向量

  • sample[in] 是否计算样本均值。换句话说,分别对于 true 或 false,是使用 N-1 还是 N 进行归一化

均值中心化#

#include <raft/stats/mean_center.cuh>

namespace raft::stats

template<typename value_t, typename idx_t, typename layout_t>
void mean_center(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<const value_t, idx_t> mu, raft::device_matrix_view<value_t, idx_t, layout_t> out, bool bcast_along_rows)#

根据其均值对输入矩阵进行中心化。

模板参数:
  • value_t – 数据类型

  • idx_t – 索引类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 大小为 nrows * ncols 的输入矩阵

  • mu[in] 均值向量,如果 bcast_along_rows 为 true 则大小为 ncols,否则为 nrows

  • out[out] 输出的均值中心化矩阵

  • bcast_along_rows[in] 是否沿行或列广播向量

template<typename value_t, typename idx_t, typename layout_t>
void mean_add(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<const value_t, idx_t> mu, raft::device_matrix_view<value_t, idx_t, layout_t> out, bool bcast_along_rows)#

根据其均值对输入矩阵进行加法。

模板参数:
  • Type – 数据类型

  • idx_t – 索引类型

  • layout_t – 输入矩阵的布局类型。

  • TPB – 启动的 cuda 核函数的每块线程数

参数:
  • handle[in] raft 句柄

  • data[in] 大小为 nrows * ncols 的输入矩阵

  • mu[in] 均值向量,如果 bcast_along_rows 为 true 则大小为 ncols,否则为 nrows

  • out[out] 输出的均值中心化矩阵

  • bcast_along_rows[in] 是否沿行或列广播向量

均值方差#

#include <raft/stats/mean_var.cuh>

namespace raft::stats

template<typename value_t, typename idx_t, typename layout_t>
void meanvar(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<value_t, idx_t> mean, raft::device_vector_view<value_t, idx_t> var, bool sample)#

计算给定矩阵每列的均值和方差。

该操作在一次遍历中完成。当您需要同时计算均值和方差,或需要计算方差但没有均值时,请考虑使用它。它比依次运行 meanvars 要快近两倍,因为这三个核函数都是内存密集型的。

模板参数:
  • value_t – 数据类型

  • idx_t – 用于寻址的整数类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 大小为 [N, D] 的输入矩阵

  • mean[out] 大小为 D 的输出均值向量

  • var[out] 大小为 D 的输出方差向量

  • sample[in] 是否计算样本方差。换句话说,分别对于 true 或 false,是使用 N-1 还是 N 对方差进行归一化。

最小值/最大值#

#include <raft/stats/minmax.cuh>

namespace raft::stats

template<typename value_t, typename idx_t>
void minmax(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, raft::col_major> data, std::optional<raft::device_vector_view<const unsigned, idx_t>> rowids, std::optional<raft::device_vector_view<const unsigned, idx_t>> colids, raft::device_vector_view<value_t, idx_t> globalmin, raft::device_vector_view<value_t, idx_t> globalmax, std::optional<raft::device_vector_view<value_t, idx_t>> sampledcols)#

计算输入矩阵每列的最小值/最大值,并可选择根据给定的行/列 ID 映射向量进行子采样。

注意

此方法作出以下假设

  1. 输入和输出矩阵假定为列主序

  2. ncols 足够小,可以将所有列的最小值/最大值完全放入共享内存

模板参数:
  • value_t – 输入矩阵元素的数据类型。

  • idx_t – 矩阵范围的索引类型。

参数:
  • handle[in] raft 句柄

  • data[in] 输入数据(列主序),大小为 [nrows, ncols],除非 rowids 或 colids 长度较小

  • rowids[in] 可选的行 ID 映射,长度为 nrows。如果您想完全跳过此索引查找,请传递 std::nullopt

  • colids[in] 可选的列 ID 映射,长度为 ncols。如果您想完全跳过此索引查找,请传递 std::nullopt

  • globalmin[out] 最终的列全局最小值 (大小 = ncols)

  • globalmax[out] 最终的列全局最大值 (大小 = ncols)

  • sampledcols[out] 输出采样数据。如果您不需要此数据,请传递 std::nullopt

标准差#

#include <raft/stats/stddev.cuh>

namespace raft::stats

template<typename value_t, typename idx_t, typename layout_t>
void stddev(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<const value_t, idx_t> mu, raft::device_vector_view<value_t, idx_t> std, bool sample)#

计算输入矩阵的标准差。

假定对给定列执行标准差运算。

模板参数:
  • value_t – 数据类型

  • idx_t – 用于寻址的整数类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 输入矩阵

  • mu[in] 均值向量

  • std[out] 输出标准差向量

  • sample[in] 是否计算样本标准差。换句话说,分别对于 true 或 false,是使用 N-1 还是 N 进行归一化

求和#

#include <raft/stats/sum.cuh>

namespace raft::stats

template<typename value_t, typename idx_t, typename layout_t>
void sum(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> input, raft::device_vector_view<value_t, idx_t> output)#

计算输入矩阵的和。

假定对给定列执行求和运算。

模板参数:
  • value_t – 数据类型

  • idx_t – 用于寻址的整数类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • input[in] 输入矩阵

  • output[out] 输出均值向量

加权平均值#

#include <raft/stats/weighted_mean.cuh>

namespace raft::stats

template<typename value_t, typename idx_t, typename layout_t>
void weighted_mean(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<const value_t, idx_t> weights, raft::device_vector_view<value_t, idx_t> mu, bool along_rows)#

计算输入矩阵与权重向量的加权均值,可沿行或沿列进行。

模板参数:
  • value_t – 数据类型

  • idx_t – 用于寻址的整数类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 大小为 nrows * ncols 的输入矩阵

  • weights[in] 权重向量,如果 along_row 为 true 则大小为 ncols,否则大小为 nrows

  • mu[out] 输出均值向量,如果 along_row 为 true 则大小为 nrows,否则大小为 ncols

  • along_rows[in] 是否沿行或列进行归约

template<typename value_t, typename idx_t, typename layout_t>
void row_weighted_mean(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<const value_t, idx_t> weights, raft::device_vector_view<value_t, idx_t> mu)#

使用列权重向量计算输入矩阵的行加权平均值。

模板参数:
  • value_t – 数据类型

  • idx_t – 用于寻址的整数类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 大小为 nrows * ncols 的输入矩阵

  • weights[in] 大小为 ncols 的权重向量

  • mu[out] 大小为 nrows 的输出均值向量

template<typename value_t, typename idx_t, typename layout_t>
void col_weighted_mean(raft::resources const &handle, raft::device_matrix_view<const value_t, idx_t, layout_t> data, raft::device_vector_view<const value_t, idx_t> weights, raft::device_vector_view<value_t, idx_t> mu)#

使用行权重向量计算输入矩阵的列加权平均值。

模板参数:
  • value_t – 数据类型

  • idx_t – 用于寻址的整数类型

  • layout_t – 输入矩阵的布局类型。

参数:
  • handle[in] raft 句柄

  • data[in] 大小为 nrows * ncols 的输入矩阵

  • weights[in] 大小为 nrows 的权重向量

  • mu[out] 大小为 ncols 的输出均值向量