문제

사용 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
))
도움이 되었습니까?

해결책

바이어스를 얻으려면 모든 0의 기능 벡터로 모델을 평가하십시오. 첫 번째 기능의 계수를 얻으려면 첫 번째 위치에 "1"을 갖는 기능 벡터로 모델을 평가하고 다른 곳에서 0을 평가 한 다음 이미 알고있는 바이어스를 빼십시오. 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

UGH : 여기에 방정식을 작성하는 가장 좋은 방법을 모르지만 이것은 단지 가중치 *지지 벡터의 합입니다. W를 계산 한 후 원하는 기능에 대한 "무게"를 추출 할 수 있습니다.

이것이 정확하다고 가정하면 : 당신은 다음과 같습니다.

  1. 지원 벡터 인 데이터 지수를 얻으십시오.
  2. 무게를 얻으십시오 (알파)
  3. 계산하다 W

Kernlab은 지원 벡터 지수와 그 값을 목록에 저장합니다 (따라서 멀티 클래스 문제에 대해서도 작동 함). 어쨌든 목록 조작을 사용하는 것은 실제 데이터를 얻는 것입니다 (당신은 alpha 그리고 alphaindex 2 급 문제가있는 경우 단 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 실제로 작업을 수행하기 전에 먼저 데이터를 조정합니다. 당신은 SO와 같은 (스케일링 된) 무게를 얻을 수 있습니다 (어디에서, 편견은 0 (?)이어야합니다).

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

내가 당신의 질문을 이해한다면, 이것은 당신이 당신을 따르는 것을 얻을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top