2017-06-14 19 views
1

私は、教師なし分類アルゴリズムを使用して分類したいテキストトークン(単語、異なる種類の識別番号、およびいくつかの追加の型)からなるデータセットを持っています。Levenshtein距離と追加機能/変数を持つクラスタアルゴリズム

kmeans(例として、私はkmeansに縛られていません)のようなテキスト(文字数、桁数、英数字、一部の正規表現など)から抽出するいくつかの種類の機能私はhclustと一緒に使うことができるLevenshtein距離のような詳細をいくつか追加したいと思います。

しかし、2つの異なるデータタイプ(距離メトリックやリンクされたデータなどの2つの観測にリンクされているデータ)を結合する方法の出発点はあまりありません各トークンの文字数などの1つの観測のみ)。

私はいくつかの簡単な部分が欠けていましたか、それは可能ですか、間違ったアルゴリズムを探しましたか?

以下、小さなデータセットの例とこれまで取り上げてきたさまざまなアプローチを紹介します。

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 
# ??? 
+0

コードに若干の誤りがあります。 'c(2:3)[kclust $ cluster]'は、クラスターの数が色の数より多いため、NAを生成します。 – AkselA

+0

コメントをいただきありがとうございます。私はkmeansの "正しい" 2つのクラスタを持つようにコードを更新しました。 – David

答えて

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) 

もちろん、好きなように2つのマトリックスに重みを付けることができます。

k-meansと階層的クラスタリングを組み合わせたい場合は、その方法の1つがわかります。本質的に、マトリックス上で階層的クラスタリングを実行し、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-medoidsが使えますか?

+0

本当にありがとうございます。それは、私が心に留めていたが、まだ聞いていない別の質問に答えました(複数の距離を組み合わせる方法)。 – David

関連する問題