2013-05-06 1 views
1

Я определил функцию расстояния, как следоватьK-средства кластеризации с моей собственной функцией расстояния

jaccard.rules.dist <- function(x,y) ({ 
    # implements feature distance. Feature "Airline" gets a different treatment, the rest 
    # are booleans coded as 1/0. Airline column distance = 0 if same airline, 1 otherwise 
    # the rest of the atributes' distance is cero iff both are 1, 1 otherwise 
    airline.column <- which(colnames(x)=="Aerolinea") 
    xmod <- x 
    ymod <-y 
    xmod[airline.column] <-ifelse(x[airline.column]==y[airline.column],1,0) 
    ymod[airline.column] <-1 # if they are the same, they are both ones, else they are different 

    andval <- sum(xmod&ymod) 
    orval <- sum(xmod|ymod) 
    return (1-andval/orval) 
}) 

который изменяет немножко расстояние Jaccard для dataframes вида

t <- data.frame(Aerolinea=c("A","B","C","A"),atr2=c(1,1,0,0),atr3=c(0,0,0,1)) 

Теперь, я бы например, выполнить некоторую k-мерную кластеризацию на моем наборе данных, используя только что определенное расстояние. Если я попытаюсь использовать функцию kmeans, нет способа указать мою функцию расстояния. Я попробовал использовать hclust, которая принимает матрицу distanca, которую я рассчитывается следующим образом

distmat <- matrix(nrow=nrow(t),ncol=nrow(t)) 
for (i in 1:nrow(t)) 
    for (j in i:nrow(t)) 
     distmat[j,i] <- jaccard.rules.dist(t[j,],t[i,]) 
distmat <- as.dist(distmat) 

, а затем вызывается hclust

hclust(distmat) 

Error in if (is.na(n) || n > 65536L) stop("size cannot be NA nor exceed 65536") : 
missing value where TRUE/FALSE needed 

, что я делаю неправильно? есть ли другой способ сделать кластеризацию, которая просто принимает произвольную функцию расстояния в качестве ее входа?

благодарит заранее.

+0

У вас отсутствуют значения в вашей матрице расстояний? –

+0

Или размер вашей матрицы больше 65536? –

+0

Нет, нет пропущенных значений, матрица (в приведенном выше примере) 4x4 – user2345448

ответ

2

Я думаю, что distmat (из вашего кода) должна быть структурой расстояния (которая отличается от матрицы). Попробуйте это вместо:

require(proxy) 
d <- dist(t, jaccard.rules.dist) 
clust <- hclust(d=d) 
[email protected] 

    [,1]   [,2] 
[1,] 0.044128322 -0.039518142 
[2,] -0.986798495 0.975132418 
[3,] -0.006441892 0.001099211 
[4,] 1.487829642 1.000431146 
+0

Я трансформировал свою матрицу на расстояние> distmat <- as.dist (distmat). – user2345448