e1071 libsvm에 문제가 있습니까?


13

두 개의 겹치는 클래스, 각 클래스의 7 점, 2 차원 공간에있는 데이터 세트가 있습니다. R에서는 패키지 svm에서 실행 e1071하여 이러한 클래스에 대한 분리 초평면을 작성합니다. 다음 명령을 사용하고 있습니다.

svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

여기서 x내 데이터 요소와 y레이블이 포함되어 있습니다. 이 명령은 svm 객체를 반환합니다.이 객체 는 분리 초평면의 매개 변수 (정규 벡터) 및 (절편) 를 계산하는 데 사용됩니다 .bwb

아래 그림 (a)는 내 요점과 svm명령에 의해 반환 된 초평면을 보여줍니다 (이 초평면을 최적의 것으로 부르겠습니다). 기호 O가있는 파란색 점은 공간 원점을 나타내고, 점선은 여백을 나타내고, 원은 0이 아닌 (느슨한 변수) 를 갖는 점입니다 .ξ

그림 (b)는 또 다른 초평면을 보여 주며, 이는 최적의 1을 5로 병렬 변환 한 것이다 (b_new = b_optimal-5). 이 초평면에 대해 목적 함수 (C- 분류 svm으로 최소화 됨)가 그림에 표시된 최적 초평면보다 값이 낮다는 것을 ( ㅏ). 이 기능에 문제가있는 것 같 습니까? 아니면 어딘가에 실수를 했습니까?

0.5||w||2+costξi
svm

여기에 이미지 설명을 입력하십시오

아래는이 실험에서 사용한 R 코드입니다.

library(e1071)

get_obj_func_info <- function(w, b, c_par, x, y) {
    xi <- rep(0, nrow(x))

    for (i in 1:nrow(x)) {
        xi[i] <- 1 - as.numeric(as.character(y[i]))*(sum(w*x[i,]) + b)
        if (xi[i] < 0) xi[i] <- 0
    }

    return(list(obj_func_value = 0.5*sqrt(sum(w * w)) + c_par*sum(xi), 
                    sum_xi = sum(xi), xi = xi))
}

x <- structure(c(41.8226593092589, 56.1773406907411, 63.3546813814822, 
66.4912298720281, 72.1002963174962, 77.649309469458, 29.0963054665561, 
38.6260575252066, 44.2351239706747, 53.7648760293253, 31.5087701279719, 
24.3314294372308, 21.9189647758150, 68.9036945334439, 26.2543850639859, 
43.7456149360141, 52.4912298720281, 20.6453186185178, 45.313889181287, 
29.7830021158501, 33.0396571934088, 17.9008386892901, 42.5694092520593, 
27.4305907479407, 49.3546813814822, 40.6090664454681, 24.2940422573947, 
36.9603428065912), .Dim = c(14L, 2L))

y <- structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("-1", "1"), class = "factor")

a <- svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

w <- t(a$coefs) %*% a$SV;
b <- -a$rho;

obj_func_str1 <- get_obj_func_info(w, b, 50000, x, y)
obj_func_str2 <- get_obj_func_info(w, b - 5, 50000, x, y)

비용 매개 변수를 조정 했습니까?
Etienne Racine

BUGS 태그는 소프트웨어 문제가 아니라 Gibbs 샘플링을 사용한 베이지안 추론을 나타냅니다. 태그를 제거했습니다.
Sycorax는 Reinstate Monica

답변:


5

libsvm FAQ에는 알고리즘 "내부"에 사용 된 레이블이 사용자의 레이블과 다를 수 있다고 언급되어 있습니다. 이것은 때때로 모델의 "코프 (coef)"의 부호를 반대로 바꿉니다.

예를 들어, 레이블이있는 경우 의 첫 번째 레이블 인 "-1"은 libsvm을 실행하기 위해 로 분류됩니다. 분명히, 당신의 "+1"은 알고리즘 내에서 로 분류 될 것 입니다.y + 1 1y=[1,+1,+1,1,...]y+11

그리고 반환 된 svm 모델의 는 실제로 이므로 계산 된 벡터는 의 부호가 반전되어 영향을받습니다 . w yαnynwy

"예상 레이블 및 결정 값의 부호가 때때로 반전되는 이유"질문을 참조하십시오. 여기 .


4

MATLAB에서 LIBSVM을 사용하여 동일한 문제가 발생했습니다. 이를 테스트하기 위해 한 축을 따라 약 -100으로 변환되는 매우 간단한 2D 선형 분리 가능 데이터 세트를 작성했습니다. LIBSVM을 사용하여 선형 svm을 훈련하면 인터셉트가 여전히 제로 근처에있는 하이퍼 플레인이 생성되었습니다 (따라서 오류율은 자연스럽게 50 %였습니다). 결과 svm이 여전히 완벽하게 수행되지는 않지만 데이터 표준화 (평균 빼기)가 도움이되었습니다. LIBSVM은 축을 중심으로 하이퍼 플레인을 변환하지 않고 회전시키는 것처럼 보입니다. 아마도 데이터에서 평균을 빼려고 시도하지만 LIBSVM이 이런 식으로 작동하는 것은 이상해 보입니다. 아마도 우리는 무언가를 놓치고있을 것입니다.

가치가있는 것을 위해 내장 된 MATLAB 함수 svmtrain는 표준화없이 100 % 정확도를 가진 분류기를 생성했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.