【问题标题】:Octave Error: out of memory or dimension too large for Octave's index typeOctave 错误:内存不足或尺寸对于 Octave 的索引类型而言太大
【发布时间】:2022-06-19 19:25:58
【问题描述】:

我正在尝试在 Octave 中运行以下代码。变量“数据”由 864 行和 25333 列组成。

clc; clear all; close all;

pkg load statistics

GEO = load("GSE59739.mat");
GEOT = tabulate(GEO.class)
data = GEO.data;
clear GEO

idx = kmeans(data,3,'Distance','cosine');
test1 = silhouette(data, idx, 'cosine');
xlabel('Silhouette Value')
ylabel('Cluster')

这是我在尝试运行剪影函数时遇到的错误: “错误:内存不足或尺寸对于 Octave 的索引类型而言太大”。关于如何修复它的任何想法?

【问题讨论】:

  • 获取更多内存...
  • 或减小数据大小...
  • data 的内存占用只有 173MB,所以应该不是问题。问题似乎更多的是关于剪影如何处理这些数据。你用的是哪个版本的八度?您是否尝试过为 64 位索引编译的版本?请参阅以下内容,了解为什么您可能会达到索引限制,而不是内存限制:stackoverflow.com/questions/45881343/…
  • 请用实际的错误消息更新问题,包括函数堆栈信息和行号。我看到的是错误来自silhouettepdist 的调用,这可能会以低效的方式对您的数据进行一些转换。

标签: out-of-memory octave k-means silhouette


【解决方案1】:

看来问题不一定出在您的数据上,而在于 Octave 的统计数据包实现 pdist 的方式。正如错误消息所说,它使用的扩展会导致数组的维度超出系统限制。

在 Octave 6.4.0 和统计 1.4.3 上使用一些相同大小的虚拟数据运行您的示例,我得到:

pkg load statistics
data = rand(864,25333);
idx = kmeans(data,3,'Distance','cosine');
test1 = silhouette(data, idx, 'cosine');

error: out of memory or dimension too large for Octave's index type
error: called from
    pdist at line 164 column 14
    silhouette at line 125 column 16

pdist 是一个函数,用于计算矩阵中任意两行之间的“距离”,使用多种方法之一。 silhouette 是使用cosine 度量调用的,错误发生在那个计算部分:

pdist,第 163-166 行 cosine 块:

case "cosine"
        prod = X(:,Xi) .* X(:,Yi);
        weights = sumsq (X(:,Xi), 1) .* sumsq (X(:,Yi), 1);
        y = 1 - sum (prod, 1) ./ sqrt (weights);

计算prod 的第一行导致错误,因为 X = data' 是 25333x864,Xi 和 Yi 都是 372816x1,并且是通过运行 nchoosek(1:rows(data),2) 形成的(产生 372816 个集合1:864 的所有 2 个元素组合)。

X(:,Xi) 和 X(:,Yi) 每次请求创建一个 rows(X) x rows(Xi) 数组,或 25333x372816,或 9,444,547,728 个元素,对于双精度数据需要 75,556,381,824 字节或 75.6GB .很可能你的机器无法处理这个问题。

只需使用 Matlab 2022a 进行检查,它就能在几秒钟内运行这些行而不会出现任何内存不足错误,并且 test1 输出仅为 864x1。因此,这种过多的内存开销似乎是 Octave 实现特有的问题,而不是该技术固有的问题。

我已在https://savannah.gnu.org/bugs/index.php?62495 提交了有关此行为的错误报告,但目前的答案似乎是“余弦”度量,也许还有其他度量,根本不能用于这种大小的输入数据。

更新:截至 2022 年 6 月 19 日,已将针对此 pdist 内存问题的修复推送到统计软件包存储库,并将包含在下一个主要软件包版本中。同时更新的功能可以在https://github.com/gnu-octave/statistics/blob/main/inst/pdist.m找到。

【讨论】:

  • 非常感谢您的帮助和详细的解释,我会尝试用Matlab运行代码。
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2017-08-11
  • 2011-09-01
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多