2

我正在做上下文对象识别,我需要先验才能进行观察。例如,这个空间被标记为“狗”,它被正确标记的概率是多少?你知道 matlabs svmclassify 是否有一个参数来返回这个级别的确定性与它的分类?

如果没有,matlabs svm 里面有以下结构:

SVM = 
      SupportVectors: [11x124 single]
               Alpha: [11x1 double]
                Bias: 0.0915
      KernelFunction: @linear_kernel
  KernelFunctionArgs: {}
          GroupNames: {11x1 cell}
SupportVectorIndices: [11x1 double]
           ScaleData: [1x1 struct]
       FigureHandles: []

你能想出任何方法来计算这些不确定性的良好度量吗?(使用哪个支持向量?)欢迎解释 SVM 中的不确定性的论文/文章。也欢迎对 matlabs SVM 进行更深入的解释。

如果你不能这样做,你能想到任何其他具有这种不确定性度量的 SVM 库吗?

4

4 回答 4

5

萨拉姆,

提示:我建议您修改 svmclassify.m 函数以将 svmdecision.m 的 f 值传递给用户。这是对输出类的补充。

要访问 svmclassify.m,只需在 Matlab 命令行中键入以下内容:

 open svmclassify

我发现 svmdecision.m ( https://code.google.com/p/auc-recognition/source/browse/trunk/ALLMatlab/AucLib/DigitsOfflineNew/svmdecision.m?spec=svn260&r=260 ) 可以通过 f 值; 因此,在 svmclassify.m 中调用 svmdecision.m 时,以下内容可能是替代品:

[classified, f] = svmdecision(sample,svmStruct);

通过进一步将此 f 值传递给用户,可以使用已在 Matlab 中构建的二进制分类器设计多类实现,例如 one-vs-all。

f 值是您在比较与其输出类相关的不同输入时要寻找的值。

我希望这可以帮助您编写代码并理解它!虽然你现在可能已经解决了你的问题。

于 2013-11-03T09:49:38.077 回答
1

我知道这是很久以前发布的,但我认为作者正在寻找训练后的 SVM 输出中不确定性的度量,无论输出是估计的标签还是估计的概率,这都是点估计。一种衡量标准是相同输入 x 的输出方差。问题是常规 SVM 不是随机模型,例如概率/贝叶斯神经网络。给定相同的 x,SVM 的推理总是相同的。

我需要检查一下,但也许可以用随机正则化训练一个 SVM。也许是某种形式的随机边际最大化,在优化例程的步骤中,输入训练向量可能会经历小的随机扰动,或者可能会丢弃随机选择的特征。类似地,在测试期间,可以删除或修改不同的随机选择的特征,每次产生不同的点估计。然后,您可以采用估计的方差,产生不确定性的度量。

可以说,如果输入 x 呈现模型不熟悉的模式,则点估计将非常不稳定和可变。

一个简单的例子如下:想象一个 2d 玩具示例,其中两个类被很好地分开并占据了密集的特征值范围。虽然在该集合上训练的模型可以很好地泛化到落在训练数据中看到的值的分布/范围内的点,但考虑到远离两个类但在相同纬度的测试观察结果,它将非常不稳定,可以说,作为分离超平面。这样的观察对模型提出了挑战,因为一个支持向量的微小扰动可能导致分离超平面的微小旋转,不会显着改变训练或验证误差,但可能会改变远距离测试观察的估计很多。

于 2017-06-15T04:45:56.080 回答
0

LIBSVM也有一个 Matlab 接口,有一个选项-b可以使分类函数返回概率估计。它们似乎是按照 Platt (2000) 的一般方法计算的,即执行应用于决策值的一维逻辑回归。

普拉特,JC(2000 年)。SV 机器的概率。在 Smola,AJ 等人。(eds.)大边距分类器的进展。第 61-74 页。剑桥:麻省理工学院出版社。

于 2013-11-03T11:41:34.080 回答
0

您是否提供数据并自己进行培训?如果是这样,最好的办法是将数据划分为训练集和测试集。Matlab 对此有一个称为 cvpartition 的函数。您可以使用测试数据上的分类结果来估计误报率和未命中率。对于二元分类任务,这两个数字将量化不确定性。对于具有多个假设的分类测试,最好的办法可能是将您的结果编译到混淆矩阵中。

编辑。发现了一些我用过的旧代码可能会有所帮助

P=cvpartition(Y,'holdout',0.20);

rbfsigma=1.41;

svmStruct=svmtrain(X(P.training,:),Y(P.training),'kernel_function','rbf','rbf_sigma',rbfsigma,'boxconstraint',0.7,'showplot','true');

C=svmclassify(svmStruct,X(P.test,:));

errRate=sum(Y(P.test)~=C)/P.TestSize
conMat=confusionmat(Y(P.test),C)
于 2013-03-22T21:48:24.930 回答