То, что вы действительно ищете, это диапазон значений, между которыми точки считаются в данном классе.Весьма необычно использовать KMeans для классификации данных 1d таким образом, хотя это, безусловно, работает.Как вы заметили, вам нужно преобразовать свои входные данные в 2d массив, чтобы использовать метод.
k_means = KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',
random_state=0, tol=0.0001, verbose=0)
quotient_2d = quotient.reshape(-1,1)
k_means.fit(quotient_2d)
Вам потребуется quotient_2d
снова для шага классификации (прогнозирования).
Сначала мы можем построить центроиды, так как данные равны 1d, точка оси XПроизвольный.
colors = ['r','g','b']
centroids = k_means.cluster_centers_
for n, y in enumerate(centroids):
plt.plot(1, y, marker='x', color=colors[n], ms=10)
plt.title('Kmeans cluster centroids')
Создает следующий график.
![cluster centroids](https://i.stack.imgur.com/hqyYq.png)
Чтобы получить членство в кластере для точек, передайте quotient_2d
до .predict
.Это возвращает массив чисел для членства в классе, например,
>>> Z = k_means.predict(quotient_2d)
>>> Z
array([1, 1, 0, 1, 2, 1, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0], dtype=int32)
Мы можем использовать это для фильтрации наших исходных данных, отображая каждый класс в отдельном цвете.
# Plot each class as a separate colour
n_clusters = 3
for n in range(n_clusters):
# Filter data points to plot each in turn.
ys = quotient[ Z==n ]
xs = quotient_times[ Z==n ]
plt.scatter(xs, ys, color=colors[n])
plt.title("Points by cluster")
Это генерируетследующий график с исходными данными, каждая точка окрашена в состав кластера.
![points coloured by cluster](https://i.stack.imgur.com/YTirk.png)