【问题标题】:Efficient MATLAB code to find classification error查找分类错误的高效 MATLAB 代码
【发布时间】:2012-06-15 01:41:22
【问题描述】:

我编写了一个用于分类的 Matlab 脚本。当我执行此操作时,出现内存不足错误。

for i =1:size(Y)  
    if(predictions(i) ~= clasL(find(ismember(mydata,X(i)),'rows')))  
        error = error+1;  
    end  
end

在上面的代码中,Ypredictions 是维度为 19928 的向量。mydataX 是 19928*62061 和 12819*62061 矩阵。当我执行以下代码时,出现以下错误

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

Error in ismember (line 62)
            tf = (a == s);

Error in myinit (line 105)
if(predictions(i) ~= clasL(find(ismember(mydata,X(i)),1)))

如何克服这个问题?请帮我。 谢谢

【问题讨论】:

  • clasL是你自己的自定义函数吗?在不知道clasL 的功能的情况下,很难或不可能修改和修复代码以解决内存问题。您能否编辑您的问题并在其中包含clasL 函数的代码?
  • 对不起。 clasL 是另一个维度为 19928 的向量。基本上 clasL 包含原始类标签,predictions 包含预测的类标签。

标签: matlab


【解决方案1】:

首先尝试在 MATLAB 进程上运行 ulimit,以便它可以使用尽可能多的内存。

其次,我想你想把参数的顺序切换到ismember

ismember(X(i, :), mydata, 'rows')

第三,如果您更改参数的顺序,则不需要额外的find 函数。然后,您只需执行此操作(在循环内):

[~, idx] = ismember(X(i, :), mydata, 'rows')
if (idx > 0 && predictions(i) ~= clasL(idx))
    error = error+1;  
end 

第四,为了节省时间,您可以对X 中的所有行只运行一次ismember(无循环),然后以向量化的方式查找错误数:

[~, idxs] = ismember(X, mydata, 'rows')
error = sum(predictions(idxs > 0) ~= clasL(idxs > 0))

【讨论】:

  • 谢谢。我进行了建议的更改并运行了算法。即使现在我也遇到了同样的错误。 Error using == Out of memory. Type HELP MEMORY for your options. Error in ismember (line 225) d = c(1:end-1,:)==c(2:end,:); % d indicates matching entries in 2-D Error in myinit (line 104) [~, idxs] = ismember(X, mydata, 'rows')
  • 运行 ulimit 没有帮助?然后尝试循环版本。如果这也不起作用,您需要在具有更多内存的机器上运行它,或者对 mydata 进行一些排序,然后进行搜索或更复杂的操作。
  • 如果还是不行,拆分mydata,对部件运行ismember命令并连接结果。
  • 谢谢。最后它在拆分mydata 并在零件上运行ismember 命令后工作。
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2015-07-03
  • 2015-03-29
相关资源
最近更新 更多