2017-06-14 26 views
1

我有一個數據集包含我想使用某種無監督分類算法進行分類的文本標記(字,不同種類的標識號和其他類型)。具有Levenshtein距離和附加特徵/變量的聚類算法

鑑於我從文本中提取的某些功能(字符數,數字位數,alpha數量,一些正則表達式等)算法(如kmeans)(僅作爲示例,我不綁定到kmeans)工作很好,但我想添加一些更多的細節,如Levenshtein距離,我可以使用hclust

但是,我不完全找到如何組合兩種不同數據類型(鏈接到兩個觀察值的數據(如距離度量標準)以及鏈接到的數據只有一個觀察值,例如每個令牌具有的字符數)。

我是否錯過了一些簡單的部分,它甚至有可能或者我只是尋找錯誤的算法?

下面,您會找到一個小數據集的例子以及我迄今採用的不同方法。

MWE數據


# create some data 
set.seed(123) 
x <- sapply(1:20, function(i) { 
paste(c(
    sample(LETTERS, sample(1:10, 1), replace = T), 
    sample(1:9, sample(1:10, 1), replace = T), 
    sample(LETTERS[1:10], 2) 
), collapse = "") 
}) 
head(x) 
#> [1] "UKW1595595761IC" "I9769675632JI" "UAMTFIG44DB"  "GM814HB"   
#> [5] "FDTXJR4CH"  "VVULT7152464BC" 

# apply the different algorithms 
# 1. K-means 
df <- data.frame(x) 
df$nchars <- nchar(x) 
df$n_nums <- nchar(gsub("[^[:digit:]]", "", x)) 
# etc. 

kclust <- kmeans(df[, 2:3], centers = 2) 
pairs(df, col=c(2:3)[kclust$cluster]) 

# 2. Levensthein distance and hclust 
distance <- adist(x) 
rownames(distance) <- x 
hc <- hclust(as.dist(distance)) 
plot(hc) 

# 3. Combination of adist(x) and the df-variables 
# ??? 
+0

你的代碼有一個小小的錯誤。 'c(2:3)[kclust $ cluster]'產生NA,因爲聚類數量多於顏色數量。 – AkselA

+0

感謝您的評論,我更新了代碼以在kmeans中擁有「正確的」2個羣集。 – David

回答

1

如果你想要一種結合Levenshtein度量和歐幾里得距離等方法,你可以通過組合距離矩陣,因爲它們具有相同的形狀,並將其發送給hclust。

stats <- cbind(df$nchars, df$n_nums) 

euc <- as.matrix(dist(stats)) 
rownames(euc) <- x 

lev <- adist(x) 
rownames(lev) <- x 

scale01 <- function(x) { 
    z <- (x - min(x)) 
    z/max(z) 
} 

combi <- scale01(euc) + scale01(lev) 

hc.combi <- hclust(as.dist(combi)) 
plot(hc.combi) 

當然,你可以不管你喜歡兩個矩陣的重量。

如果你想結合K-means和層次聚類,我知道一種方法來做到這一點。本質上,您在矩陣上執行層次聚類,將其分爲k個組,計算每個組的均值,並將這些均值作爲k均值的起始質心。

hc2 <- hclust(dist(stats)) 
clusters <- cutree(hc2, k=3) 

centers <- aggregate(stats, list(clusters), mean)[, -1] 

hkclust <- kmeans(stats, centers) 
pairs(df, col=c(2:4)[hkclust$cluster]) 

如果你想k均值與萊文斯坦結合起來,我怕我不知道該怎麼做,因爲它並沒有多大意義,傳遞距離矩陣K-手段。也許k-medoids可以工作?

+0

非常感謝您的回答。它回答了我想到的另一個問題,但沒有問(如何組合多個距離)。 – David