【问题标题】:SVM prediction of data in cells rather than the expected matrixSVM 预测单元格中的数据而不是预期矩阵
【发布时间】:2015-03-05 18:43:11
【问题描述】:

对于我的 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 矩阵中,每列一个样本。

问题是我的数据根本不是这样排列的,即使我想我也不认为我可以这样排列。我的每个图像都由大小为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 特征,然后对它们进行与模型相同的处理,得到相同大小的级联矩阵。所以自然而然地,每个模型都有数百个测试矩阵。

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

【问题讨论】:

  • 512x257 是否是图像中的特征点列表?有完整的描述符吗?
  • 它是 GMM 生成的参数的串联。因此,每个单元格都是均值、协方差和权重的串联。根据去年 3 月发表的一篇论文,已知这些功能会产生良好的效果

标签: matlab classification svm libsvm vlfeat


【解决方案1】:

除了它所说的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。因此,您可能必须对特征矩阵进行二次采样,或者使用较少数量的特征矩阵作为输入。

祝你好运!

【讨论】:

  • 谢谢。不幸的是,改变 svm 有帮助吗?与 libsvm 一起使用会更好吗?
  • 我认为更改您使用的 SVM 不会有帮助。问题仍然是您的训练数据占用了多少内存,因此切换到libsvm 可能不会有任何作用。自从我使用 VLFeat 以来已经有一段时间了,所以在我们做任何其他事情之前,请尝试按原样运行 vl_svmtrain 与重构的数据矩阵,看看你会得到什么。
  • @FarazKhan - 你告诉我A 是一个元胞数组。您能否更具体地说明您的输入应该是什么?另外,如果你只得到一个列向量,这意味着你的单元格数组/不管它是什么......只是一个 single 特征矩阵。请使用您的所有相关代码更新您的帖子,以便我可以看到您在做什么。
  • @FarazKhan - 好的。如果每个单元格都是512 x 257 矩阵,那么我上面写的代码应该可以工作。只需将A 替换为models。你能告诉我你是如何用你的models 单元格数组调用我上面写的代码吗?
  • @FarazKhan - 是的,这就是它应该做的......创建 28 列!关于我如何发布代码,您必须知道的一件事是,它总是会根据您的情况量身定制 :) 是的。您也需要为您的测试数据执行此操作。让我知道这是否适合您,如果可以,请考虑接受我的回答!
猜你喜欢
  • 1970-01-01
  • 2016-07-15
  • 2014-03-05
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2014-08-24
  • 2014-01-31
  • 2018-11-01
相关资源
最近更新 更多