代码之家  ›  专栏  ›  技术社区  ›  Ken Williams Dirk is no longer here

线性支持向量机模型的权重(R)?

svm r
  •  4
  • Ken Williams Dirk is no longer here  · 技术社区  · 15 年前

    使用 kernlab 我用如下代码培训了一个模型:

    my.model <- ksvm(result ~ f1+f2+f3, data=gold, kernel="vanilladot")
    

    因为它是一个线性模型,所以我更喜欢在运行时将分数计算为特征值的简单加权和,而不是使用完整的SVM机制。如何将模型转换为类似的类型(此处为一些组合权重):

    > c(.bias=-2.7, f1=0.35, f2=-0.24, f3=2.31)
    .bias    f1    f2    f3 
    -2.70  0.35 -0.24  2.31 
    

    在哪里? .bias 偏差项和其余项是特征权重吗?

    编辑:

    下面是一些示例数据。

    gold <- structure(list(result = c(-1, -1, -1, -1, -1, -1, -1, -1, -1, 
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), f1 = c(0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 
    1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1), f2 = c(13.4138113499447, 
    13.2216999857095, 12.964145772169, 13.1975227965938, 13.1031520152764, 
    13.59351759447, 13.1031520152764, 13.2700658838026, 12.964145772169, 
    13.1975227965938, 12.964145772169, 13.59351759447, 13.59351759447, 
    13.0897162110721, 13.364151238365, 12.9483051847806, 12.964145772169, 
    12.964145772169, 12.964145772169, 12.9483051847806, 13.0937231331592, 
    13.5362700880482, 13.3654209223623, 13.4356400945176, 13.59351759447, 
    13.2659406408724, 13.4228886221088, 13.5103065354936, 13.5642812689161, 
    13.3224757352068, 13.1779418771704, 13.5601730479315, 13.5457299603578, 
    13.3729010596517, 13.4823595997866, 13.0965264603473, 13.2710281801434, 
    13.4489887206797, 13.5132372154748, 13.5196188787197), f3 = c(0, 
    1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
    0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0)), .Names = c("result", 
    "f1", "f2", "f3"), class = "data.frame", row.names = c(NA, 40L
    ))
    
    2 回复  |  直到 15 年前
        1
  •  7
  •   dmazzoni    15 年前

    要获得偏差,只需使用所有零的特征向量来评估模型。为了得到第一个特征的系数,用特征向量评估模型,在第一个位置上有一个“1”,在其他地方都是零,然后减去你已经知道的偏差。恐怕我不知道R语法,但从概念上讲,你需要这样的东西:

    bias = my.model.eval([0, 0, 0])
    f1 = my.model.eval([1, 0, 0]) - bias
    f2 = my.model.eval([0, 1, 0]) - bias
    f3 = my.model.eval([0, 0, 1]) - bias
    

    要测试您是否正确执行了此操作,可以尝试如下操作:

    assert(bias + f1 + f2 + f3 == my.model.eval([1, 1, 1]))
    
        2
  •  4
  •   Steve Lianoglou    15 年前

    如果我没弄错,我想你在问如何提取SVM的W向量,其中W定义为:

    W = \sum_i y_i * \alpha_i * example_i
    

    呃:不知道在这里写方程的最佳方法,但这只是权值*支持向量的总和。计算w后,可以提取所需功能的“权重”。

    假设这是正确的,您将:

    1. 获取作为支持向量的数据索引
    2. 获得他们的体重(阿尔法)
    3. 计算 W

    kernlab将支持向量索引及其值存储在一个列表中(因此它也适用于多类问题),无论如何,使用列表操作只是为了获取实际数据(您将看到 alpha alphaindex 如果你只有一个二级问题,我假设你有。

    my.model <- ksvm(result ~ f1+f2+f3, data=gold, kernel="vanilladot", type="C-svc")
    alpha.idxs <- alphaindex(my.model)[[1]]  # Indices of SVs in original data
    alphas <- alpha(my.model)[[1]]
    y.sv <- gold$result[alpha.idxs]
    # for unscaled data
    sv.matrix <- as.matrix(gold[alpha.idxs, c('f1', 'f2', 'f3')])
    weight.vector <- (y.sv * alphas) %*% sv.matrix
    bias <- b(my.model)
    

    kernlab 实际上,在进行数据处理之前先对数据进行缩放。你可以得到这样的(缩放的)权重(我猜,这里的偏差应该是0(?)

    weight.vector <- (y.sv * alphas) %*% xmatrix(my.model)[[1]]
    

    如果我理解你的问题,这会让你得到你想要的。