SVM预测细胞中的数据而不是预期的矩阵

时间:2015-01-07 19:06:06

标签: matlab classification svm libsvm vlfeat

对于我的svm培训和预测,我使用vl_svmtrain,其文档可在此处找到:http://www.vlfeat.org/matlab/vl_svmtrain.html

  

[W B] = VL_SVMTRAIN(X,Y,LAMBDA)训练线性支持向量   来自数据矢量X和标签Y.X的机器(SVM)是D乘N.   矩阵,每个示例有一列和D要素尺寸(SINGLE   或双倍)。 Y是一个DOUBLE向量,N个元素带有二进制(-1或   +1)每个训练点的标签。

根据文档,数据X必须是D×N矩阵,每列一个样本。

事情是我的数据根本没有这样安排,我认为即使我想要也可以这样安排。我的每个图像都由大小为512 * 257的特征矩阵表示,这些特征矩阵存储在一个单元格中。同样,每个测试图像的大小也相同。

因此,为了简化起见,我假设我只有3个类,每个类都由大小为512 * 257的模型表示,我有成千上万的测试,我必须再次比较每个模型,更像是一个与所有方法。但它的数据安排我遇到了困难。

是否可以以单元格式而不是矩阵格式将数据呈现给SVM?

更新

我提到的单元阵列由28个模型组成。所以我总共有28个类,每个类由一个大小为512 * 257的数组表示。写models(1)呈现ans = [512x257 double]并撰写models{1}会产生512*257双矩阵。

这是我用来训练SVM的方法,类似地,每个测试也具有相同的尺寸,并且采用相同的布置。

我如何为每个模型获得此矩阵?我从每个类/模型的100个图像中提取RootSIFT功能。然后我将这些特征呈现给高斯混合模型脚本,并将簇的数量设置为512.这给了我512个簇的均值,协方差和权重。然后我使用models{i} = [gmm_models{i}.w(:) gmm_models{i}.mu' gmm_models{i}.sigma'];

连接它们

对于测试,从5个图像中提取RootSIFT特征,然后它们经历与模型相同的过程以获得相同大小的级联矩阵。因此,每个模型自然会有数百个测试矩阵。

我希望这比以前更清楚了。

1 个答案:

答案 0 :(得分:1)

除了它所谈论的vl_svmtrain矩阵之外,没有办法将数据表示给D x N方法。但是,您可以执行的操作是展开单元格数组并转换每个要素矩阵,使其变为列向量。然后,您将构造矩阵,使每个列向量表示单个要素矩阵,并在宽度方向上连接这些列向量,以生成最终的D x N矩阵。

因此,您可以进行一些预处理以获得所需的矩阵X。首先,展开您的单元阵列,使其成为一个3D矩阵,其中每个切片是一个特征矩阵。然后,重塑该矩阵,使每个切片成为最终2D矩阵的单个列。因此,假设您的单元格数组存储在A

中,请执行此类操作
X_3D = cat(3, A{:});
X = reshape(X_3D, size(X_3D,1)*size(X_3D,2), []);

X将包含我们谈到的最终2D矩阵。请记住,每个要素矩阵将在的基础上展开。这意味着对于您拥有的每个要素矩阵,列都相互堆叠,以便为输出2D矩阵创建单个列。您现在可以使用X作为vl_svmtrain的输入。

但是,我会给你一个公平的警告,因为每一栏在技术上都是512 x 257 = 131584元素。如果您有1000个特征矩阵,由于内存要求,此矩阵可能无法用于vl_svmtrain。因此,您可能必须对要素矩阵进行子采样,或者使用减少数量的要素矩阵进行输入。

祝你好运!