与Levenshtein距离和附加的特征/变量聚类算法(Cluster algorithm with

2019-09-26 10:41发布

我有由那我想用一些非监督分类算法分类文本标记(也就是说,不同的身份证号码和一些其他类型)的数据集。

鉴于某些类型的功能,我从文本中提取(#字符,数字#,阿尔法#,一些正则表达式等)的算法,比如kmeans (只是作为一个例子,我不是必然的kmeans)正常工作,但我要添加更多的细节,如莱文斯坦距离,我可以用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
# ???

Answer 1:

如果你想为莱文斯坦的指标,并结合东西像欧几里得距离的方法,可以通过组合距离矩阵做到这一点,因为它们是相同的形状,并且将其发送到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均值和层次聚类结合我所知道的一个办法做到这一点。 基本上你上以矩阵执行分级聚类,将其划分成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-中心点划分可以工作?



文章来源: Cluster algorithm with Levenshtein distance and additional features/variables