I am studying clustering techniques and i am pretty new at this topic. Here is my problem: I created a 5 lines which are made of points. This lines are supposed to be continuous and they look like this:
# Create data n0, x0, y0 = 17, np.linspace(0, 11, n0), np.linspace(10, 3, n0) n1, x1, y1 = 35, np.linspace(11, 27, n1), np.linspace(3, 3, n1) n2, x2, y2 = 15, np.linspace(27, 35, n2), np.linspace(3, 15, n2) n3, x3, y3 = 4, np.linspace(-1, 0, n3), np.linspace(10, 10, n3) n4, x4, y4 = 10, np.linspace(35, 46, n4), np.linspace(15, 15.5,n4) # Plot data plt.figure() plt.plot(x0, y0, 'o', color='grey', markersize=1) plt.plot(x1, y1, 'o', color='grey', markersize=1) plt.plot(x2, y2, 'o', color='grey', markersize=1) plt.plot(x3, y3, 'o', color='grey', markersize=1) plt.plot(x4, y4, 'o', color='grey', markersize=1) plt.show()
My goal is to use a clustering technique in order to be able to cluster each line that i have created in order to recognize the 5 different lines presented in the plot.
To do so i have opted for the
GaussianMixture clustering algorithm which i thought it could be suitable for this sort of data distribution (a line could be seen as a very skewed distribution maybe). Here is what i wrote:
# Prepare data for clustering X = np.concatenate((x0,x1,x2,x3,x4)) Y = np.concatenate((y0,y1,y2,y3,y4)) data = np.column_stack((X,Y)) # Cluster from sklearn.mixture import GaussianMixture gmm = GaussianMixture(n_components=5, covariance_type='full') X_ = gmm.fit(data) y_ = X_.predict(data) print(set(y_))
And the output that i got is something like this (it changes every time i run the code though...):
# Plot clusters plt.figure() plt.plot(data[y_==0][:,0], data[y_==0][:,1], 'o', color='red') plt.plot(data[y_==1][:,0], data[y_==1][:,1], 'o', color='blue') plt.plot(data[y_==2][:,0], data[y_==2][:,1], 'o', color='lime') plt.plot(data[y_==3][:,0], data[y_==3][:,1], 'o', color='orange') plt.plot(data[y_==4][:,0], data[y_==4][:,1], 'o', color='cyan') plt.show()
As you can see the colors should represent the 5 clusters (aka lines) that i have originally created but apparently the output is not what i want.
Could you please provide a better way to approach this problem? In case what i am doing is partially correct, what am i mistaken?