การเพิ่มประสิทธิภาพเครื่องเวกเตอร์สนับสนุนด้วยการเขียนโปรแกรม Quadratic


12

ฉันพยายามที่จะเข้าใจกระบวนการสำหรับการฝึกอบรมเชิงเส้นเครื่องเวกเตอร์การสนับสนุน ฉันรู้ว่าคุณสมบัติของ SMV ช่วยให้พวกเขาได้รับการปรับให้เร็วที่สุดมากกว่าการใช้ตัวแก้ปัญหาการเขียนโปรแกรมแบบสี่เหลี่ยมจัตุรัส แต่เพื่อจุดประสงค์ในการเรียนรู้

ข้อมูลการฝึกอบรม

set.seed(2015)
df <- data.frame(X1=c(rnorm(5), rnorm(5)+5), X2=c(rnorm(5), rnorm(5)+3), Y=c(rep(1,5), rep(-1, 5)))
df
           X1       X2  Y
1  -1.5454484  0.50127  1
2  -0.5283932 -0.80316  1
3  -1.0867588  0.63644  1
4  -0.0001115  1.14290  1
5   0.3889538  0.06119  1
6   5.5326313  3.68034 -1
7   3.1624283  2.71982 -1
8   5.6505985  3.18633 -1
9   4.3757546  1.78240 -1
10  5.8915550  1.66511 -1

library(ggplot2)
ggplot(df, aes(x=X1, y=X2, color=as.factor(Y)))+geom_point()

ป้อนคำอธิบายรูปภาพที่นี่

การหาระยะขอบสูงสุด Hyperplane

ตามบทความ Wikipedia นี้เกี่ยวกับ SVMsเพื่อค้นหาไฮเปอร์แม็กซ์ขอบที่ฉันต้องแก้ไข

yi(wxi-b)1

หาเรื่องนาที(W,)12W2
ภายใต้ (สำหรับ i = 1, ... , n)
Yผม(Wxผม-)1

ฉันจะ 'เสียบ' ข้อมูลตัวอย่างของฉันลงในตัวแก้ QP ใน R (เช่นquadprog ) เพื่อกำหนดอย่างไรW


คุณต้องแก้ปัญหาสองอย่าง

2
@fcop คุณสามารถทำอย่างละเอียด? คู่ในกรณีนี้คืออะไร? ฉันจะแก้ปัญหาการใช้งานได้Rอย่างไร? ฯลฯ
Ben

คำตอบ:


6

คำแนะนำ :

Quadprog แก้ปัญหาต่อไปนี้:

นาทีxdTx+1/2xTDxดังนั้น ATxx0

พิจารณา

x=(W)และ D=(ผม000)

ที่เป็นเมทริกซ์เอกลักษณ์ผม

ถ้าคือ และคือ :p × 1 y n × 1Wพี×1Yn×1

x:(2พี+1)×1D:(2พี+1)×(2พี+1)

ในบรรทัดที่คล้ายกัน:

x0=(11)n×1

กำหนดโดยใช้คำแนะนำด้านบนเพื่อแสดงถึงข้อจำกัดความไม่เท่าเทียมของคุณA


1
ฉันหลงทาง. สิ่งที่เป็น ? dT
เบ็น

1
สัมประสิทธิ์ของในฟังก์ชันวัตถุประสงค์ของคุณคืออะไร? ไม่ใช่แต่ ? W||W||22W
สิทธิ์เมื่อ

1
ขอบคุณสำหรับความช่วยเหลือ ฉันคิดว่าฉันคิดออก แต่เมื่อฉันตั้ง D = เมทริกซ์ที่คุณแนะนำquadprogคืนข้อผิดพลาด "เมทริกซ์ D ในฟังก์ชันสมการกำลังสองไม่แน่นอนแน่นอน!"
เบ็น

3
แฮ็ค: Perturb โดยการเพิ่มค่าเล็กน้อยพูดบนเส้นทแยงมุมD1อี-6
rightskewed

7

ทำตามคำแนะนำของ rightkewed ...

library(quadprog)

# min(−dvec^T b + 1/2 b^T Dmat b) with the constraints Amat^T b >= bvec)
Dmat       <- matrix(rep(0, 3*3), nrow=3, ncol=3)
diag(Dmat) <- 1
Dmat[nrow(Dmat), ncol(Dmat)] <- .0000001
dvec       <- rep(0, 3)
Amat       <- as.matrix(df[, c("X1", "X2")])
Amat <- cbind(Amat, b=rep(-1, 10))
Amat <- Amat * df$Y
bvec       <- rep(1, 10)
solve.QP(Dmat,dvec,t(Amat),bvec=bvec)

plotMargin <- function(w = 1*c(-1, 1), b = 1){
  x1 = seq(-20, 20, by = .01)
  x2 = (-w[1]*x1 + b)/w[2]
  l1 = (-w[1]*x1 + b + 1)/w[2]
  l2 = (-w[1]*x1 + b - 1)/w[2]
  dt <- data.table(X1=x1, X2=x2, L1=l1, L2=l2)
  ggplot(dt)+geom_line(aes(x=X1, y=X2))+geom_line(aes(x=X1, y=L1), color="blue")+geom_line(aes(x=X1, y=L2), color="green")+
    geom_hline(yintercept=0, color="red")+geom_vline(xintercept=0, color="red")+xlim(-5, 5)+ylim(-5, 5)+
    labs(title=paste0("w=(", w[1], ",", w[2], "), b=", b))
}

plotMargin(w=c(-0.5065, -0.2525), b=-1.2886)+geom_point(data=df, aes(x=X1, y=X2, color=as.factor(Y)))

ป้อนคำอธิบายรูปภาพที่นี่

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