具有Levenshtein距离和附加特征/变量的聚类算法

时间:2017-06-14 14:32:15

标签: r algorithm text machine-learning

我有一个由文本标记(单词,不同类型的标识号和一些其他类型)组成的数据集,我想使用一些无监督的分类算法进行分类。

鉴于我从文本中提取的某些功能(字符数,字母数,字母数,某些正则表达式等)算法,例如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
# ???

1 个答案:

答案 0 :(得分: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-means与Levenshtein结合起来,我恐怕我不知道如何做到这一点,因为将距离矩阵传递给k-并没有多大意义手段。也许k-medoids可行吗?