2009-11-18 10 views
6

지원 벡터 머신 (SVM)을 수행하기 위해 kernlab R 패키지를 사용하려고합니다. 나의 아주 간단한 예를 들어, 나는 두 가지 훈련 데이터를 가지고있다. A와 BR에서 kernlab의 SVM에 대해 predict()를 사용하는 데 도움이됩니까?

(A 및 B 타입 matrix로 - 그들은 그래프의 인접 행렬이다.)

그래서 I는 A + B를 취하고 커널 행렬을 생성하는 기능을 썼다.

> km 
     [,1]  [,2] 
[1,] 14.33333 18.47368 
[2,] 18.47368 38.96053 

지금 내 예측 모델을 생성하는 kernlabksvm 기능을 사용하십시오. 지금 당장은 제대로 작동하지 않으려 고 노력하고 있습니다. 훈련 오류 등을 걱정하지 않아도됩니다.

그래서 질문 1 : 모델을 올바르게 생성합니까? 알 겠어?

# y are my classes. In this case, A is in class "1" and B is in class "-1" 
> y 
[1] 1 -1 

> model2 = ksvm(km, y, type="C-svc", kernel = "matrix"); 
> model2 
Support Vector Machine object of class "ksvm" 

SV type: C-svc (classification) 
parameter : cost C = 1 

[1] " Kernel matrix used as input." 

Number of Support Vectors : 2 

Objective Function Value : -0.1224 
Training error : 0 

지금까지 그렇게 좋았습니다. 커스텀 커널 행렬을 생성 한 다음, 그 행렬을 사용하여 ksvm 모델을 생성했습니다. 우리는 "1"과 "-1"이라고 표시된 교육 데이터를 가지고 있습니다.

지금 예측하는 :

> A 
    [,1] [,2] [,3] 
[1,] 0 1 1 
[2,] 1 0 1 
[3,] 0 0 0 

> predict(model2, A) 
Error in as.matrix(Z) : object 'Z' not found 

어 - 오. 괜찮아. 일종의, 정말로. "예측"은 행렬이 아닌 일종의 벡터를 원합니다.

그래서 몇 가지를 시도 할 수 있습니다 :

> predict(model2, c(1)) 
Error in as.matrix(Z) : object 'Z' not found 
> predict(model2, c(1,1)) 
Error in as.matrix(Z) : object 'Z' not found 
> predict(model2, c(1,1,1)) 
Error in as.matrix(Z) : object 'Z' not found 
> predict(model2, c(1,1,1,1)) 
Error in as.matrix(Z) : object 'Z' not found 
> predict(model2, km) 
Error in as.matrix(Z) : object 'Z' not found 

