Matlab fminunc():实现逻辑回归将使用高达99%的CPU并导致机器冻结

时间:2014-09-27 16:09:31

标签: python matlab machine-learning logistic-regression

我使用fminunc()来解决逻辑回归方法中相对较大的(30k X 16k作为训练数据)机器学习问题,但每次运行fminunc()时,它都会立即吃掉我的RAM并占用99%的CPU几个小时,我的笔记本电脑完全冻结了。 (我实际安装了8 G RAM)

可能存在类似的问题:MATLAB fminunc() not completing for large datasets,但它与我的情况有很大不同,分别如下:

  • 我遵循他的决定性想法,将'LargeScale'设置为'Off',但是 不幸的是,这对我的案子不起作用。将'LargeScale'设置为 “开启”或“关闭”将导致相同的情况 - 正在运行 fminunc()导致我的机器瘫痪

  • 我的数据集包含的功能多于功能(32k X 16k)

  • 我使用稀疏矩阵代替完整作为输入训练集X

我的成本函数如下:

function [J, grad] = costFunction(theta, X, y)

[m, n] = size(X);

J = 1/m*sum( (-y).*log(sigmoid(X*theta)) - (1-y).*log(1-sigmoid(X*theta)) );

grad = 1/m*( X' * (sigmoid(X*theta)- y) );

end

我的预处理步骤和fminunc()函数如下:

...
% some script to preprocess data and create sparse matrix X as input ( X is 32769 * 16601 and 
% containing only 0s or 1s); and y is the target column vector, containing only 0s or 1s; and initial_theta is a column 
% vector of 0s
...

options = optimset('GradObj', 'on', 'MaxIter', 400);

[theta, cost] = fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);

和sigmoid功能:

function g = sigmoid(z)

g = zeros(size(z));

g = exp(-z) + 1;

g = 1./g;

end

该数据集来自kaggle: Amazon.com - Employee Access Challenge的一个数据科学竞赛,我通过使用One Hot Encoding(功能是分类的)预处理了原始训练数据,并且功能从8扩展到16600,所以训练数据X是维度为32769 * 16601的稀疏矩阵(添加了一个1s的列向量)

我是机器学习的新手,也是Coursera用户。我接受了Andrew Ng教授的机器学习课程,所以我基于他的教学方法实施。我只是想知道是否有人可以告诉我为什么我的fminunc()在这种情况下如此慢并且非常耗费CPU。

8G RAM, 2.5GHz, Matlab R2014a

我还使用相同的数据集X,y和initial_theta分别测试了我的成本函数本身,并且成本函数本身的一个执行时间在0.002到0.02秒之间:

tic
[cost, grad] = costFunction(initial_theta, X, y)
Toc

我使用相同的训练数据(稀疏矩阵X)到python的Logistic回归分类器:model = linear_model.LogisticRegression,处理时间只用了一秒!

所以,

  1. fminunc对这种情况不好吗?
  2. 我的成本函数是否需要改进?
  3. 任何参数设置不正确?
  4. 感谢任何建议!

    谢谢,

    Weimin

0 个答案:

没有答案