我有一个由文本标记(单词,不同类型的标识号和一些其他类型)组成的数据集,我想使用一些无监督的分类算法进行分类。
鉴于我从文本中提取的某些功能(字符数,字母数,字母数,某些正则表达式等)算法,例如kmeans
(仅作为示例,我不一定要kmeans)工作正常,但我想添加更多细节,例如Levenshtein距离,我可以使用hclust
。
但是,我还没有找到如何组合两种不同数据类型的起点(与两个观察结果相关联的数据,例如距离指标和链接的数据只有一个观察,例如每个标记有多少个字符。)
我是否错过了一些简单的部分,是否可能或者我只是在寻找错误的算法?
下面,您将找到一个小数据集的示例以及我目前采用的不同方法。
# 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 :(得分: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可行吗?