0

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

[WB] = VL_SVMTRAIN(X, Y, LAMBDA) 从数据向量 X 和标签 Y 训练一个线性支持向量机 (SVM)。X 是一个 D×N 矩阵,每个示例一列和 D 个特征维度(SINGLE或双)。Y 是具有 N 个元素的 DOUBLE 向量,每个训练点带有二进制(-1 或 +1)标签。

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

问题是我的数据根本没有以这种方式排列,即使我愿意,我也不认为我可以这样排列。我的每个图像都由一个 size 的特征矩阵表示512 * 257,它们存储在一个单元格中。同样,每个测试图像也具有相同的大小。

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

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

更新:

我提到的单元阵列由 28 个模型组成。所以我一共有 28 个类,每个类都由一个 size 数组表示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 特征,然后对它们进行与模型相同的处理,得到相同大小的级联矩阵。所以很自然地,每个模型都有数百个测试矩阵。

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

4

1 回答 1

1

除了它正在谈论的矩阵之外,没有其他方法可以将数据表示为vl_svmtrain方法。D x N但是,您可以做的是展开元胞数组并转换每个特征矩阵,使其成为列向量。然后,您将构建矩阵,使每个列向量代表一个特征矩阵,并将这些列向量横向连接以生成最终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元素。vl_svmtrain如果您有 1000 个特征矩阵,则由于内存要求,此矩阵可能无法使用。因此,您可能必须对特征矩阵进行二次采样,或者使用减少数量的特征矩阵作为输入。

祝你好运!

于 2015-01-07T19:30:26.847 回答