【问题标题】:Cluster algorithm with Levenshtein distance and additional features/variables具有 Levenshtein 距离和附加特征/变量的聚类算法
【发布时间】:2017-11-16 18:41:03
【问题描述】:

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

鉴于我从文本中提取的某些类型的特征(字符数、数字数、alpha 数、一些正则表达式等)算法,例如 kmeans(仅作为示例,我不受 kmeans 的约束)工作正常,但我想添加更多细节,例如 Levenshtein-distance,我可以与 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
# ???

【问题讨论】:

  • 您的代码有一个小错误。 c(2:3)[kclust$cluster] 产生 NA,因为簇的数量多于颜色的数量。
  • 感谢您的评论,我更新了代码以在 kmeans 中包含“正确”的 2 个集群。

标签: r algorithm text machine-learning


【解决方案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-means 的起始质心传递。

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-means 没有多大意义。也许k-medoids 可以工作?

【讨论】:

  • 非常感谢您的回答。它回答了另一个我想到但还没有问的问题(如何组合多个距离)。
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2016-06-24
  • 2013-04-23
相关资源
最近更新 更多