кластеризация k-средних по столбцам, а не строкам

Вопрос или проблема

У меня есть таблица с более чем 100K строк и более 100 числовых столбцов. Вместо того чтобы использовать метод k-means для кластеризации строк вместе (и создания нового столбца category, который помечает каждую строку), я хочу кластеризовать столбцы/переменные вместе. Есть ли библиотека Python для кластеризации или пример, который я могу использовать для задания k и кластеризации переменных?

Существует реализация в Scikit-learn, называемая FeatureAgglomeration, которая делает именно то, что вы хотите, но с использованием иерархической кластеризации.

Она просто запускает кластерный алгоритм в транспонированной матрице X.

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

Обновление:

Недавно я столкнулся с аналогичной проблемой для уменьшения размерности и нашел реализацию на Python оригинально SAS процедуры, называемой VarClus.

Согласно документации пакета:

Это модуль Python для выполнения кластеризации переменных (varclus) с иерархической структурой. Varclus – это хороший алгоритм уменьшения размерности. Вот короткое описание:

  1. Кластер выбирается для деления.
  2. Выбранный кластер делится на два кластера путем нахождения первых двух главных компонент, выполнения ортогональной ротации и назначения каждой переменной к ротированному компоненту, с которым у нее более высокая квадратная корреляция.
  3. Переменные итеративно перераспределяются по кластерам для максимизации дисперсии, учитываемой компонентами кластеров.

Ответ или решение

Кластеризация признаков (столбцов) в наборе данных является актуальной задачей для анализа данных и обработки информации. В данном случае, у вас есть таблица, содержащая более 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. Выбор конкретного метода зависит от специфики ваших данных и целей анализа. Не забывайте, что перед использованием кластеризации данные должны быть предварительно обработаны (например, нормализованы или стандартизированы) для достижения наилучших результатов.

Оцените материал
Добавить комментарий

Капча загружается...