Кластеризація кореляційної матриці


20

У мене є кореляційна матриця, яка визначає, як кожен елемент співвідноситься з іншим елементом. Отже, для N елементів я вже маю кореляційну матрицю N * N. Використовуючи цю кореляційну матрицю, як я кластеризую N елементів у M-бункерах, щоб я міг сказати, що Nk-елементи в kth bin поводяться однаково. Прошу допомогти мені. Усі значення елементів є категоричними.

Спасибі. Повідомте мене, якщо вам потрібна додаткова інформація. Мені потрібно рішення в Python, але будь-яка допомога у підштовхуванні мене до вимог буде великою допомогою.


як велика N зазвичай?
Родін

1
Мені не потрібна ієрархічна кластеризація моєї проблеми. Просто потрібно сказати, які предмети ведуть себе так само.
Abhishek093

N, як правило, становить 250 - 300.
Abhishek093,

3
БЮР, ця проблема називається бі-кластеризацією. Демонстрацію його можна знайти на scikit-learn.org/stable/auto_examples/bicluster/…
chanp

Відповіді:


15

Схоже на роботу для моделювання блоків. Google допомагає "блокувати моделювання" та перші кілька звернень.

Скажімо, у нас є матриця коваріації, де N = 100, а насправді є 5 кластерів: Початкова матриця коваріації

Те, що намагається зробити моделювання блоків, - це впорядкування рядків, щоб кластери стали очевидними як "блоки": Оптимізований порядок матриці коваріації

Нижче наведено приклад коду, який виконує основний жадібний пошук для цього. Можливо, це занадто повільно для ваших 250-300 змінних, але це початок. Подивіться, чи можете ви слідувати разом із коментарями:

import numpy as np
from matplotlib import pyplot as plt

# This generates 100 variables that could possibly be assigned to 5 clusters
n_variables = 100
n_clusters = 5
n_samples = 1000

# To keep this example simple, each cluster will have a fixed size
cluster_size = n_variables // n_clusters

# Assign each variable to a cluster
belongs_to_cluster = np.repeat(range(n_clusters), cluster_size)
np.random.shuffle(belongs_to_cluster)

# This latent data is used to make variables that belong
# to the same cluster correlated.
latent = np.random.randn(n_clusters, n_samples)

variables = []
for i in range(n_variables):
    variables.append(
        np.random.randn(n_samples) + latent[belongs_to_cluster[i], :]
    )

variables = np.array(variables)

C = np.cov(variables)

def score(C):
    '''
    Function to assign a score to an ordered covariance matrix.
    High correlations within a cluster improve the score.
    High correlations between clusters decease the score.
    '''
    score = 0
    for cluster in range(n_clusters):
        inside_cluster = np.arange(cluster_size) + cluster * cluster_size
        outside_cluster = np.setdiff1d(range(n_variables), inside_cluster)

        # Belonging to the same cluster
        score += np.sum(C[inside_cluster, :][:, inside_cluster])

        # Belonging to different clusters
        score -= np.sum(C[inside_cluster, :][:, outside_cluster])
        score -= np.sum(C[outside_cluster, :][:, inside_cluster])

    return score


initial_C = C
initial_score = score(C)
initial_ordering = np.arange(n_variables)

plt.figure()
plt.imshow(C, interpolation='nearest')
plt.title('Initial C')
print 'Initial ordering:', initial_ordering
print 'Initial covariance matrix score:', initial_score

# Pretty dumb greedy optimization algorithm that continuously
# swaps rows to improve the score
def swap_rows(C, var1, var2):
    '''
    Function to swap two rows in a covariance matrix,
    updating the appropriate columns as well.
    '''
    D = C.copy()
    D[var2, :] = C[var1, :]
    D[var1, :] = C[var2, :]

    E = D.copy()
    E[:, var2] = D[:, var1]
    E[:, var1] = D[:, var2]

    return E

current_C = C
current_ordering = initial_ordering
current_score = initial_score

max_iter = 1000
for i in range(max_iter):
    # Find the best row swap to make
    best_C = current_C
    best_ordering = current_ordering
    best_score = current_score
    for row1 in range(n_variables):
        for row2 in range(n_variables):
            if row1 == row2:
                continue
            option_ordering = best_ordering.copy()
            option_ordering[row1] = best_ordering[row2]
            option_ordering[row2] = best_ordering[row1]
            option_C = swap_rows(best_C, row1, row2)
            option_score = score(option_C)

            if option_score > best_score:
                best_C = option_C
                best_ordering = option_ordering
                best_score = option_score

    if best_score > current_score:
        # Perform the best row swap
        current_C = best_C
        current_ordering = best_ordering
        current_score = best_score
    else:
        # No row swap found that improves the solution, we're done
        break

