частично определить начальный центр тяжести для кластеризации K-средних Scikit-Learn - PullRequest
0 голосов
/ 29 октября 2018

Документация Scikit гласит, что:

Метод инициализации:

‘k-means ++’: разумно выбирает начальные центры кластеров для кластеризации k-средних для ускорения конвергенции. Смотрите раздел Примечания в k_init для более подробной информации.

Если ndarray передан, он должен иметь форму (n_clusters, n_features) и давать начальные центры.

Мои данные имеют 10 (прогнозируемых) кластеров и 7 функций. Тем не менее, я хотел бы передать массив размером 10 на 6, то есть я хочу, чтобы 6 размеров центроида были предопределены мной, а 7-е измерение свободно итерировать с помощью k-mean ++. (Другими словами, я не хочу указывать начальный центроид, а точнее контроль 6 измерения и оставление только одного измерения для исходного кластера)

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

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Это очень нестандартная вариация k-средних. Таким образом, вы не можете ожидать, что sklearn будет подготовлен для каждого экзотического варианта. Это сделает склеарн медленнее для всех остальных.

Фактически, ваш подход больше похож на определенные регрессионные подходы (прогнозирование последнего значения центров кластеров), чем на кластеризацию. Я также сомневаюсь, что результаты будут намного лучше, чем просто установить последнее значение на среднее значение всех точек, назначенных центру кластера, используя только остальные 6 измерений. Попробуйте разбить данные на основе ближайшего центра (игнорируя последний столбец), а затем установите в последнем столбце среднее арифметическое назначенных данных.

Однако, sklearn - это с открытым исходным кодом .

Итак, получите исходный код и измените k-means. Инициализируйте последний компонент случайным образом, и во время работы k-means обновляет только последний столбец. Это легко изменить таким способом - но очень сложно разработать эффективный API, позволяющий такие настройки через тривиальные параметры - используйте исходный код для настройки на его уровне.

0 голосов
/ 29 октября 2018

Sklearn не позволяет вам выполнять подобные мелкие операции.

Единственная возможность состоит в том, чтобы предоставить седьмое значение функции, которое является случайным или аналогично тому, что Kmeans ++ достиг бы.

Таким образом, вы можете оценить хорошее значение для этого следующим образом:

import numpy as np
from sklearn.cluster import KMeans

nb_clust = 10
# your data
X = np.random.randn(7*1000).reshape( (1000,7) )   

# your 6col centroids  
cent_6cols = np.random.randn(6*nb_clust).reshape( (nb_clust,6) ) 

# artificially fix your centroids
km = KMeans( n_clusters=10 )
km.cluster_centers_ = cent_6cols

# find the points laying on each cluster given your initialization
initial_prediction = km.predict(X[:,0:6])

# For the 7th column you'll provide the average value 
# of the points laying on the cluster given by your partial centroids    
cent_7cols = np.zeros( (nb_clust,7) )
cent_7cols[:,0:6] = cent_6cols
for i in range(nb_clust):
    init_7th = X[ np.where( initial_prediction == i ), 6].mean()
    cent_7cols[i,6] =  init_7th

# now you have initialized the 7th column with a Kmeans ++ alike 
# So now you can use the cent_7cols as your centroids
truekm = KMeans( n_clusters=10, init=cent_7cols )
...