En este artículo veremos un ejemplo de clúster por densidad con un dataset que contiene 6219 estrellas que muestran la magnitud aparente en el rango visible. El dataset contiene 5 columnas:
- Id de la estrella.
- Magnitud aparente en el espectro visible.
- Color observado en el rango B-V (Blue-Visible).
- Paralaje de la estrella observada (en segundo de arco).
- Incertidumbre del paralaje (en miliarcsec).
Ejemplo de clúster por densidad
En este ejercicio hacemos que se calcule la distancia a a la estrella en pársecs en función de los segundos de arco:
Δ = 1
——–
π
1 pársec= 206265 ua = 3,2616 años luz
La magnitud absoluta de una estrella está relacionada con la magnitud aparente por
Mv = mv – 5 . log10 Δ + 5
Si pintamos la magnitud absoluta de una estrella en función de su temperatura (color), obtenemos lo que se llama un diagrama Hertzsprung-Russell, a veces abreviado como diagrama H-R.
Lo que vamos a hacer es cargar los datos y calcular la magnitud real en función de la magnitud visible. Calcularemos el brillo total de las estrellas, sin importar si están cerca o están lejos.
#ejemplo de clúster por densidad
hr = read.csv ("data/yaletrigplx.dat", col.names = c ("id", "my", "BV", "parallax", "error"), sep = " " }
head (hr)
#ejemplo de clúster por densidad
hrsparsec = 1 / hr$parallax
hr$Mv <- hr$mv - 5 * log10 (hr$parsec) + 5
library(ggplot2)
options (repr.plot.height = 4, repr.plot.width = 6)
ggplot (hr, aes (y = Mv, x = BV)) + geom_point (size = 0.1) + scale_y_reverse ()
Como observamos en el diagrama, las estrellas no se distribuyen de manera aleatoria. Está lo que se conoce como la secuencia principal (raya roja), que tiende a estar alrededor de las otras dos secuencias (señaladas en verde y azul).
Para que podamos sacar de allí otros valores que no sean lineales, rectos, tenemos que estandarizar, es decir, normalizar.
#ejemplo de clúster por densidad
library (dbscan)
library (tidyverse)
hr$norm_Mv = (hr$Mv - mean (hr$Mv)) / sd (hr$Mv)
hr$norm_BV = (hr$BV - mean (hr$BV)) / sd (hrsBV)
summary (hr)
Vamos a crear el primer clúster:
#ejemplo de clúster por densidad
hr_cl <- dbscan (hr [, c ("norm_Mv", "norm BV")], minPts = 18, eps = 0.09, borderPoints=TRUE)
hr_cl
hr$cluster <- as.factor (hr_cl$cluster)
ggplot (hr, aes (y = norm_Mv, x = norm_BV, color = cluster)) + geom_point (size = 0.01) + scale_y_reverse ()
DBSCAN clustering for 6219 objects.
Parameters: eps = 0.09, minPts = 18
The clustering contains 9 cluster (s) and 1432 noise points.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1432 | 3994 | 24 | 71 | 583 | 37 | 38 | 4 | 14 | 22 |
Acto seguido, vamos a pintar el hulplot:
#ejemplo de clúster por densidad
hullplot (hr [, c ("norm_Mv", "norm BV")], hr_cl)
Cuando tenemos varios puntos en el mismo clúster, el hull es la zona que engloba a todos esos puntos.
KNNdist devuelve un vector con la distancia a los k elementos más cercanos de cada punto:
#ejemplo de clúster por densidad
k30_dist <- hr %>% select (norm_Mv, norm_BV) KNNdist (k = 30)
head (cbind (hr, k30_dist))
Aquí lo que hemos hecho es calcular el kNN de 30 elementos, es decir, la distancia de una estrella a sus 30 estrellas vecinas más cercanas.
#ejemplo de clúster por densidad
plot (sort (KNNdist (hr [, c ("norm_My", "norm_BV")], k = 30)), t = 'l')
grid ()
El codo en la curva de los valores de kNNdist nos puede dar una zona en la que el valor de eps dé mejores resultados. El codo aquí empieza a aumentar en 0.3, es decir, cuando ponemos una distancia de más de 0.3, la distancia empieza a aumentar:
Si pintamos el kNNdist, el resultado es la curva anterior. En este diagrama podremos observar en qué momento crece:
#ejemplo de clúster por densidad
hr_cl <- dbscan (hr [, c ("norm_Mv", "norm_BV")], minPts = 30, eps = 0.3, borderPoints = TRUE)
hr_cl
hr$cluster <- as.factor (hr_cl$cluster)
ggplot (hr, aes (y = norm_Mv, x = norm_BV, color = cluster)) + geom_point (size = 0.01) + scale_y_reverse ()
0 | 1 | 2 |
178 | 5871 | 170 |
Available fields: cluster, eps, minPts
Hemos afianzado nuestros conocimientos respecto a los clústeres por densidad por medio de un ejemplo. Si quieres seguir aprendiendo más sobre esta y otras temáticas interesantes, puedes inscribirte a nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva en la que aprenderás y adquirirás todos los conocimientos necesarios para incursionar en un mercado laboral lleno de grandes oportunidades.
En la actualidad, uno de los trabajos mejor pagados es el de programador, así que no esperes más y ¡solicita más información para darle un giro a tu vida!