R SVM alpha系数

4

我将尝试从一个PMML文件中重新创建R的SVM对象,但是我在理解R如何存储alpha系数方面遇到了麻烦。我目前正在使用鸢尾花数据集进行测试,并使用以下命令生成了一个R SVM对象。

library(e1071)
data(iris)
model<-svm(Species~.,data=iris)

我正在使用命令查看其系数

model$coefs

为了获得以下结果
            [,1]        [,2]
 [1,]  0.0890967  0.00000000
 [2,]  0.0000000  0.14547777
 [3,]  0.8651998  0.94869969
 [4,]  0.0000000  0.13152589
 [5,]  0.0000000  0.27612243
 [6,]  0.8421469  0.45912899
 [7,]  0.4785865  0.00000000
 [8,]  1.0000000  1.00000000
 [9,] -0.4941407  1.00000000
[10,]  0.0000000  1.00000000
[11,]  0.0000000  0.63848160
[12,]  0.0000000  1.00000000
[13,]  0.0000000  1.00000000
[14,] -0.5471576  0.00000000
[15,]  0.0000000  0.52796849
[16,] -0.3772321  0.49504241
[17,]  0.0000000  1.00000000
[18,]  0.0000000  1.00000000
[19,] -0.1146136  1.00000000
[20,]  0.0000000  1.00000000
[21,]  0.0000000  1.00000000
[22,]  0.0000000  1.00000000
[23,]  0.0000000  1.00000000
[24,]  0.0000000  1.00000000
[25,]  0.0000000  1.00000000
[26,]  0.0000000  1.00000000
[27,] -0.7418858  0.10024212
[28,]  0.0000000  1.00000000
[29,]  0.0000000  0.60104219
[30,] -1.0000000  0.00000000
[31,] -0.8335805 -1.00000000
[32,]  0.0000000 -0.05538514
[33,]  0.0000000 -1.00000000
[34,]  0.0000000 -1.00000000
[35,] -0.6171002  0.00000000
[36,] -0.3564736 -1.00000000
[37,]  0.0000000 -1.00000000
[38,]  0.0000000 -1.00000000
[39,]  0.0000000 -1.00000000
[40,]  0.0000000 -1.00000000
[41,]  0.0000000 -1.00000000
[42,]  0.0000000 -1.00000000
[43,] -0.6609450 -0.78275762
[44,]  0.0000000 -1.00000000
[45,]  0.0000000 -1.00000000
[46,]  0.0000000 -1.00000000
[47,]  0.0000000 -1.00000000
[48,]  0.0000000 -0.52463404
[49,]  0.0000000 -1.00000000
[50,] -0.4928554  0.00000000
[51,]  0.0000000 -1.00000000

据我理解,有51个支持向量,由于R使用一对一的多类SVM,因此实际上有三个分类器(山鸢尾v. 变色鸢尾,山鸢尾v. 维吉尼亚变色鸢尾和变色鸢尾v. 维吉尼亚变色鸢尾),每个分类器都使用其中的一部分向量。 我如何知道此coefs列表中的哪些系数对应于哪个分类器(以及每个分类器使用哪些支持向量)?
我看到model$nSV告诉您每个分类器中有多少个支持向量,但它并没有指定哪些支持向量实际上是分类器的一部分。 预先感谢您的帮助。
1个回答

1

是的,libsvm(r使用的库)保留支持向量的方式有点“神秘”。为了更好地理解,让我们只使用花瓣特征,这样我们可以后续可视化。

library(e1071)
data(iris)

fit=svm(Species~Petal.Length+Petal.Width, data=iris, kernel = "linear", cost = 10, scale=F)

“alphas time ys” 存储在 coef 矩阵中。要知道每个类与多少个支持向量相关,请查看:
n = fit$nSV; n

在我的运行中,有1、8和8。这意味着第一个n[1] (1) SV只与第一类相关。对于前n[1]行,列是1vs2、1vs3。对于接下来的n[2]行,列是2vs1、2vs3。注意,某些值可能为0。在我的运行中,第2类-列1中7/8的值为0,因为你只需要1个点来分离第1类和第2类。
如果我们想要提取1 vs. 3的分离平面,我们需要按照以下步骤进行:
# class 1 vs. 3
# class 1 has n[1] SV, class 3 has n[3]
# rows of n[1], column 2 = [1vs2, 1vs3*]
# rows of n[3], column 1 = [3vs1*, 3vs2]
coef1 = c(fit$coefs[1:n[1],2],fit$coefs[(sum(n[1:2])+1):sum(n),1])
SVs1 = rbind(fit$SV[1:n[1],],fit$SV[(sum(n[1:2])+1):sum(n),])
w1 = t(SVs1)%*%coef1
# rho stores the b's, [1vs2, 1vs3, 2vs3]
b1 = -fit$rho[2]

绘图(仅限1和3类):
iris.norm = iris[, c('Petal.Length', 'Petal.Width')]
plot(rbind(iris.norm[1:50,],iris.norm[101:150,]), col=iris$Species)
abline(-b1/w1[2], -w1[1]/w1[2], col=4)

图片:

enter image description here


谢谢。iris.norm = iris[, c('Petal.Length', 'Petal.Width')]是吗? - chan1142
谢谢。iris.norm = iris[, c('Petal.Length', 'Petal.Width')]是吗? - undefined
@chan1142 是的,我猜我忘记写这个了。不确定为什么我称它为“norm”。 - Maverick Meerkat
@chan1142 是的,我想我忘了写这个。不确定为什么我称它为“norm”。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接