2017-05-29 1 views
1

J'ai un jeu de données similaire à celui illustré ci-dessous, qui forme clairement des lignes de mon point de vue. Au lieu de dessiner des marqueurs, je veux connecter les marqueurs dans chaque courbe par une ligne. Je suis curieux, dans ce cas, quel type d'algorithmes de cluster serait un bon?Extraction de grappes sous la forme de lignes à partir d'un ensemble de données

import numpy as np 
import matplotlib.pyplot as plt 
np.random.seed = 42 

#Generate (x,y) data 
x = np.linspace(0.1,0.9,50) 
y = x%1 
x += np.sin(2*x%1) 
y = y%0.2 

#Shuffle (x,y) data 
ns = list(range(len(x))) 
np.random.shuffle(ns) 
x = x[ns] 
y = y[ns] 

#Plot 
fig, axs = plt.subplots(1,2) 
axs[0].scatter(x,y) 
axs[1].plot(x,y) 
plt.savefig("markers vs lines.pdf") 

Figure - Gauche: Marqueurs, à droite: Les points de données reliés par des lignes.

enter image description here

Répondre

2

Étant donné que vous avez demandé l'algorithme de clustering, vous pouvez consulter DBSCAN.

http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html

Il y a deux paramètres, epsilon et le nombre de points pour faire un cluster.

Voici un code pour vous aider à démarrer:

from sklearn.cluster import DBSCAN 
from sklearn.preprocessing import StandardScaler 

import numpy as np 
import matplotlib.pyplot as plt 
np.random.seed = 42 
%matplotlib inline 

#Generate (x,y) data 
x = np.linspace(0.1,0.9,50) 
y = x%1 
x += np.sin(2*x%1) 
y = y%0.2 

#Shuffle (x,y) data 
ns = list(range(len(x))) 
np.random.shuffle(ns) 
x = x[ns] 
y = y[ns] 

""" 
    Fit the Data 
""" 
X = [i for i in zip(x,y)] 
X = StandardScaler().fit_transform(X) 

""" 
    Compute the DBSCAN 
""" 
db = DBSCAN(eps=0.5, min_samples=1).fit(X) 
labels = db.labels_ 

# Number of clusters in labels, ignoring noise if present. 
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) 
n_clusters_ 

""" 
    Plot the clusters 
""" 
d= dict(zip(set(labels),['red','green','blue','yellow','purple','grey'])) 
d[-1] = "black" 
plt.scatter(x,y,color=[ d[i] for i in labels]) 
plt.show() 

Le résultat:

Graph color result from DBSCAN

inpired par: http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html

En savoir plus sur les paramètres du dbscan ici: http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html#sklearn.cluster.DBSCAN

Espérons que cette aide.

+0

Excellent, DBSCAN fait exactement ce que je cherchais. Je vous remercie. – physicsGuy

1

Ces données sont courantes en analyse d'images, en raison de l'architecture. Afin de déduire la perspective, les gens ont utilisé la transformée de Hough pour identifier les lignes de points '.

C'est probablement la meilleure méthode à utiliser ici.

+0

Merci. Si je comprends bien, la transformation de Hough fonctionne bien si la forme des courbes est connue (par exemple une ligne droite ou une parabole). En principe, c'est la bonne réponse pour les parcelles ci-dessus. Cependant, dans mon cas, je ne connais pas exactement la forme des courbes. La réponse de Tbaki convient mieux à ce cas, puisque DBSCAN n'a pas besoin de connaître la forme des courbes. – physicsGuy

+0

Ils doivent seulement être assez proches d'une ligne; ils ne peuvent pas être un cercle. DBSCAN est une option (vous devriez alors peut-être utiliser le clustering 4C, basé sur DBSCAN?) Mais vous verrez qu'il échoue si les lignes sont trop proches les unes des autres. –

+0

Merci, l'algorithme 4C semble être une bonne extension à mon problème. Cependant, la version DBscan simple est suffisante dans mon cas. – physicsGuy