Как определить, какой аргумент `x` использовать для K-средних и точечных диаграмм? - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь реализовать и визуализировать код алгоритма K-средних в Python.У меня есть набор данных, который я создал с помощью make_blobs, затем я подгоняю данные с помощью K-средних и визуализирую результаты с помощью matplotlib.pyplot.scatter.

Вот мой код:

Импорт ишаг создания данных

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

n_samples = 3000
random_state = 1182

X, y = make_blobs(n_samples=n_samples, random_state=random_state)
# X.shape = (3000, 2)
# y.shape = (3000,) -> y's values range from 0 to 2.


Точечный график исходных данных

plt.scatter(X[:, 0], X[:, 1])
plt.title("Original Dataset Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("X[:, 1]")
plt.show()

enter image description here


K-Средства обучения и визуализации

kmeans_model = KMeans(n_clusters=3, random_state=1)
kmeans_model.fit(X)

colors = { 0: 'r',
           1: 'b',
           2: 'g'}

label_color = [colors[l] for l in y]
plt.scatter(X[:, 0], kmeans_model.labels_, c=label_color)
plt.title("K-Means Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("Labels")
plt.show()

enter image description here

Мой вопрос это: когда я использую plt.scatter с X[:, 1] вместо X[:, 0], как я делал в данном коде, я получаю другой график, хотя и с такими же кластерами, как:

enter image description here

Будет ли это по-прежнему считаться правильной реализацией и использованием K-средних и точечных диаграмм?Если да, то есть ли конкретная причина, по которой следует выбирать определенные значения x над другими?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Ваш K-means учитывает как X[:,0], так и X[:,1].Кластеризация осуществляется по двум измерениям.
Правильный способ представления K-средних будет отображать оба измерения и использовать раскраску (как вы это сделали).

Относительно вашего вопроса. Причина разницы в том, что вы используете для 1 графика первые измерения, поэтому вы отображаете точки в соответствии с [:,0] координатой, а во втором - в соответствии с [:,1].

Правильным способом было бы использовать обе координаты, использовать раскраску и, если возможно, добавлять центроиды кластера всегда приятно: enter image description here

Изменение кода:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

n_samples = 3000
random_state = 1182

X, y = make_blobs(n_samples=n_samples, random_state=random_state)

kmeans_model = KMeans(n_clusters=3, random_state=1)
kmeans_model.fit(X)

colors = { 0: 'r',
           1: 'b',
           2: 'g'}

label_color = [colors[l] for l in y]
plt.scatter(X[:, 0],X[:,1], c=label_color, s=10)
plt.scatter(kmeans_model.cluster_centers_[:,0],kmeans_model.cluster_centers_[:,1],s=300,marker='+',c='y')
plt.title("K-Means Scatter Plot")
plt.xlabel("X[:, 0]")
plt.ylabel("Labels")
plt.show()

Будет выдано: enter image description here

Обратите внимание, что я добавил строку для центроидов кластера.

0 голосов
/ 16 декабря 2018

Это очень странный способ визуализации кластеризации.Если вы хотите увидеть, насколько хорошо работала ваша модель, вам просто нужно построить все капли, как вы делали на первой диаграмме, а затем указать последовательность раскраски label_color.

plt.scatter(X[:,0], X[:,1], c=label_color)

enter image description here

Ваш вопрос об использовании X [:, 0] или X [:, 1] не являетсяправильно установлено.Оба эти измерения представляют данные, и ваши диаграммы будут в некотором роде правильными, но они не будут интерпретируемыми.

...