Question

J'ai fait un certain regroupement et je voudrais visualiser les résultats.

Voici la fonction que je l'ai écrit pour tracer mes groupes:

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 fonction ci-dessus est copié presque mot pour mot de la scikit-learn démo .

Et pourtant, quand je l'essayer sur les points suivants:

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)

... Elle produit un seul point. Quelle est la meilleure façon de grappes de parcelles en python?

Était-ce utile?

La solution

Quand je lance le code affiché, je reçois trois points sur mon terrain:

Le "point" en (0, 4) correspond à X[1] et le "point" (0, 5) est en fait trois points, correspondant à X[0], X[2] et X[3]. Le point (5, 5) est le dernier point dans votre tableau de X. Les données (0, 4) et (0, 5) appartiennent à un groupe, et le point (5, 5) est considéré comme le bruit (tracé en noir).

La question semble être ici que vous essayez d'exécuter l'algorithme de DBSCAN sur un ensemble de données contenant 5 points, avec au moins 4 points requis par cluster (le second argument du constructeur de DBSCAN). Dans l'exemple de sklearn, l'algorithme de regroupement est exécuté sur un ensemble de données contenant 750 points avec trois centres distincts. Essayez de créer un ensemble de données X plus grande et l'exécution de ce code.

Vous pouvez également supprimer les lignes de plt.ylim([0,10]) et plt.xlim([0,10]) du code; ils font un peu difficile de voir les points sur le bord de l'intrigue! Si vous omettez le ylim et xlim alors matplotlib déterminera automatiquement les limites de tracé.

Licencié sous: CC-BY-SA avec attribution
scroll top