Участок KMeans кластеров и классификация для одномерных данных - PullRequest
0 голосов
/ 23 февраля 2019

Я использую KMeans для кластеризации трех наборов данных временных рядов с различными характеристиками.По причинам воспроизводимости, я делюсь данными здесь .

Вот мой код

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

protocols = {}

types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}

for protname, fname in types.items():
    col_time,col_window = np.loadtxt(fname,delimiter=',').T
    trailing_window = col_window[:-1] # "past" values at a given index
    leading_window  = col_window[1:]  # "current values at a given index
    decreasing_inds = np.where(leading_window < trailing_window)[0]
    quotient = leading_window[decreasing_inds]/trailing_window[decreasing_inds]
    quotient_times = col_time[decreasing_inds]

    protocols[protname] = {
        "col_time": col_time,
        "col_window": col_window,
        "quotient_times": quotient_times,
        "quotient": quotient,
    }



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)
k_means.fit(quotient.reshape(-1,1))

Таким образом, учитывая новую точку данных (с quotient и quotient_times), я хочу знать, к какому cluster она принадлежитпостроение каждого набора данных, объединяя эти две преобразованные функции quotient и quotient_times с KMeans.

k_means.labels_ дает этот вывод array([1, 1, 0, 1, 2, 1, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0], dtype=int32)

Наконец, я хочу визуализировать кластеры, используя plt.plot(k_means, ".",color="blue"), но я получаю эту ошибку: TypeError: float() argument must be a string or a number, not 'KMeans'.Как мы строим KMeans кластеров?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

То, что вы действительно ищете, это диапазон значений, между которыми точки считаются в данном классе.Весьма необычно использовать 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

Чтобы получить членство в кластере для точек, передайте 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

0 голосов
/ 23 февраля 2019

Если я правильно понимаю, что вы хотите построить, это граничное решение вашего результата Kmeans.Вы можете найти пример того, как это сделать, на сайте scikit-lean здесь .

В приведенном выше примере даже выполняется PCA, поэтому данные можно визуализировать в 2D (если измерение данныхвыше 2) для вас это не имеет значения.

С помощью решения Kmeans вы можете легко изобразить цвет точек разброса, чтобы вы могли лучше понять, где произошла ваша кластеризация.

...