формула для площади кластеров в Kmeans - PullRequest
1 голос
/ 19 сентября 2019

С K кластерами, сгенерированными с помощью K Means Clustering, как мы вычисляем площадь каждого кластера?Есть ли какая-нибудь формула для этого?

Я уже пробовал gArea () с пакетом rgeos, но я получаю код ошибки "

, не удалось найти унаследованный метод для функции.projected для сигнатуры kmeans

кластерный анализ работает отлично, мне нужен только способ найти площадь каждого кластера, так что либо формула, использующая withiness, totss и между ними, либо некоторая помощь по кодуочень ценю

кластерный анализ работает отлично, мне нужен только способ найти площадь каждого кластера. Пока для графической части у меня есть:

###################### Clustering Script
clusters <- kmeans(df[2:3], k)

# Save the cluster number in the dataset as column 'Borough'
df$clusterId <- as.factor(clusters$cluster)
m_color=c("#999999","#E69F00","#56B4E9", "#009E73", "#F0E442", 
"#0072B2", "#D55E00", "#CC79A7","#A09999","#B99F00","#E6E4E9", 
"#777E73", "#D1A142", "#33AAB2", "#99CC00")

fviz_cluster(clusters, data = df[2:3], 
             ellipse.type = "norm",
             ellipse.level = 0.99,
             palette = m_color,
             geom = "point",
             axes = c(0,0), 
             show.clust.cent = TRUE,
             ggtheme = theme_minimal()
             )

clusters$totss
clusters$size
clusters$centers
clusters$withinss
clusters$betweenss
gArea(clusters, byid = FALSE)

1 Ответ

3 голосов
/ 19 сентября 2019

Используя пример из example(kmeans), мы можем взять выпуклую оболочку точек, а затем использовать Polyarea для вычисления площади.

library(geometry)

set.seed(123)
example(kmeans)  # creates input x and kmeans output cl

# area of convex hull of points in the cluster
area <- function(z) { xy <- z[chull(z), ]; polyarea(xy[,1], xy[,2]) }
sapply(split(as.data.frame(x), cl$cluster), area)
##         1         2         3         4         5 
## 0.3758644 0.4127252 0.2722848 0.2090896 0.3283888 

# area  of box bounding all points in the cluster
area.box <- function(z) diff(range(z[, 1])) * diff(range(z[, 2]))
sapply(split(as.data.frame(x), cl$cluster), area.box)
##         1         2         3         4         5 
## 0.6570733 0.7924508 0.4263473 0.3307718 0.5639517 

# area of largest ellipse in the bounding box
area.ellipse <- function(z) pi * diff(range(z[, 1])) * diff(range(z[, 2])) / 4
sapply(split(as.data.frame(x), cl$cluster), area.ellipse)
##         1         2         3         4         5 
## 0.5160641 0.6223894 0.3348524 0.2597876 0.4429267 
...