¿Cómo trazar/visualizar grupos en Scikit-Learn (Sklearn)?
-
16-10-2019 - |
Pregunta
He hecho algunas agrupaciones y me gustaría visualizar los resultados.
Aquí está la función que he escrito para trazar mis clústeres:
import sklearn
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
from sklearn.preprocessing import StandardScaler
def plot_cluster(cluster, sample_matrix):
'''Input: "cluster", which is an object from DBSCAN,
e.g. dbscan_object = DBSCAN(3.0,4)
"sample_matrix" which is a data matrix:
X = [
[0,5,1,2],
[0,4,1,3],
[0,5,1,3],
[0,5,0,2],
[5,5,5,5],
]
Output: Plots the clusters nicely.
'''
import matplotlib.pyplot as plt
import numpy as np
f = lambda row: [float(x) for x in row]
sample_matrix = map(f,sample_matrix)
print sample_matrix
sample_matrix = StandardScaler().fit_transform(sample_matrix)
core_samples_mask = np.zeros_like(cluster.labels_, dtype=bool)
core_samples_mask[cluster.core_sample_indices_] = True
labels = cluster.labels_
# Black removed and is used for noise instead.
unique_labels = set(labels)
colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))
for k, col in zip(unique_labels, colors):
if k == -1:
# Black used for noise.
col = 'k'
class_member_mask = (labels == k) # generator comprehension
# X is your data matrix
X = np.array(sample_matrix)
xy = X[class_member_mask & core_samples_mask]
plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col,
markeredgecolor='k', markersize=14)
xy = X[class_member_mask & ~core_samples_mask]
plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col,
markeredgecolor='k', markersize=6)
plt.ylim([0,10])
plt.xlim([0,10])
# plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.savefig('cluster.png')
La función anterior se copia casi textualmente desde la demostración de Scikit-Learn aquí.
Sin embargo, cuando lo pruebo a lo siguiente:
dbscan_object = DBSCAN(3.0,4)
X = [
[0,5,1,2],
[0,4,1,3],
[0,5,1,3],
[0,5,0,2],
[5,5,5,5],
]
result = dbscan_object.fit(X)
print result.labels_
print 'plotting '
plot_cluster(result, X)
... Produce un solo punto. ¿Cuál es la mejor manera de trazar grupos en Python?
Solución
Cuando ejecuto el código que publicaste, obtengo tres puntos en mi trama:
El "punto" en (0, 4) corresponde a X[1]
y el "punto" en (0, 5) es en realidad tres puntos, correspondiente a X[0]
, X[2]
, y X[3]
. El punto en (5, 5) es el último punto en su X
formación. Los datos en (0, 4) y (0, 5) pertenecen a un clúster, y el punto en (5, 5) se considera ruido (trazado en negro).
El problema aquí parece ser que estás tratando de ejecutar el DBSCAN
algoritmo en un conjunto de datos que contiene 5 puntos, con al menos 4 puntos requeridos por clúster (el segundo argumento al DBSCAN
constructor). En el sklearn
Ejemplo, el algoritmo de agrupación se ejecuta en un conjunto de datos que contiene 750 puntos con tres centros distintos. Intenta crear una más grande X
conjunto de datos y ejecutar este código nuevamente.
Es posible que también desee eliminar el plt.ylim([0,10])
y plt.xlim([0,10])
líneas del código; ¡Están haciendo un poco difícil ver los puntos en el borde de la trama! Si omite el ylim
y xlim
después matplotlib
Determinará automáticamente los límites de la trama.