위의 테스트 중 일부는 무의미한하지만 그건 내 포인트입니다 : 아무리 내가 뭘, 그냥보고) (예측할 얻을 수없는 내 데이터 및 예측. 스칼라가 작동하지 않으면 벡터가 작동하지 않습니다. 2x2 행렬이 작동하지 않으며 3x3 행렬도 작동하지 않습니다.

내가 뭘 잘못하고 있니?

(나는 다음 내 테스트 데이터가 제정신/합리적인/수학적 사운드 방법으로 해당 형식에 부합 할 수 있는지 확인 할 수 원하는 ksvm 알아낼되면.)

답변

21

지원 벡터 머신이 커널 매트릭스를 "사용"할 수 있다고 생각하면 시도하는 방식으로 실제로 이것을 수행 할 수 없음을 알 수 있습니다 (:-)

커넬랩 (kernlab) + 커널 매트릭스를 처음 사용했을 때 저는 실제로 이것으로 조금 어려움을 겪었습니다 ... 우연히도 그래프 커널을 위해서였습니다!

어쨌든 SVM이 커널 함수를 계산하는 방법을 모르기 때문에 새로운 값 (테스트) 예제와 지원 벡터로 선택되는 예제 사이에서 이미 계산 된 값을 SVM이 가지고 있어야한다는 것을 먼저 알아 봅시다 훈련 단계에서.

따라서 에 대한 커널 행렬을 계산해야합니다. 모든 예제는입니다. 필요한 경우 커널 행렬에서 행 + 열을 제거하여 나중에 다른 행렬을 테스트하고 다른 행렬을 테스트 할 것이다. 코드를 보여 드리겠습니다.

우리는 일부 데이터와 함께 우리의 작업 공간을로드 할 ksvm 문서의 예제 코드를 사용할 수 있습니다 :

library(kernlab) 
example(ksvm) 

당신은 플롯을 그릴 수 있도록하기 위해 몇 가지 (2) 번 리턴 공격해야합니다, 예제를 끝내 겠지만 작업 공간에 K이라는 커널 행렬을 가져야합니다. 테스트

에 사용할 선택, 이제

y <- matrix(c(rep(1,60),rep(-1,60))) 

예제의 일부를 우리는 (이 예에서 다른 코드에 의해 이상 짓밟 된대로) 그것의 라벨에 사용해야하는 y 벡터를 복구해야합니다 이 시점에서

holdout <- sample(1:ncol(K), 10) 

, 내가 갈거야 :

  1. 원래 K 커널 매트릭스에서 trainK라는 교육 커널 행렬을 만듭니다. 내 훈련
  2. 사용을 테스트 커널 매트릭스 testK을 만들 모델에서 발견 된 지원 벡터 trainK 설정에서
  3. 는 SVM 모델을 만들기 ...이 이상한 부분입니다. kernlab에있는 코드를보고 지원 벡터 인덱스를 사용하는 방법을 확인하면 왜 이런 식으로 처리되는지 확인할 수 있습니다. 이 방법을 사용하는 것이 가능할 수도 있지만, 에서 커널 매트릭스가있는을 예측하는 문서/예제를 보지 못했습니다. 따라서 여기서 "어려운 방법"을 수행하고 있습니다. 단지에 대해 그것을해야

    trainK <- as.kernelMatrix(K[-holdout,-holdout]) # 1 
    m <- ksvm(trainK, y[-holdout], kernel='matrix') # 2 
    testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F]) # 3 
    preds <- predict(m, testK) # 4 
    sum(sign(preds) == sign(y[holdout]))/length(holdout) # == 1 (perfect!) 
    

    :

  4. 사용하여 SVM 이러한 기능에 예측 정확도를

를보고 여기에 코드입니다. 행운을 빕니다!

응답은 K [-holdout이 -holdout] 무엇을 의미 하는가

아래에 댓글을? ("-"는 무엇을 의미합니까?)

것은 당신이 벡터 x을 가지고, 당신이 그것을의 요소 1, 3, 5를 검색하려는 상상해, 당신은 할 줄 :

x.sub <- x[c(1,3,5)] 

당신이 x에서 모든 것을 검색 할 경우 요소 1, 3, 5를 제외하고, 당신이 할 것 :

x.sub <- x[-c(1,3,5)] 

그래서 K[-holdout,-holdout] 반환 모든 행과의 열을제외하고자하는 행에 대해서는입니다.

당신의 as.kernelMatrix의 주장은 무엇인가 - (? 그 전체 브래킷 K의 행렬 지수는 것처럼 보이기 때문에 particulary 이상하다) 특히 인수 [SVindex (m) = F 드롭]

그래, 난 하나에 두 개의 명령을 인라인 :

testK <- as.kernelMatrix(K[holdout, -holdout][,SVindex(m), drop=F]) 

이제 모델을 훈련 한 것을, 당신은 당신의 테스트 예제와 함께 그것에게 새로운 커널 행렬을주고 싶다. K[holdout,]은 훈련 예제에 해당하는 행만 K, 모든 열은 K입니다.

SVindex(m)원래 훈련 매트릭스에서 당신에게 당신의 지원 벡터의 인덱스를 제공합니다 - 기억, 그 행/COLS는 holdout을 제거했습니다. 따라서 올바른 열 인덱스 (예 : 올바른 sv 열 참조)를 얻으려면 먼저 holdout 열을 제거해야합니다.

어쨌든, 아마도이 더 분명하다

testK <- K[holdout, -holdout] 
testK <- testK[,SVindex(m), drop=FALSE] 

