Объединить код R. (алгоритм измерения расстояния K-прототипа и алгоритм KNN) -> новый код / ​​пакет - PullRequest
0 голосов
/ 27 августа 2018

Я борюсь с алгоритмом 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

...