วิธีสร้างเคอร์เนล perceptron อย่างง่าย?


10

ปัญหาการจัดหมวดหมู่ที่มีขอบเขตไม่เชิงเส้นไม่สามารถแก้ไขได้โดยง่ายตรอน รหัส R ต่อไปนี้มีวัตถุประสงค์เพื่อเป็นตัวอย่างและเป็นไปตามตัวอย่างนี้ใน Python):

nonlin <- function(x, deriv = F) {
  if (deriv) x*(1-x)
  else 1/(1+exp(-x))
}

X <- matrix(c(-3,1,
              -2,1,
              -1,1,
               0,1,
               1,1,
               2,1,
               3,1), ncol=2, byrow=T)

y <- c(0,0,1,1,1,0,0)

syn0 <- runif(2,-1,1)

for (iter in 1:100000) {
  l1 <- nonlin(X %*% syn0)
  l1_error <- y - l1
  l1_delta <- l1_error * nonlin(l1,T)
  syn0 <- syn0 + t(X) %*% l1_delta
}

print("Output After Training:")
## [1] "Output After Training:"
round(l1,3)
##       [,1]
## [1,] 0.488
## [2,] 0.468
## [3,] 0.449
## [4,] 0.429
## [5,] 0.410
## [6,] 0.391
## [7,] 0.373

ตอนนี้แนวคิดของเคอร์เนลและเคอร์เนลเคล็ดลับที่เรียกว่าคือการคาดการณ์พื้นที่อินพุตในพื้นที่มิติที่สูงขึ้นเช่น ( แหล่งที่มาของภาพ ):

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

คำถามของ
ฉันฉันจะใช้ประโยชน์จากเคอร์เนลเคล็ดลับ (เช่นกับ quadratic kernel ง่าย) เพื่อให้ฉันได้รับเคอร์เนล perceptronซึ่งสามารถแก้ปัญหาการจำแนกประเภทที่กำหนดได้อย่างไร โปรดทราบ: นี่เป็นคำถามเชิงแนวคิดเป็นส่วนใหญ่ แต่ถ้าคุณสามารถให้การแก้ไขรหัสที่จำเป็นได้

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

X <- matrix(c(-3,9,1,
              -2,4,1,
              -1,1,1,
               0,0,1,
               1,1,1,
               2,4,1,
               3,9,1), ncol=3, byrow=T)

y <- c(0,0,1,1,1,0,0)

syn0 <- runif(3,-1,1)

การเปิดเผยแบบเต็ม
ฉันโพสต์คำถามนี้เมื่อสัปดาห์ที่แล้วในSOแต่มันก็ไม่ได้รับความสนใจมากนัก ฉันสงสัยว่าที่นี่เป็นสถานที่ที่ดีกว่าเพราะเป็นคำถามเชิงแนวคิดมากกว่าคำถามการเขียนโปรแกรม

คำตอบ:


2

XX=X,X<,>:Rp×RpRk:Rp×RpR

K(xi,xj)=exp(||xixj||22σ2)

ดังที่ได้กล่าวไว้ในหน้า Wikipedia เกี่ยวกับ kernel perceptronเราเลือกเซตย่อยขนาดของอินพุตและใช้การรวมกันเชิงเส้นของมันเพื่อสร้างเอาต์พุตของเรา M

f(x)=iMαiyiK(x,xi)

หากคุณเห็นเครื่องสนับสนุนเวกเตอร์ ( SVM ) คุณจะสังเกตเห็นคู่ที่เหมือนกัน ในการเลือกเซตย่อยของขนาดจะใช้เราปรับให้เหมาะสมที่สุดซึ่งแสดงว่าตัวอย่างเป็นเวกเตอร์สนับสนุน / พื้นฐานของโซลูชันของเรา ในการเพิ่มประสิทธิภาพของเรารวมน้ำหนักของการเพิ่มประสิทธิภาพ perceptron ดั้งเดิมMαiiαiωi

สำหรับคำถามของคุณเกี่ยวกับการไม่ต้องคำนวณการฉายคุณถูกต้องเมทริกซ์ข้อมูลอินพุตของคุณยังคงเป็นสองมิติ ในการคำนวณผลลัพธ์เราแทนที่ผลิตภัณฑ์ dot ด้วยฟังก์ชันเคอร์เนลและนี่คือจุดที่การคำนวณ 'โดยนัย' ในพื้นที่คุณลักษณะเกิดขึ้นX



ขอบคุณ - บางทีคุณอาจทำให้คำตอบของคุณชัดเจนยิ่งขึ้นในแง่ที่คุณระบุว่าบรรทัดใดในโค้ดจากด้านบนต้องได้รับการแก้ไขด้วยวิธีใด หากคุณไม่ทราบว่า R สามารถแก้ไขได้แน่นอนใน pseudocode ฉันจะยอมรับคำตอบของคุณอย่างมีความสุข :-)
vonjd

โพสต์ของคุณเชื่อมโยงไปยังที่คุณใช้รหัสของคุณคือในความคิดของฉันนำเสนอที่ไม่ดีของ perceptrons และการขยายพันธุ์กลับแม้ว่ามันจะสั้นแน่นอน คุณรู้หรือไม่ว่าการขยายพันธุ์กลับทำงานได้อย่างไรและทฤษฎี perceptron ทั่วไป?
Kellan Fluette

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

ไม่มี $ \ vec {x} ^ \ intercal \ vec {x) $ ในลากรองจ์คู่ที่สองของเกณฑ์การรับรู้หรือไม่? โดยเฉพาะที่คุณจะแทนที่ผลิตภัณฑ์ภายในด้วยการประเมินฟังก์ชั่นเคอร์เนล
Kellan Fluette
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.