2013-06-12 26 views
6

Tôi có vĩ độ và kinh độ, vì vậy tôi cần phải xác định lại hạt nhân RBF thành điểm kinh nghiệm (-1/2 || sophere distrance ||^2), có nghĩa là tôi cần tự viết lại hàm hạt nhân. Tôi viết hạt nhân của mình như sau:Làm thế nào để tùy chỉnh chức năng hạt nhân trong ksvm của gói kernlab?

round.kernel <- function(x,y){ 
    sigma <- 1 
    #R <- 6371 
    R <- 1 
    a <- (sin((x[1]-y[1])/2))^2+cos(x[1])*cos(y[1])*(sin((x[2]-y[2])/2))^2 
    c <- 2*atan2(sqrt(a),sqrt(1-a)) 
    d <- R*c 
    res <- exp(-d^2/(2*sigma)) 
    return (res) 
} 
class(round.kernel) <- "kernel" 

Tôi đã thử nghiệm hàm, hạt nhân phải chính xác. Nhưng với sự chỉ huy đào tạo sau tôi nhận được lỗi:

fit <- ksvm(y=train[,2],x=train[,3:4],kernel=round.kernel,type='eps-svr') 

Error in .local(x, ...) : 
    List interface supports only the stringdot kernel. 

Điều trickly hơn là, tôi đã cố gắng mã mẫu trong tài liệu ksvm:

k <- function(x,y) {(sum(x*y) +1)*exp(-0.001*sum((x-y)^2))} 
class(k) <- "kernel" 

Nhưng tôi nhận được các lỗi tương tự.

Bất kỳ ai biết cách xác định chính xác hàm hạt nhân?

+0

Điều này thực sự hữu ích. Bạn có thể giải thích cách bạn bắt đầu hàm hạt nhân không? Tôi không thấy kết nối giữa điểm kinh nghiệm (-1/2 || khoảng cách hình cầu ||^2) và cách bạn hoàn thành 'res'. – momeara

+0

@momeara, tôi nghĩ rằng nó cơ bản dựa trên các hàm tam giác, vì vậy có thể có nhiều cách để làm điều đó bằng cách sử dụng arctan, arcsin, hoặc ở đây như atan2. Kiểm tra liên kết này: http://www.movable-type.co.uk/scripts/latlong.html –

+0

Ví dụ này phù hợp với tôi. –

Trả lời

6

Sự cố của tôi được giải quyết như sau: mã hạt nhân chính xác, tôi phải xác định trực tiếp hàm (x, y) và khai báo lớp của nó là "hạt nhân". Vấn đề là ngay cả trong doc ksvm không hỗ trợ x, y styles, chúng thực sự không hoạt động. Thay đổi nó để phong cách thức dữ liệu cuối cùng có thể có được những điều đang chạy:

fit <- ksvm(Freq~lat+lon,data=train[,2:4],kernel=roundrbf,type='eps-svr') 

Hơn nữa, tôi cũng đọc mã nguồn của rbfdot, và hạt nhân khác quy định tại các kernlab riêng của mình. Lưu ý rằng kiểu mã của chúng giống như sau:

function(params){ 
    val <- function(x,y){ 
    # True kernel defined here 
    } 
    return (new ("kernel_name",.Data=val,kpar=list(params))) 
} 

Nhưng nghiêm túc, tôi đã thử và làm cho các chức năng hạt nhân theo kiểu này sẽ không hoạt động. Cách làm việc giống như kiểu này trực tiếp:

k <- function(x,y){ 
    #calculate the result 
} 
class(k) <- "kernel" 
Các vấn đề liên quan