【问题标题】:measuring uncertainty in matlabs svmclassify在matlabs svmclassify中测量不确定性
【发布时间】:2013-03-12 21:02:07
【问题描述】:

我正在做上下文对象识别,我需要先验才能进行观察。例如这个空间被标记为“狗”,它被正确标记的概率是多少?你知道 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 库吗?

【问题讨论】:

  • 你的意思是后路,对吧?给定训练,对于测试数据点,分类器不应该只返回最好的类,而是每个类的概率,这样概率最高的就是最好的。

标签: matlab svm uncertainty


【解决方案1】:

萨拉姆,

提示:我建议您修改 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 值是您在比较与其输出类相关的不同输入时要查找的值。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      您是在提供数据并自己进行培训吗?如果是这样,最好的办法是将数据划分为训练集和测试集。 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)
      

      【讨论】:

      • 太好了,我很欣赏这个建议。如果我遗漏了什么,请原谅我,但这些误报率/未命中率不会只是单个数字吗? IE。如果我在一张图片中有 10 个标签,这些费率是否必须应用于所有标签?我想要一些说“这个特定的标签非常确定,这个不太确定”的东西。不确定性需要与此特定标签的实际不确定性相关,而不是平均值或总和。有没有办法做到这一点?有什么方法可以得到 svmclassify 实际给这个特定标签的实际分数?
      • 是的,我正在提供训练和测试数据
      • 我明白了。据我所知,SVM 本身并不是概率性的,因此除了根据一些可靠的测试数据评估分类器之外,可能很难讨论不确定性。但是,您可能能够看到的一件事是您分类的特定示例的目标函数的实际值。接近零的值似乎表明它是一个边界情况。
      【解决方案4】:

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

      普拉特,J. C. (2000)。 SV 机器的概率。在 Smola,A. J. 等人。 (编辑)大边距分类器的进步。第 61-74 页。剑桥:麻省理工学院出版社。

      【讨论】:

        猜你喜欢
        • 2020-09-03
        • 2020-11-26
        • 1970-01-01
        • 2022-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        相关资源
        最近更新 更多