2012-06-17 1 views
0

Есть ли способ выполнить последовательную кластеризацию k-значений с помощью scikit-learn? Кажется, я не могу найти подходящий способ добавления новых данных без повторной установки всех данных.Последовательная кластеризация k-значений с использованием scikit-learn

Спасибо

ответ

6

класс scikit-learn KMeans имеет метод predict, который, учитывая некоторые (новые) точки, определяет, к какому из кластеров будут принадлежать эти точки. Вызов этого метода делает не изменение кластерных центроидов.

Если вы сделать хочет центроиды быть изменены путем добавления новых данных, то есть вы хотите сделать кластеризацию в онлайн настройки, используйте MiniBatchKMeans оценщик и его метод partial_fit.

3

Вы можете передать начальные значения для центроидов с параметром в sklearn.cluster.kmeansinit. Итак, вы можете просто сделать:

centroids, labels, inertia = k_means(data, k) 
new_data = np.append(data, extra_pts) 
new_centroids, new_labels, new_inertia = k_means(new_data, k, init=centroids) 

при условии, что вы просто добавление точек данных и не меняя k.

Я думаю, что это иногда означает, что вы получаете субоптимальный результат, но обычно он должен быть быстрее. Возможно, вам захочется периодически переделывать, скажем, 10 случайных семян и взять лучший.

1

Также относительно легко написать свою собственную функцию, которая обнаруживает, какой центр тяжести близок к точке, которую вы рассматриваете. Если у вас есть некоторая матрица X, который готов к kmeans:

centroids, labels, inertia = cluster.k_means(X, 5) 

def pred(arr): 
    return np.argmin([np.linalg.norm(arr-b) for b in centroids]) 

Вы можете подтвердить, что это работает через:

[pred(X[i]) == labels[i] for i in range(len(X))]