【问题标题】:How to get Equation of a decision boundary in matlab svm plot?如何在matlab svm图中获得决策边界方程?
【发布时间】:2020-11-19 17:43:47
【问题描述】:


我的数据
y n Rh y2
1 1 1.166666667 1
-1 2 0.5 1
-1 3 0.333333333 1
-1 4 0.166666667 1
1 5 1.666666667 2
1 6 1.333333333 1
-1 7 0.333333333 1
-1 8 0.333333333 1
1 9 0.833333333 1
1 10 2.333333333 2
1 11 1 1
-1 12 0.166666667 1
1 13 0.666666667 1
1 14 0.833333333 1
1 15 0.833333333 1
-1 16 0.333333333 1
-1 17 0.166666667 1
1 18 2 2
1 19 0.833333333 1
1 20 1.333333333 1
1 21 1.333333333 1
-1 22 0.166666667 1
-1 23 0.166666667 1
-1 24 0.333333333 1
-1 25 0.166666667 1
-1 26 0.166666667 1
-1 27 0.333333333 1
-1 28 0.166666667 1
-1 29 0.166666667 1
-1 30 0.5 1
1 31 0.833333333 1
-1 32 0.166666667 1
-1 33 0.333333333 1
-1 34 0.166666667 1
-1 35 0.166666667 1

我的代码 r

  data=xlsread('btpdata.xlsx',1.)
  A = data(1:end,2:3)
  B = data(1:end,1)
  svmStruct = svmtrain(A,B,'showplot',true)
  hold on
  C = data(1:end,2:3)
  D = data(1:end,4)
  svmStruct = svmtrain(C,D,'showplot',true)
  hold off 

如何在给定的 mat-lab 图中得到这条黑线的近似方程?

【问题讨论】:

  • 这个数字是怎么产生的?请分享这个情节是如何形成的代码。向我们展示代码是一个良好的开端,它可能离没有投票到结束更近了一步。
  • 大约y=0.6

标签: svm matlab-figure


【解决方案1】:

这取决于您使用的软件包,但由于它是线性支持向量机,因此或多或少有两种选择:

  • 您训练的支持向量机在属性coefs(有时称为wweights)和b(或intercept)中包含直线方程,因此您的直线为<coefs, X> + b = 0
  • 您的支持向量机包含alphas(双系数,拉格朗日乘数),然后是coefs = SUM_i alphas_i * y_i * SV_i,其中SV_i 是第i 个支持向量(图中圆圈中的那些),y_i 是它的标签(-1或+1)。有时alphas 已经乘以y_i,然后是你的coefs = SUM_i alphas_i * SV_i

如果您试图从实际绘图(图像)中获取方程式,那么您只能阅读它(它或多或少是y = 0.6,这意味着coefs = [0 1]b = -0.6。基于图像分析的方法(对于任意这样的情节)将需要:

  • 检测图像部分(物体检测)
  • 读取刻度/刻度(OCR + 对象检测)
  • 过滤掉所有非黑色元素并对左侧点执行线性回归,然后通过之前检测到的比例进行变换。

【讨论】:

  • 你能告诉我命令从这个训练有素的 svm 中取出 coefs 吗?
  • 所有东西都放在你的 train 方法返回的 SVMStruct 中,mathworks.com/help/stats/svmtrain.html
  • 那里没有列出名为 coefs 的属性,我也试过“svmStruct.coefs”和“svmStruct.Coefs”都不起作用
  • 您似乎没有阅读完整的答案 - 另一种选择是从 alphassupport vectors 手动获取 - 在您的模型中都可以访问。
【解决方案2】:

我也遇到了同样的问题。要构建决策边界的线性方程 (y = mx + b),您需要梯度 (m) 和 y 截距 (b)。 SVMStruct.Bias 是 b 项。梯度由 SVM Beta 权重决定,SVMStruct 不包含该权重,因此您需要根据 alpha(包含在 SVMStruct 中)计算它们:

alphas = SVMStruct.Alpha;
SV = SVMStruct.SupportVectors;
betas = sum(alphas.*SV);
m = betas(1)/betas(2)

顺便说一句,如果您的 SVM 已对数据进行了缩放,那么我认为您将需要对其进行取消缩放。

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 2013-12-13
    • 2021-07-30
    • 2019-09-07
    • 2019-09-10
    • 2016-01-15
    • 2018-12-31
    • 2017-09-20
    • 2017-08-20
    相关资源
    最近更新 更多