我有一个矩阵X
,尺寸 40 -by- 60000
在编写SVM时,我需要形成一个线性内核:K = X'*X
当然我会收到错误
Requested 60000x60000 (26.8GB) array exceeds maximum array size preference.
通常如何做?数据集为Mnist
,因此有人必须在此之前完成此操作。在这种情况下rank(K) <= 40
,我需要一种方法来存储K
,然后将其传递给quadprog
。
答案 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位,因此您需要检查系统中的哪一个。