首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有Levenshtein距离和附加特征/变量的聚类算法

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

Stack Overflow用户
提问于 2017-06-14 22:32:15
回答 1查看 930关注 0票数 1

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

给定我从文本中提取的某些类型的特征(字符#,数字#,字母#,一些正则表达式等)算法,例如kmeans (仅作为示例,我没有绑定到kmeans)工作得很好,但我想添加一些更多的细节,比如我可以在hclust中使用的Levenshtein-distance。

但是,我没有找到如何组合这两种不同数据类型的起点(链接到两个观察值的数据,比如距离度量,以及只链接到一个观察值的数据,比如每个令牌的字符数)。

我是不是遗漏了一些简单的部分,有没有可能,或者我只是找错了算法?

下面,您可以找到一个小数据集的示例,以及我到目前为止所采用的不同方法。

MWE数据

代码语言:javascript
复制
# 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]) 

代码语言:javascript
复制
# 2. Levensthein distance and hclust
distance <- adist(x)
rownames(distance) <- x
hc <- hclust(as.dist(distance)) 
plot(hc)

代码语言:javascript
复制
# 3. Combination of adist(x) and the df-variables
# ???
EN

回答 1

Stack Overflow用户

发布于 2017-06-15 01:48:23

如果您需要一种方法来组合Levenshtein的度量和欧几里德距离之类的东西,您可以通过组合距离矩阵来实现,因为它们具有相同的形状,并将其发送到hclust。

代码语言:javascript
复制
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的起始质心传递。

代码语言:javascript
复制
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可以工作?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44547697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档