对于我的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特征,然后它们经历与模型相同的过程以获得相同大小的级联矩阵。因此,每个模型自然会有数百个测试矩阵。
我希望这比以前更清楚了。
答案 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
。因此,您可能必须对要素矩阵进行子采样,或者使用减少数量的要素矩阵进行输入。