Python: Znaczenie parametru origin w funkcji imshow()

4-paź-2020

Funkcja imshow ma parametr origin, który określa kierunek rysowania. Interpretacja danych zapisanych w macierzy może być naniesiona na wykres na różne sposoby. Przecież macierz (pomijając jej kształt) to po prostu jakiś ciąg liczb. Ten ciąg liczb można odwzorowywać na wykrsie tak, że początkowe wartości będą narysowane po lewej na dole, albo u góry. Za to właśnie odpowiada ten parametr. 

Poniższy skrypt generuje losowe dane, dzieli je na clustry skupień punktów, a następnie koloruje tło, tak aby pojawiły sie granice clustrów.

import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
 
 
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
 
X, y = make_blobs(n_samples=100, centers=4, cluster_std=0.60, random_state=0)
 
plt.scatter(X[:,0], X[:,1])
 
WCSS = []
 
for k in range(1,15):
 kmeans = KMeans(n_clusters=k)
 kmeans.fit(X)
 WCSS.append(kmeans.inertia_)
 
plt.plot(range(1,15),WCSS)
plt.xlabel("Number of K Value(Cluster)")
plt.ylabel("WCSS")
plt.grid()
plt.show()
 
 
 
kmeans =KMeans(n_clusters = 4 ,max_iter=300, random_state= 1)
clusters = kmeans.fit_predict(X) 
labels = kmeans.labels_
centroids = kmeans.cluster_centers_
 
 
h = 0.5
x_min, x_max = X[:,0].min(), X[:,0].max()
y_min, y_max = X[:,1].min(), X[:,1].max()
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()]) 
Z = Z.reshape(xx.shape)
 
plt.figure(1 , figsize = (15 , 7) )
plt.clf()
 
plt.imshow(Z , interpolation='nearest', 
 extent=(xx.min(), xx.max(), yy.min(), yy.max()),
 cmap = plt.cm.Pastel1, origin='lower')
 
plt.scatter(x=X[:,0], y=X[:,1], c=labels, s=100)
 
plt.scatter(x=centroids[:,0], y=centroids[:,1],s=300 , c='red')
 
plt.ylabel('x') , plt.xlabel('y')
plt.grid()
plt.title("Clustering")
plt.show()

Wygenerowany wykres może wygladać mniej wiecej tak:

Jeśli jednak zmienić by parametr na upper, to otrzymasz taki wykres:

Ten drugi wykres jest jakby lustrzanym odbiciem pierwszego, jeśi chodzi o rysowane tło. Widać, że punkty wyznaczające cluster nie trafiły w pokolorowane granice. To wszystko wina tego, że tło zaczęliśmy kolorować w złym miejscu…

Komentarze są wyłączone

Autor: Rafał Kraik