[英]Weights from linear SVM model (in R)?
使用kernlab
我已經使用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
))
要獲得偏差,只需使用全零的特征向量評估模型。 要獲得第一個特征的系數,請使用第一個位置為“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]))
如果我沒弄錯的話,我想你是在問如何提取SVM的W向量,其中W被定義為:
W = \sum_i y_i * \alpha_i * example_i
呃:不知道在這里寫方程式的最佳方法,但這只是權重*支持向量的總和。 計算W后,您可以提取所需特征的“權重”。
假設這是正確的,你會:
W
kernlab將支持向量索引及其值存儲在列表中(因此它也適用於多類問題),無論如何,使用列表操作只是為了獲取實際數據(您將看到返回的列表的長度)如果你只有一個2級問題, alpha
和alphaindex
只有1,我假設你這樣做。
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]]
如果我理解你的問題,這應該會讓你得到你想要的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.