Я борюсь с алгоритмом KNN, потому что у меня есть как категориальные, так и числовые переменные.К сожалению, я не могу найти пакет для R, который мог бы объединить оба типа переменных.K-Means полагается также на меры близости, и я знаю пакет kproto, который может комбинировать смешанные переменные (евклидово для числовых и режимы для категориальных).Ребята, вы знаете какой-нибудь пакет для алгоритма KNN, который использует аналогичный подход?
Или есть способ изменить код knn и объединить его с частью кода из K-означает, что он вычисляет расстояние?Я нашел это:
# compute distances
dists <- matrix(NA, nrow=nrow(x), ncol = k)
nrows <- nrow(x)
for(i in 1:k){
#a0 <- proc.time()[3]
#d1 <- apply(x[,numvars],1, function(z) sum((z-protos[i,numvars])^2)) # euclidean for numerics
d1 <- (x[,numvars, drop = FALSE] - matrix(rep(as.numeric(protos[i,numvars, drop = FALSE]), nrows), nrow=nrows, byrow=T))^2
if(length(lambda) == 1) d1 <- rowSums(d1)
if(length(lambda) > 1) d1<- d1 %*% lambda[numvars]
#a1 <- proc.time()[3]
#d2 <- lambda * apply(x[,catvars],1, function(z) sum((z != protos[i,catvars]))) # wtd simple matching for categorics
d2 <- sapply(which(catvars), function(j) return(x[,j] != rep(protos[i,j], nrows)) )
if(length(lambda) == 1) d2 <- lambda * rowSums(d2)
if(length(lambda) > 1) d2 <- d2 %*% lambda[catvars]
#a2 <- proc.time()[3]
dists[,i] <- d1 + d2
#cat(a1-a0, a2-a1, "\n")
}
Источник: https://rdrr.io/cran/clustMixType/src/R/kprototypes.R
Таким образом, у меня на самом деле два вопроса: A) Знаете ли вы пакет, который использует меру сходства, которая способна обрабатыватьсмешанные типы данных для KNN?(n = 120 000)
B) Если нет, как вы думаете, реалистично ли объединить два кода?
Cheers,
Martin