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?

¿Fue útil?

Solución

Cuando ejecuto el código que publicaste, obtengo tres puntos en mi trama:

clusters

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.

Licenciado bajo: CC-BY-SA con atribución
scroll top