处理SVM中的大型内核矩阵

时间:2017-04-22 08:21:20

标签: matlab matrix machine-learning classification svm

我有一个矩阵X,尺寸 40 -by- 60000

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

当然我会收到错误

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

通常如何做?数据集为Mnist,因此有人必须在此之前完成此操作。在这种情况下rank(K) <= 40,我需要一种方法来存储K,然后将其传递给quadprog

3 个答案:

答案 0 :(得分:2)

  

通常如何做?

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

答案 1 :(得分:1)

如果您愿意提交线性内核(或任何其他容易计算相应特征转换的内核),您可以避免使用原始优化来分配O(N ^ 2)内存方法,它不构造完整的核矩阵K。

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

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

答案 2 :(得分:-3)

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