Criamos um dataframe.

cl1 <- cbind(rnorm(100, 0.2, 0.05), rnorm(100, 0.8, 0.06))
cl2 <- cbind(rnorm(50, 0.7, 0.08), rnorm(50, 0.3, 0.05))
x <- rbind(cl1, cl2)
head(x, 15)
##             [,1]      [,2]
##  [1,] 0.13375135 0.6971378
##  [2,] 0.20541048 0.8368611
##  [3,] 0.22413803 0.7822476
##  [4,] 0.21069071 0.8065386
##  [5,] 0.16208734 0.9472115
##  [6,] 0.21967432 0.8603994
##  [7,] 0.26449105 0.7905941
##  [8,] 0.22603395 0.7638732
##  [9,] 0.18815148 0.8587617
## [10,] 0.14719852 0.7820302
## [11,] 0.25773160 0.8678588
## [12,] 0.08408693 0.8364384
## [13,] 0.21277671 0.8142970
## [14,] 0.17549104 0.7722326
## [15,] 0.27795692 0.8436040

Carregamos a biblioteca.

library(apcluster)
## 
## Attaching package: 'apcluster'
## The following object is masked from 'package:stats':
## 
##     heatmap

Aplicamos a função de Affinity Propagation.

apres <- apcluster(negDistMat(r=2), x, details=TRUE)

Verificamos o objeto criado.

show(apres)
## 
## APResult object
## 
## Number of samples     =  150 
## Number of iterations  =  174 
## Input preference      =  -0.03128545 
## Sum of similarities   =  -0.2543353 
## Sum of preferences    =  -0.281569 
## Net similarity        =  -0.5359043 
## Number of clusters    =  9 
## 
## Exemplars:
##    33 37 47 69 85 102 103 104 139
## Clusters:
##    Cluster 1, exemplar 33:
##       5 12 19 21 23 33 35 39 56 73 77 92 93
##    Cluster 2, exemplar 37:
##       1 16 18 37 40 57 60 62 68 94 95
##    Cluster 3, exemplar 47:
##       3 4 10 13 14 17 20 24 26 28 29 31 32 34 38 42 44 47 48 50 55 58 59 
##       61 65 66 67 70 71 74 75 78 79 86 87 90 96 100
##    Cluster 4, exemplar 69:
##       2 6 7 9 11 15 22 25 27 36 45 46 49 51 52 53 54 63 64 69 72 76 80 81 
##       82 83 88 91 98
##    Cluster 5, exemplar 85:
##       8 30 41 43 84 85 89 97 99
##    Cluster 6, exemplar 102:
##       101 102 108 109 112 113 114 115 117 118 124 127 128 130 131 132 135 
##       136 137 138 143 144 146 148 149
##    Cluster 7, exemplar 103:
##       103 110 116 119 125 126 134 140 142 145
##    Cluster 8, exemplar 104:
##       104 105 106 122 129 141 147 150
##    Cluster 9, exemplar 139:
##       107 111 120 121 123 133 139

Resumimos os dados.

summary(apres)
##   Length    Class     Mode 
##        9 APResult       S4

Plotamos o resultado.

plot(apres, x)

Criamos um mapa de calor.

heatmap(apres)

Identificamos a lista de exemplares.

apres@exemplars
##  33  37  47  69  85 102 103 104 139 
##  33  37  47  69  85 102 103 104 139

Atribuimos esta lista para uma lista chamada centroides.

centroides = unique(apres@exemplars)
centroides
## [1]  33  37  47  69  85 102 103 104 139
class(centroides)
## [1] "numeric"

Criamos um data.frame que conterá as coordenada dos exemplares.

poly = data.frame()

Realizamos a iteração para povoar o data.frame.

poly = data.frame()
for (i in centroides){
  centr_lat=x[i,1]
  centr_lon=x[i,2]
  poly = rbind(poly, c(centr_lat, centr_lon))
}

Verificamos os dados.

poly

Plotamos os clusters e adicionamos os pontos exemplares em preto.

plot(apres, x);par(new=TRUE)
points(poly[,1], poly[,2], col = "black", pch=13)