একটি পারস্পরিক সম্পর্কের ক্লাস্টারিং ম্যাট্রিক্স


20

আমার একটি পারস্পরিক সম্পর্ক ম্যাট্রিক্স রয়েছে যা প্রতিটি আইটেমকে অন্য আইটেমের সাথে কীভাবে সংযুক্ত করে তা উল্লেখ করে। সুতরাং কোনও এন আইটেমের জন্য আমার কাছে ইতিমধ্যে একটি এন * এন পারস্পরিক সম্পর্ক ম্যাট্রিক্স রয়েছে। এই পারস্পরিক সম্পর্কের ম্যাট্রিক্সটি ব্যবহার করে আমি কীভাবে এম বিনগুলিতে এন আইটেমগুলি ক্লাস্টার করব যাতে আমি বলতে পারি যে কেথ বিনের এনকি আইটেমগুলি একই আচরণ করে। দয়া করে আমাকে সাহায্য করুন। সমস্ত আইটেম মান শ্রেণিবদ্ধ।

ধন্যবাদ। আপনার যদি আরও কোনও তথ্য প্রয়োজন হয় তবে আমাকে জানান। পাইথনে আমার একটি সমাধান দরকার তবে প্রয়োজনীয়তার দিকে আমাকে ঠেলে দেওয়ার কোনও সহায়তা বড় সাহায্য হবে big


এন সাধারণত কত বড়?
রডিন

1
আমার সমস্যাটির জন্য আমার একটি শ্রেণিবদ্ধ ক্লাস্টারিংয়ের দরকার নেই। কোন আইটেমগুলি একইভাবে আচরণ করে তা কেবল আপনাকে বলা দরকার।
অভিষেক

এন সাধারণত 250 - 300.
অভিষেক

3
এফওয়াইআই, এই সমস্যাটিকে দ্বি-ক্লাস্টারিং বলা হয়। এর একটি ডেমো সাইকিট
লেয়ার.আর.এস.সি.সি.এটি

উত্তর:


15

ব্লক মডেলিংয়ের কাজ মনে হচ্ছে। "ব্লক মডেলিং" এর জন্য গুগল এবং প্রথম কয়েকটি হিট সহায়ক।

বলুন আমাদের একটি কোভারিয়েন্স ম্যাট্রিক্স রয়েছে যেখানে এন = 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])

সামাজিক প্রযুক্তি ক্লাস্টারিংয়ের জন্য সেই কৌশলটি ব্যবহৃত হচ্ছে না? এখানে কি প্রাসঙ্গিক হবে? দূরত্বের ম্যাট্রিক্স হিসাবে সেই পারস্পরিক সম্পর্ক ম্যাট্রিক্সকে ব্যবহার করা কী বোঝায়?
অভিষেক

1) হ্যাঁ, 2) আমারও তাই মনে হয়, 3) হ্যাঁ (যেগুলি খুব সংযুক্তিযুক্ত মানগুলি নিকটে থাকে)
রডিন

ঠিক আছে. আমি প্রথম কয়েকটি লিঙ্কের মাধ্যমে দেখেছি। আমি কীভাবে এটি আমার সমস্যা সমাধানে সহায়তা করবে তা আমি এখনও জানি না।
অভিষেক

আমি আমার উত্তর সম্পাদনা করেছি। আমি আশা করি এটি আপনার কাজে লাগবে
রডিন

আমি এখন এটি পরীক্ষা করে দেখছি। এটি আমার সমস্যার সাথে খাপ খাইয়ে দিলে আমি আপনাকে জানাব। তোমাকে অনেক ধন্যবাদ.
অভিষেক

6

আপনি কি শ্রেণিবিন্যাসের ক্লাস্টারিংয়ের দিকে নজর রেখেছেন? এটি কেবলমাত্র দূরত্ব নয়, মিলগুলির সাথে কাজ করতে পারে। আপনি ডেনড্রোগ্রামটি এমন একটি উচ্চতায় কাটাতে পারেন যেখানে এটি কে ক্লাস্টারে বিভক্ত হয় তবে সাধারণত ডেনড্রোগ্রামটি দৃশ্যত পরিদর্শন করা এবং কাটার উচ্চতার বিষয়ে সিদ্ধান্ত নেওয়া আরও ভাল।

