มีปัญหากับ e1071 libsvm?


13

ฉันมีชุดข้อมูลที่มีสองคลาสที่ทับซ้อนกันเจ็ดจุดในแต่ละชั้นคะแนนอยู่ในพื้นที่สองมิติ ใน R และฉันกำลังเรียกใช้svmจากe1071แพคเกจเพื่อสร้างการแยกไฮเปอร์เพลนสำหรับคลาสเหล่านี้ ฉันใช้คำสั่งต่อไปนี้:

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

ที่xมีจุดข้อมูลของฉันและyมีป้ายกำกับของพวกเขา คำสั่งส่งกลับ svm-object ซึ่งฉันใช้ในการคำนวณพารามิเตอร์ (เวกเตอร์ปกติ) และ (สกัดกั้น) ของการแยกไฮเปอร์เพลนwb

รูปที่ (a) ด้านล่างแสดงคะแนนของฉันและไฮเปอร์เพลนที่ส่งคืนโดยsvmคำสั่ง จุดสีน้ำเงินที่มีสัญลักษณ์ O แสดงที่มาของพื้นที่เส้นประแสดงขอบระยะทางวงกลมคือจุดที่ไม่เป็นศูนย์ (ตัวแปรสแลค)ξ

รูปที่ (b) แสดงไฮเปอร์เพลนอีกอันหนึ่งซึ่งเป็นการแปลแบบขนานที่ดีที่สุดด้วย 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 อ้างถึงการอนุมานแบบเบย์โดยใช้การสุ่มตัวอย่างแบบกิ๊บส์ไม่ใช่ปัญหาซอฟต์แวร์ ฉันลบแท็กแล้ว
Sycorax พูดว่า Reinstate Monica

คำตอบ:


5

ใน libsvm FAQ ถูกกล่าวถึงว่าป้ายกำกับที่ใช้ "ภายใน" อัลกอริทึมอาจแตกต่างจากของคุณ บางครั้งสิ่งนี้จะกลับเครื่องหมายของ "coefs" ของแบบจำลอง

ตัวอย่างเช่นหากคุณมีป้ายกำกับดังนั้นป้ายกำกับแรกในซึ่งก็คือ "-1" จะถูกจัดประเภทเป็นสำหรับการเรียกใช้ libsvm และแน่นอน "+1" ของคุณจะถูกจัดประเภทเป็นภายในอัลกอริทึมy + 1 - 1y=[1,+1,+1,1,...]y+11

และจำได้ว่า coefs ในรูปแบบ SVM กลับแน่นอนและเพื่อให้คุณคำนวณเวกเตอร์จะได้รับผลกระทบเนื่องจากการพลิกกลับของสัญลักษณ์ของ 's w yαnynwy

ดูคำถาม "ทำไมเครื่องหมายของป้ายกำกับที่คาดการณ์และค่าการตัดสินใจบางครั้งจึงกลับด้าน" ที่นี่


4

ฉันพบปัญหาเดียวกันกับ LIBSVM ใน MATLAB ในการทดสอบนั้นฉันได้สร้างชุดข้อมูล 2D เชิงเส้นที่แยกได้ซึ่งง่ายต่อการแปลซึ่งถูกแปลไปตามแกนหนึ่งเพื่อประมาณ -100 การฝึกอบรม svm เชิงเส้นโดยใช้ LIBSVM สร้างไฮเปอร์เพลนซึ่งการสกัดกั้นยังคงอยู่ที่ประมาณศูนย์ (และดังนั้นอัตราความผิดพลาดจึงอยู่ที่ 50% ตามธรรมชาติ) การทำให้ข้อมูลเป็นมาตรฐาน (การลบค่าเฉลี่ย) ช่วยแม้ว่าค่า svm ที่ได้ยังไม่ได้ผลอย่างสมบูรณ์แบบ ... น่างง ดูเหมือนว่า LIBSVM จะหมุนไฮเพอร์เพลทรอบแกนเท่านั้นโดยไม่ต้องแปลมัน บางทีคุณควรลองลบค่าเฉลี่ยออกจากข้อมูลของคุณ แต่ดูเหมือนว่า LIBSVM จะทำงานแบบนี้ บางทีเราอาจจะพลาดอะไรซักอย่าง

สำหรับสิ่งที่คุ้มค่าฟังก์ชั่น MATLAB ในตัวsvmtrainผลิตลักษณนามที่มีความแม่นยำ 100% โดยไม่มีมาตรฐาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.