Posts Tagged ‘clustering’

Пространственная кластеризация точечных данных

Май 12, 2008

Пост является переводом Spatial Clustering of Point Data с небольшими дополнениями.

Задача: Есть n точек, распределенных каким-то образом в пределах заданной территории. Каждая точка кроме пространственного положения обладает значением (например, содержанием химического элемента)
Требуется объединить точки в m групп.

Инструменты: GRASS, R.

Задача теоретическая. Точки генерируем случайным образом, и по ходу решения задачи, попытаемся определиться с числом групп в которые эти точки надо объединить.
Для наглядности сгенерируем растровую карту и возьмем с неё значения для точек:

r.surf.fractal out=surf.fract d=2.05
v.random out=pnts n=100
v.drape pnts type=point rast=surf.fract out=points

d.rast surf.fract
d.vect points icon=basic/box fcol=black col=black size=6

v.out.ascii in=points out=points.xy

На соседнем терминале запускаем R

x <- read.table(‘points.xy’,’sep=’|’)
names(x) <- c(‘easting’, ‘northing’, ‘surf’ ,’cat’)
# отсекаем столбец cat
y <- data.frame(x[,1:3])
row.names(y) <- x$cat

# загружаем библиотеки для кластерного анализа
library(cluster)
library(flexclust)

# попытаемся найти оптимальное число групп
s <- stepFlexclust(y, K=2:10, nrep=20)
plot(s)

# похоже, оптимальное число 5
y.pam <- pam(y, 5, stand=TRUE)

# подготовим данные для экспорта
y$cluster <- y.pam$clustering
y$orig_cat <- as.numeric(row.names(y))

# экспортируем данные в текстовый файл
write.table(y, file=’points.clust’, row.names=FALSE)

возвращаемся в GRASS и импортируем текстовый файл

v.in.ascii in=points.clust out=pclust fs=» » columns=’x double, y double, srf double, orig_cat integer, cluster integer’ skip=1

for x in $(seq 1 5)
do v.extract —o in=pclust where=»cluster=$x» out=pclust_$x
v.hull —o in=pclust_$x out=pclust_hull_$x
d.vect pclust_hull_$x type=boundary fcol=none width=2 col=white
done
d.vect pclust icon=basic/box fcol=black col=black size=6

Реклама