상관 행렬 클러스터링


20

모든 항목이 다른 항목과 어떻게 관련되는지를 나타내는 상관 관계 매트릭스가 있습니다. 따라서 N 항목의 경우 이미 N * N 상관 행렬이 있습니다. 이 상관 관계 매트릭스를 사용하여 k 번째 빈의 Nk 항목이 동일하게 작동하도록 M 빈의 N 항목을 클러스터링하는 방법은 무엇입니까? 친절하게 도와주세요. 모든 항목 값은 범주 형입니다.

감사. 더 자세한 정보가 필요하면 알려주십시오. 파이썬에는 솔루션이 필요하지만 요구 사항으로 나를 밀어내는 데 큰 도움이 될 것입니다.


N은 일반적으로 얼마나 큽니까?
Rodin

1
내 문제에 대한 계층 적 클러스터링이 필요하지 않습니다. 어떤 항목이 비슷하게 작동하는지 알려 주면됩니다.
Abhishek093

N는 통상적으로 250 - 300
Abhishek093

3
참고로이 문제를 이중 클러스터링이라고합니다. 데모는 scikit-learn.org/stable/auto_examples/bicluster/…
chanp February

답변:


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) 예 (상관 된 값은 비슷합니다)
Rodin

괜찮아. 처음 몇 개의 링크를 봤습니다. 나는 이것이 이것이 내 문제를 해결하는 데 어떻게 도움이 될지 여전히 모른다.
Abhishek093

내 답변을 편집했습니다. 도움이 되길 바랍니다.
Rodin

지금 확인하겠습니다. 문제가 맞는지 알려 드리겠습니다. 정말 고맙습니다.
Abhishek093

6

계층 적 클러스터링을 살펴 보셨습니까? 거리뿐만 아니라 유사성으로 작동 할 수 있습니다. 덴드로 그램을 k 개의 클러스터로 분할되는 높이에서 덴드로 그램을 절단 할 수 있지만 일반적으로 덴드로 그램을 육안으로 검사하고 절단 높이를 결정하는 것이 좋습니다.

계층 적 클러스터링은 종종 다른 답변에서 볼 수 있듯이 유사성 매트릭스 시각화를위한 영리한 재정렬을 생성하는 데 사용됩니다. 더 유사한 항목을 서로 옆에 배치합니다. 이것은 또한 사용자를위한 검증 도구 역할을 할 수 있습니다!


2

상관 클러스터링 을 조사 했습니까 ? 이 군집 알고리즘은 쌍별 양수 / 음수 상관 정보를 사용하여 잘 정의 된 기능과 엄격한 생성 확률 론적 해석으로 최적의 군집 수 를 자동으로 제안합니다 .


승격 된 Wikipedia 기사 : 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). ". 기계 학습. 56 : 89).
Shai

"최적의 클러스터 수"에 관한 @ttnphns : "최적"이 어떤 측정 하에서 "최적"이라는 것이 모호하다는 사실에 대해 맞습니까? 상관 클러스터링에 대해 Bagon & Galun "Large Scale Correlation Clustering" 에서 제안 된 생성 모델을 승인 하면 최적의 수를 출력합니다.
Shai

Shai, 당신은 그 방법의 발명가 중 하나 인 것 같습니다. 시간과 욕구가 있다면 더 많은 답을 제시하십시오. 구체적으로, k- 평균 또는 계층 적 (hierarhical)과 같은 잘 확립 된 방법들 중에서 방법이 어떻게 배치되는지 알고 싶어한다. 또한 상관 관계 유클리드 거리 로 쉽게 변환 있습니다 (나중에 적용 할 수있는 표준 클러스터링 방법 사용). 사실 / 트릭을 알고 있다면 "트릭"이 허용하지 않는 방법은 무엇입니까? 그것에 대해 쓰십시오. (미리 감사드립니다!)
ttnphns

1
나는 그것이 커버되기를 바랍니다. 방금이 사이트에 게시 된 답변에, 특히 방법이 다소 새롭고, 무엇을 말해야하는지, 발명가가 될 때에 더 자세한 정보를 제공하는 것이 항상 좋은 생각이라고 말하고 싶었습니다. :-) 아니요, "너무 광범위하지 않습니다".
ttnphns

-1

의미있는 (통계적 유의성) 임계 값을 필터링 한 다음 dulmage-mendelsohn 분해를 사용하여 연결된 구성 요소를 얻습니다. 어쩌면 전 이적 상관 관계와 같은 일부 문제를 제거하려고 시도하기 전에 (A는 B, B-C, C-D와 높은 상관 관계가 있으므로 모든 것을 포함하는 구성 요소가 있지만 실제로 D-A는 낮습니다). 중간 성 기반 알고리즘을 사용할 수 있습니다. 상관 관계 행렬이 대칭적이고 이중적인 것이 없기 때문에 누군가가 제안한 것처럼 문제가되지 않습니다.


이 답변은 제안 된 임계 값을 설정하는 방법을 잘 설명하지 못하는데, IMO는 임의적입니다. 또한이 질문은 2 년이되었으며 몇 개의 공감대에 대한 답변이 이미 승인되었으므로 기존 정보를 자세히 설명 할 수 있습니다.
IWS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.