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' 指标,也许还有其他指标,根本无法与这个大小的输入数据。
我正在尝试 运行 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' 指标,也许还有其他指标,根本无法与这个大小的输入数据。