我在matlab中重构分解张量有麻烦

时间:2012-05-20 13:39:43

标签: multidimensional-array matrix sparse-matrix matlab

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

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

只是为了解释一下数据。我们有一个搜索汽车的用户数据库。想做推荐模型。我们创建了一个具有5个dimansions的张量:308(车型)x 22(车身类型)x 29(价格类别)x 12(制造年份)x 492020(用户)。然后我们运行张量分解,现在我们可以对最后一个分解的维度进行聚类,通过搜索来对用户进行分组,并构建一些搜索日志依赖关系。到目前为止我们还可以。现在我们想要从其分解版本重建张量,以获得一些将作为预测的新记录。鉴于张量是巨大的,我们需要一种扁平化来执行重建的方法,如果有人可以分享一些如何做的matlab代码,那将是一件好事,因为我对matlab来说相对较新。所以我想将5D张量转换为2D

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

你的492020用户适应内存的原因可能是因为张量很稀疏。重新分解张量通常是密集的(尽管排名降低),除非你对因子强制执行稀疏性。无论如何,使用分解形式计算效率要高得多。

我担心你的“聚类”步骤 - 塔克分解是线性的(如主成分),非负张量因子分解可能更接近你想做的事情。为每个用户分配一个非负的混合矢量一些“典型”的偏好。 “聚类”往往意味着强硬的分类,而不是模糊。