2017-10-06 11 views
0

J'utilise DBSCAN pour effectuer un clustering sur un ensemble de données. Je pense que c'est à cause de l'argument couleur passé à la couleur de marqueur dans plt.plot() qui n'est pas une valeur unique. S'il vous plaît laissez-moi savoir si je me trompe ici. Mes caractéristiques sont la latitude, la longitude, speed_mph, speedlimit_mph, vehicle_id, driver_id.DBSCAN plot - Les valeurs de couleur passées dans plt.plot() lancent ValueError

Voici mon code de clustering

dbsc = DBSCAN(eps = .5, min_samples = 5).fit(df_cont) 

labels = dbsc.labels_ 
print(labels) 

num_clusters = len(set(labels)) 
clusters = pd.Series([df_cont[labels == n] for n in range(num_clusters)]) 
print('Number of clusters: {}'.format(num_clusters)) 
# No of clusters : 5687 

core_samples = np.zeros_like(labels, dtype = bool) 
core_samples[dbsc.core_sample_indices_] = True 

unique_labels = np.unique(labels) 

colors = plt.cm.Spectral(np.linspace(0,1, len(unique_labels))) 

for (label, color) in zip(unique_labels, colors): 
    class_member_mask = (labels == label) 
    xy = df_cont[class_member_mask & core_samples] 
    print("color:",color) 
    # color: [ 0.61960784 0.00392157 0.25882353 1.  ] 

    plt.plot(xy.values[:,0],xy.values[:,1], marker='o', markerfacecolor = color, markersize = 10) 

    xy2 = df_cont[class_member_mask & ~core_samples] 
    plt.plot(xy2.values[:,0],xy2.values[:,1], 'o', markerfacecolor = color, markersize = 5) 

plt.title("DBSCAN Driver - Speed MPH") 
plt.xlabel("driver") 
plt.ylabel("Speed") 
plt.show() 

Voici le message d'erreur jeté

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-105-0192647e6baf> in <module>() 
     3  xy = df_cont[class_member_mask & core_samples] 
     4  print("color:",color) 
----> 5  plt.plot(xy.values[:,0],xy.values[:,1], marker='o', markerfacecolor = color, markersize = 10) 
     6 
     7  xy2 = df_cont[class_member_mask & ~core_samples] 

/home/radiance/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py in plot(*args, **kwargs) 
    3315      mplDeprecation) 
    3316  try: 
-> 3317   ret = ax.plot(*args, **kwargs) 
    3318  finally: 
    3319   ax._hold = washold 

/home/radiance/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs) 
    1896      warnings.warn(msg % (label_namer, func.__name__), 
    1897         RuntimeWarning, stacklevel=2) 
-> 1898    return func(ax, *args, **kwargs) 
    1899   pre_doc = inner.__doc__ 
    1900   if pre_doc is None: 

/home/radiance/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py in plot(self, *args, **kwargs) 
    1404   kwargs = cbook.normalize_kwargs(kwargs, _alias_map) 
    1405 
-> 1406   for line in self._get_lines(*args, **kwargs): 
    1407    self.add_line(line) 
    1408    lines.append(line) 

/home/radiance/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py in _grab_next_args(self, *args, **kwargs) 
    405     return 
    406    if len(remaining) <= 3: 
--> 407     for seg in self._plot_args(remaining, kwargs): 
    408      yield seg 
    409     return 

/home/radiance/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py in _plot_args(self, tup, kwargs) 
    393   ncx, ncy = x.shape[1], y.shape[1] 
    394   for j in xrange(max(ncx, ncy)): 
--> 395    seg = func(x[:, j % ncx], y[:, j % ncy], kw, kwargs) 
    396    ret.append(seg) 
    397   return ret 

/home/radiance/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py in _makeline(self, x, y, kw, kwargs) 
    300   default_dict = self._getdefaults(None, kw) 
    301   self._setdefaults(default_dict, kw) 
--> 302   seg = mlines.Line2D(x, y, **kw) 
    303   return seg 
    304 

/home/radiance/anaconda3/lib/python3.6/site-packages/matplotlib/lines.py in __init__(self, xdata, ydata, linewidth, linestyle, color, marker, markersize, markeredgewidth, markeredgecolor, markerfacecolor, markerfacecoloralt, fillstyle, antialiased, dash_capstyle, solid_capstyle, dash_joinstyle, solid_joinstyle, pickradius, drawstyle, markevery, **kwargs) 
    418   self._markerfacecoloralt = None 
    419 
--> 420   self.set_markerfacecolor(markerfacecolor) 
    421   self.set_markerfacecoloralt(markerfacecoloralt) 
    422   self.set_markeredgecolor(markeredgecolor) 

/home/radiance/anaconda3/lib/python3.6/site-packages/matplotlib/lines.py in set_markerfacecolor(self, fc) 
    1204   if fc is None: 
    1205    fc = 'auto' 
-> 1206   if self._markerfacecolor != fc: 
    1207    self.stale = True 
    1208   self._markerfacecolor = fc 

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Aussi j'essayé de faire le regroupement de prendre mon lat long avec d'autres fonctions. DBSCAN a lancé une erreur indiquant que seules deux fonctionnalités sont autorisées. Devrais-je poser cette question séparément?

dbsc = DBSCAN(eps = .5, min_samples = 5, algorithm='ball_tree', metric='haversine').fit(np.radians(df_cont)) 

Le contenu de df_cont sont-

{'Day': [1, 1, 1, 1, 1], 
'Month': [6, 6, 6, 6, 6], 
'Year': [2015, 2015, 2015, 2015, 2015], 
'driver_id': [5693, 5693, 916461, 1145487, 1145487], 
'latitude': [34.640141, 34.64373, 34.551254, 35.613663, 35.614525], 
'longitude': [-77.938721, 
    -77.9394, 
    -78.78463, 
    -78.470596, 
    -78.47466999999999], 
'speed_mph': [64, 64, 1, 62, 61], 
'speedlimit_mph': [70, 70, 55, 70, 70], 
'vehicle_id': [1208979, 1208979, 1262441, 1280223, 1280223]} 
+0

J'ai ajouté quelques lignes de 'df_cont'. – joel

+0

Ne jamais * inclure * les colonnes d'ID dans le clustering. Choisissez une fonction de distance appropriée. Ne pas oublier le prétraitement. Une fois que vous avez mélangé des attributs avec différentes échelles (coordonnées, vitesse), les fruits deviennent généralement des ordures. –

+0

@ Anony-Mousse Je fais des analyses aberrantes pour trouver les pires et meilleurs pilotes ici. Actuellement, je fais le regroupement sur tous les points de données. Chaque driver_id contient de nombreuses lignes différentes donnant des informations sur ses différents voyages. Dois-je faire du clustering sur des pilotes uniques en prenant leur vitesse moyenne et aussi en abandonnant les caractéristiques lat et long. J'ai laissé tomber les colonnes d'identification. Merci beaucoup – joel

Répondre

1

Je suis l'erreur fixe en utilisant un diagramme de dispersion. plt.scatter(xy.values[:,0],xy.values[:,1],s=10,c=color,marke‌​r='o')