Octave Error: out of memory or dimension too large for Octave's index type

Octave Error: out of memory or dimension too large for Octave's index type

我正在尝试 运行 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 的索引类型来说太大”。知道如何修复它吗?

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

运行 通过你的示例和一些相同大小的虚拟数据,在 Octave 6.4.0 和 statistics 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 是一个函数,使用多种方法之一计算矩阵中任意两行之间的“距离”。使用cosine指标调用silhouette,错误发生在该计算部分:

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,由运行ning 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 上提交了关于此行为的错误报告,但目前的答案似乎是 'cosine' 指标,也许还有其他指标,根本无法与这个大小的输入数据。