문제
사용 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를 계산 한 후 원하는 기능에 대한 "무게"를 추출 할 수 있습니다.
이것이 정확하다고 가정하면 : 당신은 다음과 같습니다.
- 지원 벡터 인 데이터 지수를 얻으십시오.
- 무게를 얻으십시오 (알파)
- 계산하다
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]]
내가 당신의 질문을 이해한다면, 이것은 당신이 당신을 따르는 것을 얻을 것입니다.