gpt4 book ai didi

matlab - "out of memory"matlab 中的 mvregress 错误

转载 作者:太空宇宙 更新时间:2023-11-03 20:20:31 26 4
gpt4 key购买 nike

我正在尝试将 mvregress 与我拥有的数百维数据一起使用。 (3~4)。使用 32 gb 的 ram,我无法计算 beta,并且收到“内存不足”消息。我找不到任何 mvregress 的使用限制阻止我将它应用于具有这种维数的向量,我做错了什么吗?有什么方法可以通过我的数据使用多元线性回归吗?

这里有一个错误的例子:

dim=400;
nsamp=1000;
dataVariance = .10;
noiseVariance = .05;
mixtureCenters=randn(dim,1);
X=randn(dim, nsamp)*sqrt(dataVariance ) + repmat(mixtureCenters,1,nsamp);
N=randn(dim, nsamp)*sqrt(noiseVariance ) + repmat(mixtureCenters,1,nsamp);
A=2*eye(dim);
Y=A*X+N;
%without residual term:
A_hat=mvregress(X',Y');
%wit residual term:
[B, y_hat]=mlrtrain(X,Y)

在哪里

function [B, y_hat]=mlrtrain(X,Y)
[n,d] = size(Y);
Xmat = [ones(n,1) X];
Xmat_sz=size(Xmat);
Xcell = cell(1,n);
for i = 1:n
Xcell{i} = [kron([Xmat(i,:)],eye(d))];
end
[beta,sigma,E,V] = mvregress(Xcell,Y);
B = reshape(beta,d,Xmat_sz(2))';
y_hat=Xmat * B ;
end


错误是:

Error using bsxfun
Out of memory. Type HELP MEMORY for your options.

Error in kron (line 36)
K = reshape(bsxfun(@times,A,B),[ma*mb na*nb]);

Error in mvregress (line 319)
c{j} = kron(eye(NumSeries),Design(j,:));

这是 whos 命令的结果:

whos
Name Size Bytes Class Attributes

A 400x400 1280000 double
N 400x1000 3200000 double
X 400x1000 3200000 double
Y 400x1000 3200000 double
dataVariance 1x1 8 double
dim 1x1 8 double
mixtureCenters 400x1 3200 double
noiseVariance 1x1 8 double
nsamp 1x1 8 double

最佳答案

好的,我想我有一个解决方案,首先是简短的版本:

dim=400;
nsamp=1000;
dataVariance = .10;
noiseVariance = .05;
mixtureCenters=randn(dim,1);
X=randn(dim, nsamp)*sqrt(dataVariance ) + repmat(mixtureCenters,1,nsamp);
N=randn(dim, nsamp)*sqrt(noiseVariance ) + repmat(mixtureCenters,1,nsamp);
A=2*eye(dim);
Y=A*X+N;

[n,d] = size(Y);
Xmat = [ones(n,1) X];
Xmat_sz=size(Xmat);
Xcell = cell(1,n);
for i = 1:n
Xcell{i} = kron(Xmat(i,:),speye(d));
end
[beta,sigma,E,V] = mvregress(Xcell,Y);
B = reshape(beta,d,Xmat_sz(2))';
y_hat=Xmat * B ;

奇怪的是,我无法访问该函数的工作区,它没有出现在调用堆栈中。这就是为什么我将函数放在此处脚本之后的原因。

以下解释可能对您将来也有帮助:查看 kron 定义,插入 m x n 和 p x q 矩阵的结果大小为 mxp x nxq,在您的情况下为 400 x 1001 和 1000 x 1000,这构成了一个 400000 x 1001000 矩阵,它有 4*10^11 个元素。现在你有 400 个,每个元素占用 8 个字节以实现 double ,总内存大小约为 1.281 PB(如果你愿意,也可以是 1.138 Pebibytes),即使你的大 32 Gibibyte 也无法达到.

看到您的矩阵之一,即眼睛矩阵,主要包含零,并且生成的矩阵包含所有可能的元素乘积组合,其中大部分也将为零。特别是对于这种情况,MATLAB 提供了稀疏矩阵格式,它通过仅存储非零元素来节省大量内存,具体取决于矩阵中零元素的数量。您可以使用 sparse(X) 将完整矩阵转换为稀疏表示,或者使用 speye(n) 直接获得眼图矩阵,这就是我在上面所做的.稀疏属性传播到结果,您现在应该有足够的内存(我有 1/4 的可用内存,并且它有效)。

然而,剩下的就是Matthew Gunn在评论中提到的问题。我收到一条错误消息:

使用 mvregress 时出错(第 260 行)数据不足,无法估计完整模型或最小二乘模型。

关于matlab - "out of memory"matlab 中的 mvregress 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34964561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com