2013-06-12 1 views
6

위도와 경도가 있으므로 RBF 커널을 exp (-1/2 || sophere distrance ||^2)로 다시 정의해야합니다. 즉 커널 함수를 직접 다시 작성해야합니다. 다음과 같이 내 커널을 쓰기 : 나는 기능을 테스트kernlab 패키지의 ksvm에서 커널 기능을 사용자 정의하는 방법은 무엇입니까?

round.kernel <- function(x,y){ 
    sigma <- 1 
    #R <- 6371 
    R <- 1 
    a <- (sin((x[1]-y[1])/2))^2+cos(x[1])*cos(y[1])*(sin((x[2]-y[2])/2))^2 
    c <- 2*atan2(sqrt(a),sqrt(1-a)) 
    d <- R*c 
    res <- exp(-d^2/(2*sigma)) 
    return (res) 
} 
class(round.kernel) <- "kernel" 

, 커널이 정확해야한다. 그러나 다음과 같은 훈련 명령으로 나는 오류를 얻고있다 :

fit <- ksvm(y=train[,2],x=train[,3:4],kernel=round.kernel,type='eps-svr') 

Error in .local(x, ...) : 
    List interface supports only the stringdot kernel. 

더 많은 trickly 것은, 내가 ksvm 문서의 예제 코드를 시도 :

k <- function(x,y) {(sum(x*y) +1)*exp(-0.001*sum((x-y)^2))} 
class(k) <- "kernel" 

을하지만이 같은 오류를 얻고있다.

누구나 올바르게 커널 기능을 정의하는 방법을 알고 있습니까?

+0

정말 도움이됩니다. 어떻게 커널 함수를 파생 시켰는지 설명 할 수 있습니까? 나는 exp (-1/2 || sphere distnace ||^2)와'res'를 어떻게 완성하는지 사이의 연결을 보지 못합니다. – momeara

+0

@momeara, 기본적으로 삼각형 함수를 기반으로한다고 생각합니다. 따라서 arctan, arcsin 또는 atan2와 같은 여러 가지 방법을 사용할 수 있습니다. 이 링크를 확인하십시오 : http://www.movable-type.co.uk/scripts/latlong.html –

+0

예제가 저에게 적합합니다. –

답변

6

내 문제는 다음과 같이 해결됩니다. 커널 코드가 정확합니다. 함수 (x, y)를 직접 정의하고 해당 클래스를 "커널"로 선언해야합니다. 문제는 ksvm이 x, y 스타일을 지원하는 문서에서도 실제로 작동하지 않는다는 것입니다. 공식 데이터 스타일로 변경하면 마지막 실행 일을 얻을 수 있습니다 :

fit <- ksvm(Freq~lat+lon,data=train[,2:4],kernel=roundrbf,type='eps-svr') 

또한, 나는 또한 소스 rbfdot의 코드 및 kernlab 자체에 정의 된 다른 커널을 참조하십시오. 그들의 코드 스타일이 다음과 같습니다 :

function(params){ 
    val <- function(x,y){ 
    # True kernel defined here 
    } 
    return (new ("kernel_name",.Data=val,kpar=list(params))) 
} 

심각하게, 나는이 방법으로 커널 기능을 만들지 않습니다. 작업 방식은 다음과 같은 스타일입니다.

k <- function(x,y){ 
    #calculate the result 
} 
class(k) <- "kernel" 
관련 문제