Кластеризация ряда стран на основе культурного сходства по R - PullRequest
0 голосов
/ 06 февраля 2019

У меня возникают некоторые проблемы при попытке кластеризации стран, используя некую культурную корреляцию, которая у меня уже есть.

В основном, набор данных выглядит следующим образом: 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
  ......

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Иерархическая агломерационная кластеризация (HAC), один из самых старых методов кластеризации, также может быть реализована с сходством вместо расстояния.

Концептуально вы всегда ищете максимум (например,итак) и объединяйте их, пока не останется нужное количество кластеров.

Хотя в вашем случае, вероятно, проще просто использовать 1-sim в качестве расстояния и использовать существующие реализации.

0 голосов
/ 15 февраля 2019

Вы можете рассмотреть возможность использования спектральной кластеризации, которая является k-средним, примененным к доминирующему собственному вектору (ам) лапласиана, лежащему в основе вашего графа подобия.https://en.wikipedia.org/wiki/Spectral_clustering

0 голосов
/ 06 февраля 2019
#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))

enter image description here

# 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 
...