지금 testK는 우리의 테스트 예과 지원 벡터에 해당하는 컬럼의 행이 있습니다. testK[1,1]은 첫 번째 테스트 예제와 첫 번째 지원 벡터 사이에서 계산 된 커널 함수의 값을 갖습니다. testK[1,2]

업데이트 (2014년 1월 30일가) I 이후 시간이 지났는데

@wrahool에서 코멘트에 대답하는 등 당신의 첫번째 시험 예 및 제 2지지 벡터 사이의 커널 함수의 값을 갖게됩니다 이 연주했습니다 ', 그래서 kernlab::ksvm의 내역은 약간 녹슨하지만, 원칙적으로이 올바른 :-)해야 ... 여기 간다 :

testK <- K[holdout, -holdout]의 요점이 무엇인지

가 - 아니 당신이 제거된다 테스트 집합에 해당하는 열은 무엇입니까?

예. 짧은 대답은 커널 행렬을 사용하여 predict을 원한다면 rows 크기의 행렬을 support vectors으로 제공해야한다는 것입니다. 행렬의 각 행 (예측하려는 새 예제)에 대해 열의 값은 해당 예제와 지원 벡터 사이에서 평가 된 커널 행렬의 값입니다.

SVindex(m)을 호출하면 훈련 데이터의 차원에 주어진 지원 벡터의 색인이 반환됩니다.

따라서 먼저 testK <- K[holdout, -holdout]을 수행하면 예측할 예제의 행이있는 testK 행렬이 표시되고 열은 모델을 학습 한 동일한 예제 (차원)에서 가져옵니다.

testK의 열을 SVindex(m)으로 서브 세트하여 (현재) 내 지원 벡터에 해당하는 열만 제공합니다. 첫 번째 [, -holdout] 선택을 완료하지 않은 경우 SVindex(m)에 의해 반환 된 색인은 테스트 예제 중 모두 N이 행렬의 마지막 N 열이 아닌 한 올바른 예제와 일치하지 않을 수 있습니다.

또한 정확히 drop = FALSE 조건은 무엇을 수행합니까?

색인 생성 작업이 수행 된 후 반환되는 개체의 색인이 생성 된 개체와 동일한 유형의 방어 코딩이 필요합니다.

R에서는 2D (또는 그 이상) 객체의 한 차원 만 색인하면 하위 차원의 객체가 반환됩니다. 그것은 matrix

예를 들어 가지고 싶어하기 때문에 나는

x <- matrix(rnorm(50), nrow=10) 

class(x) 
[1] "matrix" 

dim(x) 
[1] 10 5 

y <- x[, 1] 

class(y) 
[1] "numeric" 

dim(y) 
NULL 

같은이 data.frame의 일이 일어날 등

+0

좋아요, 그래서 작성한 코드를 실행했고 작동합니다! 그러나 나는 그것이 무엇을하는지 이해하는 데 약간의 어려움을 겪고있다. K [-noldout, -holdout]의 의미는 무엇입니까? ("-"는 무엇을 의미합니까?) as.kernelMatrix의 인수는 무엇입니까 - 특히 [, SVindex (m), drop = F] 인수 (전체 대괄호가 행렬 색인 인 것처럼 보이기 때문에 특히 이상합니다. K의?) – poundifdef

+0

길었던 이래로, 나는 나의 최초의 지위에서 당신의 설명에 답했다 - 아래 이분의 일을 읽었다. 더 많은 질문이 있으면 언제든지 r-help 목록을 방문하여 더 많은 질문을 할 수 있습니다. 마지막으로, 내 대답이 귀하의 질문에 대한 답이된다면, 그것을 그대로 표기하는 것을 잊지 마십시오 ;-) –

+0

Dude. 너는 너무 많이 흔들어. 고맙습니다! – poundifdef

2

첫째, 내가 가진 사용되지 않습니다 kernlab 많이. 그러나 단순히 문서를보고, 난 predict.ksvm() 메서드에 대한 작업 예제를 참조하십시오. 복사 및 붙여 넣기, 화면에 인쇄를 생략 : 생성하기 위해 무작위 표본 추출을 사용하는 훈련이 predict() 방법 genetrain 다음 ksvm을 통해 피팅의 보완 genetest 및 전화를 설정 : 꽤 똑바로 끈으로 묶인 것

