การจัดกลุ่มเมทริกซ์สหสัมพันธ์


20

ฉันมีเมทริกซ์สหสัมพันธ์ซึ่งระบุว่ารายการทั้งหมดสัมพันธ์กับรายการอื่นอย่างไร ดังนั้นสำหรับรายการ N ฉันมีเมทริกซ์สหสัมพันธ์ N * N อยู่แล้ว การใช้เมทริกซ์สหสัมพันธ์นี้ฉันจะจัดกลุ่มรายการ N ในถังขยะ M อย่างไรเพื่อให้ฉันสามารถพูดได้ว่ารายการ Nk ในถังขยะ kth ทำงานเหมือนกัน กรุณาช่วยฉันออก ค่ารายการทั้งหมดเป็นหมวดหมู่

ขอบคุณ แจ้งให้เราทราบหากคุณต้องการข้อมูลเพิ่มเติม ฉันต้องการวิธีแก้ปัญหาใน Python แต่ความช่วยเหลือในการผลักดันฉันไปสู่ข้อกำหนดนั้นจะเป็นประโยชน์อย่างมาก


ปกติแล้ว N จะมีขนาดใหญ่แค่ไหน?
Rodin

1
ฉันไม่ต้องการการจัดกลุ่มแบบลำดับชั้นสำหรับปัญหาของฉัน เพียงแค่ต้องบอกว่ารายการใดมีพฤติกรรมเช่นเดียวกัน
Abhishek093

โดยทั่วไปแล้ว N - 250 - 300
Abhishek093

3
FYI ปัญหานี้เรียกว่าการทำคลัสเตอร์สองชั้น ตัวอย่างของมันสามารถพบได้ที่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) ใช่ (ค่าที่มีความสัมพันธ์สูงมากอยู่ใกล้)
Rodin

ตกลง. ฉันเห็นผ่านลิงค์แรก ๆ ฉันยังไม่รู้ว่าจะช่วยฉันแก้ปัญหาได้อย่างไร
Abhishek093

ฉันแก้ไขคำตอบของฉันแล้ว ฉันหวังว่าจะเป็นประโยชน์กับคุณ
Rodin

ฉันจะลองดูตอนนี้ ฉันจะแจ้งให้คุณทราบว่ามันเหมาะกับปัญหาของฉัน ขอบคุณมาก.
Abhishek093

6

คุณดูการจัดกลุ่มแบบลำดับชั้นแล้วหรือยัง มันสามารถทำงานกับความคล้ายคลึงกันไม่เพียง แต่ในระยะทาง คุณสามารถตัด dendrogram ที่ความสูงซึ่งแบ่งออกเป็น k กลุ่ม แต่โดยปกติจะดีกว่าที่จะตรวจสอบ dendrogram ด้วยสายตาและตัดสินใจเลือกความสูงที่จะตัด

การจัดกลุ่มตามลำดับชั้นมักจะใช้เพื่อจัดลำดับใหม่อย่างชาญฉลาดสำหรับ vidualization เมทริกซ์ความคล้ายคลึงกันดังที่เห็นในคำตอบอื่น ๆ : มันวางรายการที่คล้ายกันมากขึ้นถัดจากแต่ละอื่น ๆ สิ่งนี้สามารถใช้เป็นเครื่องมือตรวจสอบความถูกต้องสำหรับผู้ใช้เช่นกัน!


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) มันถูกเรียกว่า "การจัดกลุ่มความสัมพันธ์" เพราะคาดว่าจะเป็นอินพุตเมทริกซ์ความสัมพันธ์แบบคู่ที่ชาญฉลาด ". การเรียนรู้ของเครื่อง. 56: 89)
ชัย

@ttnphns เกี่ยวกับ "จำนวนที่เหมาะสมที่สุดของกลุ่ม": คุณถูกต้องเกี่ยวกับความจริงที่ว่า "ดีที่สุด" นั้นไม่ชัดเจน "ดีที่สุด" ภายใต้มาตรการใด สำหรับการจัดกลุ่มแบบสหสัมพันธ์หากคุณยอมรับรูปแบบการกำเนิดที่เสนอในBagon & Galun "การจัดกลุ่มความสัมพันธ์ขนาดใหญ่"วิธีนี้จะส่งออกจำนวนที่เหมาะสมที่สุด
ชัย

ไช่ปรากฏว่าคุณเป็นหนึ่งในนักประดิษฐ์ของวิธีการ ฉันอยากจะแนะนำให้คุณให้คำตอบที่ไม่ได้เตรียมไว้ให้มากขึ้นถ้าคุณมีเวลาและความปรารถนา โดยเฉพาะใครอยากรู้ว่าวิธีการที่วางไว้ในบางคนที่จัดตั้งขึ้นเป็นอย่างดีเช่น k- หมายถึงหรือลำดับชั้น หมายเหตุยังสามารถเปลี่ยนความสัมพันธ์ได้อย่างง่ายดายเป็นระยะทางแบบยุคลิด (ด้วยวิธีการจัดกลุ่มแบบมาตรฐานที่ใช้งานได้ในภายหลัง) - เมื่อทราบข้อเท็จจริง / กลอุบายวิธีการของคุณแบบใดที่อนุญาตให้ใช้ เขียนเกี่ยวกับมัน (ขอบคุณล่วงหน้า!)
ttnphns

1
ฉันหวังว่ามันจะครอบคลุม ฉันแค่อยากจะบอกว่ามันเป็นความคิดที่ดีเสมอที่จะให้รายละเอียดเพิ่มเติมเล็กน้อยในคำตอบที่โพสต์บนเว็บไซต์นี้โดยเฉพาะอย่างยิ่งเมื่อวิธีการค่อนข้างใหม่และเมื่อมีใครรู้ว่าจะพูดอย่างไรในฐานะนักประดิษฐ์ :-) ไม่ไม่ใช่ "กว้างเกินไป"
ttnphns

-1

ฉันจะกรองที่ขีด จำกัด (นัยสำคัญทางสถิติ) ที่มีความหมายแล้วใช้การสลายตัวของ dulmage-mendelsohn เพื่อให้ได้ส่วนประกอบที่เชื่อมต่อ ก่อนที่คุณจะพยายามลบปัญหาบางอย่างเช่นสหสัมพันธ์สกรรมกริยา (มีความสัมพันธ์อย่างมากกับ B, B ถึง C, C ถึง D ดังนั้นจึงมีองค์ประกอบที่ประกอบด้วยทั้งหมดของพวกเขา แต่ในความเป็นจริง D ถึง A อยู่ในระดับต่ำ) คุณสามารถใช้อัลกอริทึมที่ใช้พื้นฐานระหว่างความบาง มันไม่ใช่ปัญหาที่เกิดขึ้นตามมาอย่างที่คนแนะนำเพราะเมทริกซ์สหสัมพันธ์นั้นสมมาตรดังนั้นจึงไม่มีสองสิ่ง


คำตอบนี้ไม่ได้อธิบายถึงวิธีการตั้งค่าขีด จำกัด ที่แนะนำซึ่ง IMO ดูเหมือนว่าจะไม่มีข้อ จำกัด นอกจากนี้เนื่องจากคำถามนี้มีอายุสองปีและคำตอบที่มี upvotes สองสามข้อได้รับการยอมรับแล้วคุณอาจต้องการอธิบายรายละเอียดเกี่ยวกับข้อมูลที่มีอยู่แล้ว
IWS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.