Các vấn đề phân loại với các ranh giới phi tuyến có thể được giải quyết bằng một tri giác đơn giản . Mã R sau đây dành cho mục đích minh họa và dựa trên ví dụ này trong 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
Bây giờ, ý tưởng về kernel và cái gọi là thủ thuật kernel là chiếu không gian đầu vào vào một không gian có chiều cao hơn, giống như vậy ( nguồn ảnh ):
Câu hỏi của tôi
Làm cách nào để sử dụng thủ thuật kernel (ví dụ với kernel bậc hai đơn giản) để tôi có được một perceptron kernel , có thể giải quyết vấn đề phân loại đã cho? Xin lưu ý: Đây chủ yếu là một câu hỏi về khái niệm nhưng nếu bạn cũng có thể đưa ra sửa đổi mã cần thiết thì điều này sẽ rất tuyệt
Những gì tôi đã thử cho đến nay
tôi đã thử những thứ sau đây hoạt động ổn nhưng tôi nghĩ rằng đây không phải là vấn đề thực sự vì nó trở nên quá đắt đối với các vấn đề phức tạp hơn ("mẹo" đằng sau "lừa nhân" không chỉ là ý tưởng của hạt nhân nhưng bạn không phải tính toán phép chiếu cho tất cả các trường hợp):
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)
Tiết lộ đầy đủ
Tôi đã đăng câu hỏi này một tuần trước trên SO nhưng nó không được chú ý nhiều. Tôi nghi ngờ rằng đây là một nơi tốt hơn bởi vì nó là một câu hỏi về khái niệm hơn là một câu hỏi lập trình.