## example using the promotergene data set 
data(promotergene) 

## create test and training set 
ind <- sample(1:dim(promotergene)[1],20) 
genetrain <- promotergene[-ind, ] 
genetest <- promotergene[ind, ] 

## train a support vector machine 
gene <- ksvm(Class~.,data=genetrain,kernel="rbfdot",\ 
       kpar=list(sigma=0.015),C=70,cross=4,prob.model=TRUE) 

## predict gene type probabilities on the test set 
genetype <- predict(gene,genetest,type="probabilities") 

맞춤을 사용하고 새 데이터를 일치하는 형식으로 표시합니다. 이것은 매우 표준입니다.

Max Kuhn의 caret 패키지가 유용 할 수 있습니다. kernlab을 포함하여 다양한 회귀, 분류 및 기계 학습 방법 및 패키지에 대한 일반적인 평가 및 테스트 프레임 워크를 제공하며 여러 개의 비 네트 및 JSS paper을 포함합니다.

+0

맞습니다 - 나도 미리 읽고 있었습니까? 이 예에서는 ksvm()에 커널 함수 ("rbfdot")와 교육 데이터 ("genetrain")를 전달합니다.필자의 경우 입력은 커널 매트릭스이므로 ksvm()에는 "데이터"매개 변수가 없으므로 교육 데이터 구조와 테스트 데이터 구조 사이에 명확한 매핑이 없습니다. – poundifdef

+1

궁금하신 분은 그래프 커널을 R에 구현하려고합니다. 벡터 데이터를 분류하는 대신 그래프 데이터를보고 있습니다. 따라서 커널 함수는 무작위로 걷는 횟수를보고 두 그래프 사이의 "거리"를 결정합니다. – poundifdef

1

스티브 Lianoglou이 옳다 predictnumeric 벡터를 통과하고 싶지 않아 .

kernlab에서는 kernlab이 약간 유선이며 예측할 때 각 테스트 예제와 지원 벡터 사이에 입력 커널 행렬이 필요합니다. 이 행렬을 직접 찾아야합니다.

예를 들어 테스트 매트릭스 [n x m]. 여기서 n은 테스트 샘플의 수이고, m은 학습 된 모델의 지원 벡터 수입니다 (SVindex (모델) 순서로 정렬 됨).

예 코드

trmat <- as.kernelMatrix(kernels[trainidx,trainidx]) 
tsmat <- as.kernelMatrix(kernels[testidx,trainidx]) 

#training 
model = ksvm(x=trmat, y=trlabels, type = "C-svc", C = 1) 

#testing 
thistsmat = as.kernelMatrix(tsmat[,SVindex(model)]) 
tsprediction = predict(model, thistsmat, type = "decision") 

커널 입력 커널 행렬이다. trainidx 및 testidx는 교육 및 테스트를위한 ID입니다.

0

솔루션 요소에서 직접 레이블을 만드십시오. 원래 트레이닝 포맷 (d)에 ksvm 모델 (m)와 데이터를 얻어이 대체 예측 방법

predict.alt <- function(m, d){ 
    sign(d[, [email protected]] %*% [email protected][[1]] - [email protected]) 
} 

K 훈련 용 kernelMatrix 인을 사용한다. 유효성 검사를 위해 훈련 데이터에서 predict.alt을 실행하면 대체 예측기 방법이 ksvm이 반환 한 적합 값과 함께 값을 전환한다는 것을 알게됩니다. 원시 예측자는 예기치 않은 방식으로 작동합니다.

aux <- data.frame([email protected], native=predict(kout, K), alt=predict.alt(m=kout, d=as.matrix(K))) 
sample_n(aux, 10) 
    fit native alt 
1  0  0 -1 
100 1  0 1 
218 1  0 1 
200 1  0 1 
182 1  0 1 
87 0  0 -1 
183 1  0 1 
174 1  0 1 
94 1  0 1 
165 1  0 1