Я хочу написать новое ядро с новой функцией расстояния. Но я не могу найти правильное определение.
Для полидота я нашел это определение.
> 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)
}
Спасибо за помощь!