У меня есть набор данных, который имеет 48000 строк и 24 столбцов, каждый столбец был нормализован, так что это значение между 0 и 1.
Я пытался сгруппировать данные в кривые, но я не уверен, что моя реализация верна:
cluster_num = 8
kclustering = KMeans(n_clusters=cluster_num, random_state=RAND).fit(df_reads)
kclustering.transform(df_reads)
Когда я смотрю на данные, я вижу:
>> kclustering.cluster_centers_[0]
array([ 0.44851436, 0.40071485, 0.37478944, 0.36488641, 0.37286438,
0.4042693 , 0.47056609, 0.502428 , 0.47682049, 0.47377337,
0.47723668, 0.49041012, 0.5107349 , 0.53044935, 0.55766196,
0.61032937, 0.66640804, 0.72395814, 0.77165046, 0.8449527 ,
0.83843484, 0.75404816, 0.63712833, 0.5259275 ])
Я хотел бы подтвердить свое понимание kmeans на основе просмотра документации и исходного кода с веб-страницы sklearn :
Fit - Эта функция подгонит модель kmeans к данным, представленным как [n_samples, m_features], где в этом случае n равно 48000 выборок, а m равно 24 функциям.
Преобразование - это преобразовывает данные в пространство расстояния кластера. Основываясь на моем тестировании, это возвращает массив [n_samples, m_clusters], где n_samples равен 48000, а m_clusters равен 8 (как определено из объявления 8 кластеров выше), и показывает расстояние, которое каждая выборка находится от каждого кластера.
>> kclustering.transform(df_reads)[0]
array([ 0.76017856, 1.69920653, 0.81333364, 1.21883207, 1.65154547,
0.83507006, 1.6426527 , 1.35372735])
Predict - принимает другой набор данных [n_samples, m_features], соответствующий шагу 'Fit', и назначает номер кластера для каждого образца, возвращая массив размера [1, n_labels], где n равно 48000 в этот случай.
Я видел вызов метода 'transform' в примере, который посмотрел вверх, но необходим ли этот шаг преобразования? Cluster_centers_ точно так же с и без этой строки:
kclustering.transform(df_reads)
И если да, то не должно ли оно быть присвоено переменной? Похоже, что линия не служит цели в функциональности программы.
Исходя из моего понимания, преобразование преобразует набор данных [48000, 24] в [48000, 8] с расстоянием от каждого назначенного кластера, но преобразование фактически не вычисляет расстояние, этот шаг, кажется, происходит в вызов 'fit', потому что для параметра 'precompute_distances' по умолчанию установлено значение 'auto', где в документации указано:
‘auto’: не рассчитывать расстояния, если n_samples * n_clusters> 12
млн. Это соответствует примерно 100 МБ на одну работу с использованием двойной
точность.
Является ли единственной причиной того, что precompute_distances никогда не устанавливается в True из-за проблем с памятью? Если precompute_distances был установлен в False, в этот момент был бы необходим вызов «Transform»?
Наконец, 24 объекта были извлечены из исходного кадра данных, если я хочу сопоставить метки кластера каждого образца обратно с исходными записями, было бы так же просто, как использовать pd.concat () в kmeans.labels результат с исходным кадром данных, чтобы узнать, какой первичный ключ назначен для каждой метки?
Это то, что я сделал, но я не уверен, как проверить, была ли назначена правильная метка при использовании concat, кроме ручного поиска нескольких выборок и попытки сопоставить их кривые с назначенными кластерными кривыми.
Спасибо!