【发布时间】:2020-05-22 10:11:23
【问题描述】:
我正在尝试在多级贝叶斯模型中计算矩阵矩阵乘积。数据和模型变量的形状如下:
X_train: (n_samples, n_predictors)
alpha: (n_groups, )
beta: (n_predictors, n_groups)
X_train 是密集的。 alphas 是组截距,betas 表示斜率(同样,每个组的变量)。样本被分成几组;数组group_index(大小为(n_samples,))表示每个样本所属的组。简而言之,线性模型是
y[n] = alpha[group_index[n]] + < X_train[n, 1:K], beta[1:K, group_index[n]] >
对于所有n = 1 ... n_samples,其中< , > 表示内积。
以下是在 Python 中的实现方式:
# an element-wise product between two matrices of size [n_samples, n_predictors]
y = alpha[group_index] + (X_train * beta[:, group_index].T).sum(axis=-1)
问题:这个实现可以提高内存/cpu 的效率吗?
这里n_samples 可以运行到100 万,而n_predictors 和n_groups 大约是100 左右。我正在寻找的是一个矢量化的公式,它 (1) 需要更少的存储空间,并且 (2) 与我上面提出的相比,它的运行速度差不多。
【问题讨论】:
-
评论说“两个大小为 [n_samples, n_predictors] 的矩阵之间的元素乘积”,但这似乎不是代码中发生的事情。
-
@user2357112supportsMonica 我认为 是 发生了什么:
X_samples是(n_samples, n_predictors),beta是(n_predictors, n_groups)和group_index是(n_samples,)。因此beta[:, group_index].T的大小为(n_samples, n_predictors)。 -
啊,
group_index是一个数组。
标签: python numpy machine-learning vectorization linear-regression