根据 R 上的文化相似性对一组国家进行聚类

Clustering a set of countries based on cultural similarity on R

我在尝试使用我已有的一种文化相关性对国家/地区进行聚类时遇到了一些问题。

基本上,数据集如下所示:90 个国家/地区,91 列(90 个国家/地区列 + 一个用于标识行中的国家/地区) 和 90 行

 Nation Ita   Fra   Ger   Esp   Eng  ...
 Ita    NA    0.2   0.1   0.6   0.4  ...
 Fra    0.2   NA    0.2   0.1   0.3  ...
 Ger    0.7   0.1   NA    0.5   0.4
 Esp    0.6   0.1   0.5   NA    0.2
 Eng    0.4   0.3   0.4   0.2   NA
 ...                              .....
 ...

我正在寻找一种将我的国家分组的算法(例如 3 个组,甚至更好,更灵活的集群,这样集群的数量和每个集群的国家数量不是固定的,例如底注

这样输出就是例如

  Nation   cluster
  Ita       1
  Fra       2
  Ger       3
  Esp       1
  Eng       3
  ......
#DATA
df1 = read.table(strip.white = TRUE, stringsAsFactors = FALSE, header = TRUE, text =
"Nation Ita   Fra   Ger   Esp   Eng
 Ita    NA    0.2   0.1   0.6   0.4
 Fra    0.2   NA    0.2   0.1   0.3
 Ger    0.7   0.1   NA    0.5   0.4
 Esp    0.6   0.1   0.5   NA    0.2
 Eng    0.4   0.3   0.4   0.2   NA")

df1 = replace(df1, is.na(df1), 0)
row.names(df1) = df1[,1]
df1 = df1[,-1]

# Run PCA to visualize similarities
pca = prcomp(as.matrix(df1))    
pca_m = as.data.frame(pca$x)
plot(pca_m$PC1, pca_m$PC2)
text(x = pca_m$PC1, pca_m$PC2, labels = row.names(df1))

# Run k-means and choose centers based on pca plot
kk = kmeans(x = df1, centers = 3)
kk$cluster
# Ita Fra Ger Esp Eng 
#   3   1   2   1   1 

层次凝聚聚类 (HAC) 是最古老的聚类方法之一,也可以使用 相似度 而不是距离来实现。

从概念上讲,您总是搜索最大值(例如,itager)并合并它们,直到保留所需数量的聚类。

尽管在您的情况下,仅使用 1-sim 作为距离并使用现有的实现可能更容易。

您可能会考虑使用谱聚类,这是将 k 均值应用于相似图下的拉普拉斯算子的主要特征向量。 https://en.wikipedia.org/wiki/Spectral_clustering