হায়ারারিকিকাল ক্লাস্টারিং প্রায়শই অন্যান্য উত্তরে যেমন দেখা যায় ম্যাট্রিক্স বিভাজনকরণের জন্য একটি চৌকস পুনঃক্রম তৈরি করতে ব্যবহৃত হয়: এটি একে অপরের পাশে আরও অনুরূপ এন্ট্রি রাখে। এটি ব্যবহারকারীর জন্যও বৈধতা সরঞ্জাম হিসাবে পরিবেশন করতে পারে!


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) এটিকে "পারস্পরিক সম্পর্ক ক্লাস্টারিং" বলা হয় কারণ এটি ইনপুট হিসাবে যুগল-ভিত্তিক পারস্পরিক সম্পর্ক ম্যাট্রিক্সের প্রত্যাশা করে (বনসাল, এন।; ব্লাম, এ।; চাওলা, এস। (2004) এর অর্ডিনাল কাজটি দেখুন। "সহবাস ক্লাস্টারিং) "। মেশিন লার্নিং। 56: 89)।
শাই

"ক্লাস্টারগুলির সর্বোত্তম সংখ্যা" সম্পর্কিত @ এনটিএনফ্যানস: আপনি কী সঠিকভাবে "অনুকূল" দ্ব্যর্থক, "সর্বোত্তম" কোন মাপের অধীনে এই বিষয়ে সত্য? পারস্পরিক সম্পর্ক ক্লাস্টারিংয়ের ক্ষেত্রে, আপনি যদি বাগন অ্যান্ড গালুন "লার্জ স্কেল কোরিলেশন ক্লাস্টারিং" এর প্রস্তাবিত জেনারেটাল মডেলটি গ্রহণ করেন , তবে পদ্ধতিটি সর্বোত্তম সংখ্যাকে আউটপুট করে।
শাই

শাই, দেখা যাচ্ছে আপনি এই পদ্ধতির অন্যতম উদ্ভাবক। আমি আপনাকে উত্সাহিত করব এটি উপস্থাপন করার জন্য আরও একটি আবদ্ধ উত্তর দিতে - আপনার যদি সময় এবং ইচ্ছা থাকে তবে। বিশেষত, কেউ জানতে চান যে পদ্ধতিটি কীভাবে কিছু প্রতিষ্ঠিত ব্যক্তিদের মধ্যে স্থাপন করা হয়েছে যেমন কে-মানে বা শ্রেণিবদ্ধ। দ্রষ্টব্য এছাড়াও পারস্পরিক সম্পর্ক সহজেই ইউক্লিডিয়ান দূরত্বে রূপান্তরিত হয় (কোনও মানক ক্লাস্টারিং পদ্ধতি পরবর্তীকালের সাথে প্রযোজ্য) - এই সত্য / কৌশলটি জেনে আপনার কোন পদ্ধতিটি সেই "কৌশল" মঞ্জুরি দেয় না? এটি সম্পর্কে লিখুন। (আগাম ধন্যবাদ!)
ttnphns

1
আমি এটি আবরণ আশা করি। আমি কেবল এটিই বলতে চেয়েছিলাম যে এই সাইটে পোস্ট করা উত্তরে কিছুটা আরও বিশদ দেওয়া সর্বদা একটি ভাল ধারণা, বিশেষত যখন কোনও পদ্ধতি বরং নতুন এবং যখন আবিষ্কারক হওয়ার কারণে কী বলতে হবে জানেন। :-) না, "খুব বিস্তৃত" নয়।
ttnphns

-1

আমি কিছু অর্থবহ (পরিসংখ্যানগত তাত্পর্য) প্রান্তে ফিল্টার করব এবং তারপরে সংযুক্ত উপাদানগুলি পেতে dulmage-mendelsohn পচন ব্যবহার করব। ইতিমধ্যে আপনি ট্রানজিটিভ পারস্পরিক সম্পর্কগুলির মতো কিছু সমস্যা মুছে ফেলার চেষ্টা করার আগে (একটি উচ্চ বি, বি থেকে সি, সি থেকে ডি এর সাথে সংযুক্ত, সুতরাং তাদের মধ্যে একটি উপাদান রয়েছে তবে বাস্তবে ডি থেকে এ কম)। আপনি কিছু মধ্যবর্তীতা ভিত্তিক অ্যালগরিদম ব্যবহার করতে পারেন। কারও পরামর্শ অনুসারে এটি দ্বিখণ্ডিত সমস্যা নয়, কারণ পারস্পরিক সম্পর্ক ম্যাট্রিক্স প্রতিসম হয় এবং তাই এখানে দ্বি-বিষয় নেই।


এই উত্তরটি প্রস্তাবিত থ্রেশহোল্ডগুলি কীভাবে সেট করতে হবে তা পুরোপুরি ব্যাখ্যা করে না, যা আইএমও স্বেচ্ছাসেবক বলে মনে হয়। অতিরিক্ত হিসাবে, এই প্রশ্নটি দুটি বছরের পুরনো, এবং বেশ কয়েকটি উপভোগের উত্তর ইতিমধ্যে গ্রহণ করা হয়েছে, আপনি ইতিমধ্যে বিদ্যমান তথ্যের বিবরণ দিতে চাইতে পারেন।
IWS
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.