Как написать новое ядро ​​в ksvm kernlab с более чем 2 параметрами? - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу написать новое ядро ​​с новой функцией расстояния. Но я не могу найти правильное определение. Для полидота я нашел это определение.

> polydot
function (degree = 1, scale = 1, offset = 1) 
{
  rval <- function(x, y = NULL) {
    if (!is(x, "vector")) 
        stop("x must be a vector")
    if (!is(y, "vector") && !is.null(y)) 
        stop("y must be a vector")
    if (is(x, "vector") && is.null(y)) {
        (scale * crossprod(x) + offset)^degree
    }
    if (is(x, "vector") && is(y, "vector")) {
        if (!length(x) == length(y)) 
            stop("number of dimension must be the same on both data points")
        (scale * crossprod(x, y) + offset)^degree
     }
  }
  return(new("polykernel", .Data = rval, kpar = list(degree = degree, 
    scale = scale, offset = offset)))
}

но если я попытаюсь реализовать свой код, он выдаст мне уже эту ошибку:

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

По крайней мере, я попробовал это с новой дистанцией и стилем многоядерности. Код:

function (size = 1) 
{
 kval <- function(x, y = NULL) {
   if (!is(x, "vector")) 
      stop("x must be a vector")
   if (!is(y, "vector") && !is.null(y)) 
      stop("y must be a vector")
   if (is(x, "vector") && is.null(y)) {
      x
   }
if (is(x, "vector") && is(y, "vector")) {
  if (!length(x) == length(y)) 
    stop("number of dimension must be the same on both data points")
  newDist(x,y,size)
  }
 }
 return(new("new_kernel", .Data = kval, kpar = list(size = size)))
}
class(new_kernel) <- "kernel"

с новой функцией расстояния:

newDist <- function(x, y, xmax) {
  xrow1 <- (as.numeric(rownames(x))) %/% xmax
  yrow1 <- (as.numeric(rownames(y))) %/% xmax
  xrow1 <- (as.numeric(rownames(x))) - (xrow1 * xmax) 
  yrow2 <- (as.numeric(rownames(y))) - (yrow1 * xmax)
  a <- c(xrow1, yrow1)
  b <- c(xrow2, yrow2)
  distance <- dist(rbind(a, b), method = "euclidean")
  newDistance <- distance[1]
  return(newDistance)
}

Спасибо за помощь!

...