SVM 预测单元格中的数据而不是预期的矩阵

SVM prediction of data in cells rather than the expected matrix

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

[W B] = VL_SVMTRAIN(X, Y, LAMBDA) trains a linear Support Vector Machine (SVM) from the data vectors X and the labels Y. X is a D by N matrix, with one column per example and D feature dimensions (SINGLE or DOUBLE). Y is a DOUBLE vector with N elements with a binary (-1 or +1) label for each training point.

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

问题是我的数据根本不是这样排列的,我想即使我想也不能这样排列。我的每个图像都由一个大小为 512 * 257 的特征矩阵表示,这些都存储在一个单元格中。同样每个测试图像也是相同大小的。

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

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

更新:

我提到的元胞数组由28个模型组成。所以我一共有28个classes,每个class用一个大小为512 * 257的数组表示。写 models(1) 表示 ans = [512x257 double],写 models{1} 生成 512*257 双矩阵。

这就是我用来训练 SVM 的,同样每个测试也是相同的大小和相同的排列。

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

连接它们

测试方面,从5张图片中提取RootSIFT特征,然后经过与模型相同的过程,得到相同大小的级联矩阵。所以每个模型自然有数百个测试矩阵。

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

除了它所讨论的 D x N 矩阵之外,没有其他方法可以将数据表示给 vl_svmtrain 方法。但是,您可以展开元胞数组并变换每个特征矩阵,使其成为 列向量 。然后,您将构建矩阵,使每个列向量代表一个特征矩阵,并横向连接这些列向量以生成最终的 D x N 矩阵。

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

X_3D = cat(3, A{:});
X = reshape(X_3D, size(X_3D,1)*size(X_3D,2), []);

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

的输入

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

祝你好运!