Phân cụm một ma trận tương quan


20

Tôi có một ma trận tương quan trong đó nêu rõ mọi mặt hàng có tương quan với mặt hàng khác như thế nào. Do đó đối với một mục N, tôi đã có ma trận tương quan N * N. Sử dụng ma trận tương quan này, làm cách nào để phân cụm các mục N trong các thùng M để tôi có thể nói rằng các Mục Nk trong thùng thứ k hoạt động giống nhau. Xin vui lòng giúp tôi ra. Tất cả các giá trị mục là phân loại.

Cảm ơn. Hãy cho tôi biết nếu bạn cần thêm thông tin. Tôi cần một giải pháp trong Python nhưng bất kỳ trợ giúp nào trong việc đưa tôi đến các yêu cầu sẽ là một trợ giúp lớn.


N thường lớn như thế nào?
Rodin

1
Tôi không cần một cụm phân cấp cho vấn đề của tôi. Chỉ cần cho biết những mặt hàng hành xử tương tự.
Abhishek093

N thường là 250 - 300.
Abhishek093

3
FYI, vấn đề này được gọi là bi-clustering. Một bản demo của nó có thể được tìm thấy tại scikit-learn.org/urdy/auto_examples/bicluster/ khăn
chanp

Câu trả lời:


15

Trông giống như một công việc cho mô hình khối. Google cho "mô hình hóa khối" và một vài lần truy cập đầu tiên rất hữu ích.

Giả sử chúng ta có một ma trận hiệp phương sai trong đó N = 100 và thực tế có 5 cụm: Ma trận hiệp phương sai ban đầu

Điều mà mô hình khối đang cố gắng thực hiện là tìm thứ tự các hàng, sao cho các cụm trở nên rõ ràng dưới dạng 'khối': Tối ưu hóa thứ tự ma trận hiệp phương sai

Dưới đây là một ví dụ mã thực hiện tìm kiếm tham lam cơ bản để thực hiện điều này. Có thể quá chậm đối với 250-300 biến của bạn, nhưng đó là một sự khởi đầu. Xem nếu bạn có thể làm theo cùng với các ý kiến:

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])

Có phải kỹ thuật đó được sử dụng để phân cụm Mạng xã hội? Điều đó có liên quan ở đây không? Liệu nó có ý nghĩa để sử dụng ma trận tương quan đó như một ma trận khoảng cách?
Abhishek093

1) Có, 2) Tôi nghĩ vậy, 3) Có (các giá trị có tương quan cao rất gần nhau)
Rodin

Đuợc. Tôi thấy qua vài liên kết đầu tiên. Tôi vẫn không biết làm thế nào điều này sẽ giúp tôi giải quyết vấn đề của tôi.
Abhishek093

Tôi đã chỉnh sửa câu trả lời của mình. Tôi hy vọng nó hữu ích cho bạn.
Rodin

Tôi sẽ kiểm tra nó ngay bây giờ. Tôi sẽ cho bạn biết nếu nó phù hợp với vấn đề của tôi. Cảm ơn bạn rất nhiều.
Abhishek093

6

Bạn đã xem phân cụm phân cấp? Nó có thể làm việc với sự tương đồng, không chỉ khoảng cách. Bạn có thể cắt dendrogram ở độ cao nơi nó chia thành các cụm k, nhưng thường thì tốt hơn là kiểm tra trực quan dendrogram và quyết định độ cao để cắt.

Phân cụm theo phân cấp cũng thường được sử dụng để tạo ra một sự sắp xếp lại thông minh cho một vidualization ma trận tương tự như đã thấy trong câu trả lời khác: nó đặt nhiều mục tương tự cạnh nhau. Điều này cũng có thể phục vụ như một công cụ xác nhận cho người dùng, quá!


2

Bạn đã nhìn vào cụm tương quan ? Thuật toán phân cụm này sử dụng thông tin tương quan tích cực / tiêu cực theo cặp để tự động đề xuất số lượng cụm tối ưu với chức năng được xác định rõ và giải thích xác suất tổng quát nghiêm ngặt .


Bài viết Wikipedia được quảng bá : Correlation clustering provides a method for clustering a set of objects into the optimum number of clusters without specifying that number in advance. Đó có phải là một định nghĩa của phương pháp? Nếu có, nó là lạ bởi vì tồn tại các phương thức khác để tự động đề xuất số lượng cụm, và tại sao nó được gọi là "tương quan".
ttnphns

@ttnphns (1) nó được gọi là "phân cụm tương quan" bởi vì nó kỳ vọng là đầu vào một ma trận tương quan theo cặp (xem công việc bán kết của Bansal, N.; Blum, A.; Chawla, S. (2004). " ". Học máy. 56: 89).
Shai

@ttnphns liên quan đến "số cụm tối ưu": bạn có đúng về thực tế rằng "tối ưu" là mơ hồ, "tối ưu" theo biện pháp nào? Đối với phân cụm tương quan, nếu bạn chấp nhận mô hình thế hệ được đề xuất trong "Phân cụm tương quan quy mô lớn" của Bagon & Galun , thì phương thức này sẽ đưa ra số tối ưu.
Shai

Shai, có vẻ như bạn là một trong những người phát minh ra phương pháp. Tôi sẽ khuyến khích bạn đưa ra một câu trả lời chưa được trình bày hơn - nếu bạn có thời gian và mong muốn. Cụ thể, người ta muốn biết làm thế nào phương thức được đặt trong số một số phương pháp được thiết lập tốt, chẳng hạn như k-nghĩa hoặc chữ tượng hình. Cũng lưu ý rằng mối tương quan có thể dễ dàng chuyển đổi thành khoảng cách euclide (với bất kỳ phương pháp phân cụm tiêu chuẩn nào có thể áp dụng sau đó), - biết rằng thực tế / mẹo đó, phương pháp của bạn cho phép "trò lừa" nào không cho phép? Viết về nó. (Cảm ơn trước!)
ttnphns

1
Tôi hy vọng nó bao gồm. Tôi chỉ muốn nói rằng luôn luôn là một ý tưởng tốt để cung cấp thêm một chút chi tiết trong câu trả lời được đăng trên trang web này, đặc biệt là khi một phương pháp còn khá mới và khi người ta biết phải nói gì, là một nhà phát minh. :-) Không, không "quá rộng".
ttnphns

-1

Tôi sẽ lọc ở một số ngưỡng có ý nghĩa (có ý nghĩa thống kê) và sau đó sử dụng phân tách dulmage-mendelsohn để có được các thành phần được kết nối. Có thể trước khi bạn có thể cố gắng loại bỏ một số vấn đề như tương quan bắc cầu (A tương quan cao với B, B đến C, C đến D, do đó, có một thành phần chứa tất cả chúng, nhưng thực tế là D đến A thấp). bạn có thể sử dụng một số thuật toán dựa trên giữa. Đó không phải là một vấn đề rắc rối như ai đó đề xuất, vì ma trận tương quan là đối xứng và do đó không có bi-gì.


Câu trả lời này không hoàn toàn giải thích cách đặt ngưỡng được đề xuất, mà IMO có vẻ tùy ý. Ngoài ra, vì câu hỏi này đã được hai năm và một câu trả lời với một vài câu hỏi đã được chấp nhận, bạn có thể muốn giải thích về thông tin đã có sẵn.
IWS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.