Вопрос или проблема
У меня есть таблица с более чем 100K строк и более 100 числовых столбцов. Вместо того чтобы использовать метод k-means для кластеризации строк вместе (и создания нового столбца category
, который помечает каждую строку), я хочу кластеризовать столбцы/переменные вместе. Есть ли библиотека Python для кластеризации или пример, который я могу использовать для задания k и кластеризации переменных?
Существует реализация в Scikit-learn, называемая FeatureAgglomeration, которая делает именно то, что вы хотите, но с использованием иерархической кластеризации.
Она просто запускает кластерный алгоритм в транспонированной матрице X.
Таким образом, в вашем случае вы можете применить эту идею, но используя Kmeans вместо этого.
Обновление:
Недавно я столкнулся с аналогичной проблемой для уменьшения размерности и нашел реализацию на Python оригинально SAS процедуры, называемой VarClus.
Согласно документации пакета:
Это модуль Python для выполнения кластеризации переменных (varclus) с иерархической структурой. Varclus – это хороший алгоритм уменьшения размерности. Вот короткое описание:
- Кластер выбирается для деления.
- Выбранный кластер делится на два кластера путем нахождения первых двух главных компонент, выполнения ортогональной ротации и назначения каждой переменной к ротированному компоненту, с которым у нее более высокая квадратная корреляция.
- Переменные итеративно перераспределяются по кластерам для максимизации дисперсии, учитываемой компонентами кластеров.
Ответ или решение
Кластеризация признаков (столбцов) в наборе данных является актуальной задачей для анализа данных и обработки информации. В данном случае, у вас есть таблица, содержащая более 100 тысяч строк и свыше 100 числовых столбцов, и вы хотите сгруппировать столбцы, а не строки. Рассмотрим возможные подходы к решению этой задачи с использованием Python.
1. K-Means кластеризация по столбцам
Хотя K-Means традиционно применяется для кластеризации объектов (строк), вы можете адаптировать его для работы со столбцами. Основная идея заключается в том, чтобы транспонировать матрицу данных: строки и столбцы меняются местами, после чего K-Means можно использовать как обычно.
Пример использования K-Means
import pandas as pd
from sklearn.cluster import KMeans
# Загрузка ваших данных
data = pd.read_csv('your_data.csv')
# Транспонирование данных
transposed_data = data.T
# Определение количества кластеров
k = 5 # Задайте желаемое количество кластеров
# Применение K-Means к транспонированным данным
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(transposed_data)
# Получение меток кластеров для каждого столбца
column_clusters = kmeans.labels_
# Добавление меток кластеров в DataFrame
clustered_columns = pd.DataFrame({'Column': transposed_data.index, 'Cluster': column_clusters})
print(clustered_columns)
2. Альтернативный подход: FeatureAgglomeration
Как вы уже упомянули, в библиотеке Scikit-learn есть реализация агломеративного кластеринга через FeatureAgglomeration
. Этот метод выполняет кластеризацию, сгруппировывая подобные признаки, и может быть отличной альтернативой, если вы хотите использовать другой подход к кластеризации.
Пример использования FeatureAgglomeration
from sklearn.cluster import FeatureAgglomeration
# Загрузка ваших данных
data = pd.read_csv('your_data.csv')
# Создание экземпляра FeatureAgglomeration
agglo = FeatureAgglomeration(n_clusters=k)
# Применение к данным
agglo.fit(data)
# Получение меток кластеров для столбцов
aggregated_clusters = agglo.transform(data)
# Примечание: Метод возвращает новую редуцированную матрицу
3. Использование VarClus
Вы также упомянули, что нашли реализацию VarClus, которая предназначена для кластеризации переменных и является мощным инструментом для уменьшения размерности. Этот метод итерирует произвольные переменные и кластеризует их, оптимизируя представление данных.
Пример использования VarClus
# Установка пакета
# !pip install varclushi # Раскомментируйте, чтобы установить пакет
from varclushi import Varclus
# Загрузка ваших данных
data = pd.read_csv('your_data.csv')
# Создание экземпляра VarClus
varclus = Varclus(data)
# Настройка параметров и запуск кластеризации
varclus.fit(n_clusters=k)
# Получение результатов
cluster_results = varclus.get_clusters()
print(cluster_results)
Заключение
Кластеризация по столбцам может быть реализована как с помощью K-Means, так и через другие методы, такие как FeatureAgglomeration и VarClus. Выбор конкретного метода зависит от специфики ваших данных и целей анализа. Не забывайте, что перед использованием кластеризации данные должны быть предварительно обработаны (например, нормализованы или стандартизированы) для достижения наилучших результатов.