# Output the result
plt.figure()
plt.imshow(current_C, interpolation='nearest')
plt.title('Best C')
print 'Best ordering:', current_ordering
print 'Best score:', current_score
print
print 'Cluster     [variables assigned to this cluster]'
print '------------------------------------------------'
for cluster in range(n_clusters):
    print 'Cluster %02d  %s' % (cluster + 1, current_ordering[cluster*cluster_size:(cluster+1)*cluster_size])

Чи не використовується ця методика для кластеризації соціальних мереж? Чи буде це актуально тут? Чи має сенс використовувати цю кореляційну матрицю як матрицю відстані?
Abhishek093

1) Так, 2) Я думаю, що так, 3) Так (величини, які сильно корелюються, близькі)
Родін

Добре. Я бачив через перші кілька посилань. Я досі не знаю, як це допоможе мені вирішити свою проблему.
Abhishek093

Я відредагував свою відповідь. Я сподіваюся, що вона вам корисна.
Родін

Я зараз це перевірю. Я дам вам знати, чи відповідає моїй проблемі. Дуже дякую.
Abhishek093

6

Ви подивилися на ієрархічну кластеризацію? Він може працювати з подібністю, не тільки з відстанями. Ви можете вирізати дендрограму на висоті, де вона розпадається на k кластери, але зазвичай краще візуально оглянути дендрограму та вирішити, яку висоту потрібно вирізати.

Ієрархічна кластеризація також часто використовується для створення розумного переупорядкування для матриці подібності візуалізації, як видно в іншій відповіді: вона розміщує більше подібних записів поруч. Це може послужити інструментом перевірки і для користувача!


2

Ви розглядали кореляційну кластеризацію ? Цей алгоритм кластеризації використовує парну інформацію позитивної / негативної кореляції, щоб автоматично запропонувати оптимальну кількість кластерів із чітко визначеним функціоналом та жорсткою генеративною імовірнісною інтерпретацією .


Сприяли статті Вікіпедії: Correlation clustering provides a method for clustering a set of objects into the optimum number of clusters without specifying that number in advance. Це визначення методу? Якщо так, це дивно, оскільки існують інші методи автоматичного підрахунку кількості кластерів, а також, чому тоді це називається "кореляція".
ttnphns

@ttnphns (1) його називають "кореляційною кластеризацією", тому що він очікує введення парної кореляційної матриці (див. початкову роботу Bansal, N .; Blum, A .; Chawla, S. (2004). "Correlation Clustering" ". Машинне навчання. 56: 89).
Шай

@ttnphns щодо "оптимальної кількості кластерів": ви маєте рацію з приводу того, що "оптимальне" є неоднозначним, "оптимальним" під якою мірою? Що стосується кореляційного кластеризації, якщо ви приймаєте генеративну модель, запропоновану в Багоні та Галуні "Кластеризація великої шкали кореляції" , то метод дійсно виводить оптимальне число.
Шай

Шай, здається, ти один із винахідників методу. Я б закликав вас дати більш розгорнуту відповідь, представляючи її - якщо у вас є час та бажання. Зокрема, хочеться знати, як метод розміщується серед деяких добре встановлених, таких як k-засоби або ієрархічні. Зауважте також, що кореляція легко перетворюється на евклідову відстань (з будь-яким стандартним методом кластеризації, застосованим після цього), - знаючи, що факт / трюк, що тоді дозволяє ваш метод, який цей "трюк" не дозволяє? Пишіть про це. (Дякую заздалегідь!)
ttnphns

1
Сподіваюсь, це охоплює. Я просто хотів сказати, що завжди корисно надати трохи більше деталей у відповіді, розміщеній на цьому веб-сайті, особливо коли метод є досить новим і коли хтось знає, що сказати, будучи винахідником. :-) Ні, не "занадто широкий".
ttnphns

-1

Я би фільтрував деякий змістовний (статистична значущість) поріг, а потім використовував dulmage-mendelsohn розкладання, щоб отримати з'єднані компоненти. Можливо, перш ніж ви можете спробувати усунути якусь проблему, наприклад, транзитивні кореляції (A корелює з B, B до C, C до D, тому є компонент, який містить усі вони, але насправді D до A є низьким). ви можете використовувати алгоритм, заснований на міжзв'язках. Це не біклістерна проблема, як хтось запропонував, оскільки матриця кореляції є симетричною і тому немає би-чого-небудь.


Ця відповідь не зовсім пояснює, як встановити запропоновані пороги, які IMO здаються довільними. Крім того, оскільки це питання вже два роки, і відповідь із кількома оновленнями вже прийнято, можливо, ви захочете детальніше розглянути вже наявну інформацію.
IWS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.