我在 matlab 中重建分解张量时遇到麻烦



我们在 matlab 中有一个大小为 308 x 22 x 29 x 12 x 492020 的张量它相当大。我们对它进行了分解,它工作得很好。现在我们正试图重建它以获得一些预测。当我们运行它时,当我们进行最后一个维度的乘法时,它会因内存不足而崩溃。

我试图将我们的张量展平为一个 2 x 2 的矩阵,以使重建更容易。我找不到一种方法,我尝试在 matlab 中使用重塑函数但没有成功。所以基本上我想知道一种在 matlab 中将 (308 x 22 x 29 x 12 x 492020( 张量转换为 2D 矩阵的方法。

只是为了多解释一点数据。我们有一个搜索要购买的汽车的用户数据库。我们想做推荐模型。我们创建了一个具有 5 个尺寸的张量:308(车型(x 22(车身类型(x 29(价格类别(x 12(制造年份(x 492020(用户(。然后,我们运行张量分解,现在可以在最后一个分解的维度上进行聚类,以按搜索对用户进行分组,并构建一些搜索日志依赖项。到这里为止,我们还可以。现在我们想从其分解版本中重建张量,以获得一些将充当预测的新记录。鉴于张量很大,我们需要一种方法来展平它来执行重建,如果有人可以分享一些如何做到这一点的示例 matlab 代码,那就太好了,因为我对 matlab 相对较新。所以我想将 5D 张量转换为 2D

如果你在 MATLAB 变量列表中有一个巨大的 5D 张量,并且你能够访问它的各个元素,比如说MyTensor(123,17,15,4,123456),那么如果你有足够的存储空间,你可以做到这一点。我没有处理这种大小的任何数据的经验,但如果您可以访问它,那么您可以重建它。如果逐个元素或逐个切片或 n 维超切片逐个超级切片将所有内容写入磁盘,以使用运行编号分隔文件,然后按正确的顺序从这些文件加载和重建元素/切片/超级切片,那么您将拥有 2D 矩阵。如果元素访问适用于您的 5D 张量,我会首先创建一个小的 5D 矩阵并将其转换为 2D 矩阵,以查看维度的顺序是否正确,仅使用也适用于您的巨大 5D 张量的访问方法。之后,您可以使用完全相同的代码重建巨大的 5D 张量。

您不需要重建整个张量来估计"聚类"用户的样本重建误差。 例如,您可以对单个用户进行抽样,并比较重建的切片,并在此过程中收集统计信息。 通常在机器学习中,您希望使用"样本外"交叉验证模型 - 即从测试集中随机划分训练集。

我会观察到车身类型是汽车模型的一个属性,价格大致是每个模型的年龄(和状况(的函数......所以在这种情况下你并没有真正足够独立的尺寸。

您的 492020 用户适合内存的原因可能是因为张量稀疏。 重新组合分解的张量通常是密集的(尽管降低了秩(,除非您对因子强制稀疏。 无论如何,使用分解形式进行计算要高效得多。

我担心你的"做聚类"步骤 - Tucker分解是线性的(如主成分(,非负张量分解可能更接近你想要做的..为每个用户分配一些"典型"偏好的非负混合向量。 "聚类"往往意味着硬边分类,而不是模糊。

最新更新