【问题标题】:Dealing with a large kernel matrix in SVM处理 SVM 中的大核矩阵
【发布时间】:2017-09-19 07:07:53
【问题描述】:

我有一个矩阵 X,大小 40-by-60000

在编写 SVM 时,我需要形成一个线性内核:K = X'*X

当然我会得到一个错误

Requested 60000x60000 (26.8GB) array exceeds maximum array size preference.

通常是怎么做的?数据集是Mnist,所以之前肯定有人做过。在这种情况下rank(K) <= 40,我需要一种方法来存储K,然后将其传递给quadprog

【问题讨论】:

  • 欢迎来到 Stack Overflow!请注意,与 math.SE 不同,SO 不支持 TeX,正如您所注意到的,因此我将数学更改为代码格式。
  • 您可以将数据转换为单曲。 Matlab 将数据存储为双精度(每个数字占用 8 个字节)。 x=single(x) 将其转换为每个数字 4 个字节,但您仍需要 13.4 GB。

标签: matlab matrix machine-learning classification svm


【解决方案1】:

如果您愿意使用线性内核(或任何其他可以轻松计算相应特征变换的内核),则可以通过使用 primal 优化来避免分配 O(N^2) 内存方法,不构造全核矩阵K。

原始方法使用训练样本特征的加权和来表示模型,因此只会占用 O(NxD) 内存,其中 N 和 D 是训练样本的数量及其特征维度。

您也可以使用liblinear(如果您解决了 C++ 问题)。 请注意他们网站上的这条评论:“不使用内核,可以通过线性分类器快速训练更大的集合。”

【讨论】:

【解决方案2】:

通常是怎么做的?

通常,大型数据集的内核矩阵是预先计算的。由于使用的优化方法(如 SMO 或梯度下降)只需要在每次迭代中访问样本子集,因此您只需要一个惰性内核矩阵的数据结构,换句话说 - 每次优化器请求 K[i, j] 然后你从字面上计算 K(xi,xj)。通常,还有缓存机制来确保经常请求的内核值已经准备好等。

【讨论】:

  • 天哪,quadprog 可以接受作为内核函数的输入吗? (核函数k生成Gram矩阵K:k(xi,xj) = K(xi,xj)。)
  • quadprog 没有,这不是人们用于 SVM 的方法。
  • 您好,Matlab 中是否有任何简单的优化插件可以按照您描述的方式处理大型内核?我不能使用 libsvm 的原因是我的 Matlab 中没有 C/C++ 编译器,我也无法安装它...
  • 嗨,请看我的新问题stackoverflow.com/questions/43565478/…
【解决方案3】:

此问题是由于您的数据集很大,因此它超过了系统中可用的 RAM 量。在 64 位系统中,数据处理性能优于 32 位,因此您需要检查您的系统是两者中的哪一个。

【讨论】:

  • 在 64 位上,您有更多可用 RAM。 32 位将您限制为 2^32 (=4,294,967,296) 个内存位置。所以最大4GB。在 64 位上,您可以访问更多。
  • @rezafakhriyan 如果您认为这个答案现在没有任何价值,您可以edit 它是正确的,或者通过按帖子左下角的“删除”按钮将其完全删除。也没有义务这样做,但请注意,后续投票否决的答案可能会导致答案被禁止,因此最好将答案编辑成形状。
猜你喜欢
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
相关资源
最近更新 更多