ক্লাস্টারিং পদ্ধতি যেখানে প্রতিটি ক্লাস্টারের সমান সংখ্যক পয়েন্ট থাকে?


25

আমি কিছু পয়েন্ট আছে মধ্যে , আর আমি যাতে পয়েন্ট ক্লাস্টারের করতে চাই:X={x1,...,xn}Rp

  1. প্রতিটি ক্লাস্টারে এর সমান সংখ্যক উপাদান থাকে । (অনুমান ক্লাস্টার ভাগ সংখ্যা ।)Xn

  2. প্রতিটি ক্লাস্টার মেনসের ক্লাস্টারগুলির মতো কিছুটা অর্থে "স্থানিকভাবে সমন্বিত" হয় ।k

এগুলির মধ্যে একটি বা অন্যটিকে সন্তুষ্ট করে এমন অনেকগুলি ক্লাস্টারিং পদ্ধতি সম্পর্কে ভাবতে সহজ, তবে উভয়কে একবারে পাওয়ার কোনও উপায় কি কেউ জানেন?


2
গুচ্ছ আকার এছাড়াও নির্দিষ্ট করা হয়? তারপরে, যেমনটি বলা হয়েছে, সমস্যাটি আমার কাছে অলসযোগ্য বলে মনে হচ্ছে। সাথে নিম্নলিখিত ক্ষেত্রে বিবেচনা : । যদি আপনি 2 টি ক্লাস্টার চান তবে আপনি বিভিন্ন আকারের পাবেন বা "স্থানিকভাবে একত্রিত" নন। অথবা আপনি কী চান, "যথাসম্ভব স্থানিকভাবে সমন্বিত" - সর্বাধিক অন্তঃক্লাস্টার দূরত্বকে হ্রাস করে বা তাই? অন্য সমাধানটি হ'ল কোনও বিভাজককে ক্লাস্টার আকার হিসাবে অনুমতি দেবে - তবে তারপরে সর্বদা আকারের ক্লাস্টারের তুচ্ছ সমাধান থাকে । এক্স = { - 1 , 0.99 , 1 , 1.01 } n n 1n=4,p=1X={1,0.99,1,1.01}nn1
এরিক পি।

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

কোয়ান্টাইলগুলি দ্বারা ডেটা বিভক্ত করা কি যথেষ্ট হবে? মানগুলি একে অপরের সাথে সম্পর্কিত না হলে তারা কীভাবে 'স্থানগতভাবে একত্রিত' হতে পারে তা আমি দেখতে ব্যর্থ।
সেলেনিয়াস

4
সীমাবদ্ধ ক্লাস্টারিং সম্পর্কে সাম্প্রতিক কিছু গবেষণা হয়েছে। গুগল google.com/search?q=constrained+k-means
whuber

শুধু একটি পরীক্ষিত ধারণা। ক্লাস্টারিংয়ে, একটি তথাকথিত সিলুয়েট পরিসংখ্যান প্রায়শই ব্যবহৃত হয়। এটা আপনি কত ভাল দেখায় একটি বস্তু ক্লাস্টার এবং কি সেরা অন্যান্য, প্রতিবেশী ক্লাস্টারের প্রকৃত। সুতরাং মধ্যে নাম নথিভুক্ত করা যেতে পারে, আপনি কে-মানে বা বিভিন্ন ক্লাস্টারের সঙ্গে অন্যান্য শ্রেণীবিভাগ দিয়ে শুরু করতে পারে এন এর। তারপরে আপনি সমান এন না পাওয়া পর্যন্ত অবজেক্টগুলিকে খুব ভাল শ্রেণিবদ্ধ (পরিসংখ্যান অনুসারে) তাদের সেরা প্রতিবেশী ক্লাস্টারে কম এন এর সাথে সরিয়ে দিন । আমি পুনরাবৃত্তির প্রত্যাশা করি: কিছু বস্তু সরিয়ে নেওয়া, পরিসংখ্যানগুলি পুনরায় গণনা করা, কিছু বস্তু স্থানান্তর করা ইত্যাদি That এটি বাণিজ্য-প্রক্রিয়া প্রক্রিয়া হবে।
ttnphns

উত্তর:


6

আমি একটি দ্বি-পদক্ষেপ পদ্ধতির পরামর্শ দিই:

  1. ক্লাস্টার সেন্টারগুলির একটি ভাল প্রাথমিক অনুমান পান, উদাহরণস্বরূপ কঠোর বা अस्पष्ट কে-মাধ্যম ব্যবহার করে।

  2. ক্লাস্টার সেন্টারগুলির সাথে পয়েন্টগুলি সংযুক্ত করতে গ্লোবাল নিকটতম নিকটবর্তী অ্যাসাইনমেন্ট ব্যবহার করুন: প্রতিটি পয়েন্ট এবং প্রতিটি ক্লাস্টার সেন্টারের মধ্যে একটি দূরত্বের ম্যাট্রিক্স গণনা করুন (আপনি কেবল যুক্তিসঙ্গত দূরত্ব গণনা করে সমস্যাটিকে কিছুটা ছোট করে তুলতে পারেন), প্রতিটি ক্লাস্টার সেন্টারকে এক্স বারে প্রতিলিপি করুন এবং লিনিয়ারটি সমাধান করুন নিয়োগ সমস্যা । আপনি পাবেন প্রতিটি ক্লাস্টার সেন্টারের জন্য, এক্স পয়েন্টের সাথে হুবহু মিলে যায়, যাতে বিশ্বব্যাপী ডেটা পয়েন্ট এবং ক্লাস্টার সেন্টারগুলির মধ্যে দূরত্ব হ্রাস পায়।

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


4

এই কে-মানে পরিবর্তনের চেষ্টা করুন:

সূচনা :

  • kএলোমেলোভাবে ডেটাসেট থেকে কেন্দ্রগুলি চয়ন করুন, বা আরও ভাল kmeans ++ কৌশল ব্যবহার করে
  • প্রতিটি পয়েন্টের জন্য, এর নিকটতম ক্লাস্টার সেন্টারের দূরত্বটি গণনা করুন এবং এটির জন্য একটি গাদা তৈরি করুন
  • গাদা থেকে পয়েন্টগুলি আঁকুন এবং ক্লাস্টারটি ইতিমধ্যে ওভারফুল না হলে এগুলি নিকটতম ক্লাস্টারে নিয়োগ করুন। যদি তা হয় তবে পরবর্তী নিকটতম গুচ্ছ কেন্দ্রটি গণনা করুন এবং গাদাতে পুনরায় প্রবেশ করুন

শেষ অবধি, আপনার একটি পার্টিশন করা উচিত যা ক্লাস্টার প্রতি + -1 একই সংখ্যক অবজেক্টের আপনার প্রয়োজনীয়তা পূরণ করে (শেষ কয়েকটি ক্লাস্টারেরও সঠিক সংখ্যা রয়েছে তা নিশ্চিত করুন। প্রথম mক্লাস্টারে ceilঅবজেক্ট থাকা উচিত , বাকী অবিকল floorঅবজেক্ট))

আইট্রেশন পদক্ষেপ :

প্রয়োজনীয়তা: "অদলবদ প্রস্তাব" (প্রতিটি বস্তু যা আলাদা ক্লাস্টারে থাকতে পছন্দ করে) সহ প্রতিটি ক্লাস্টারের জন্য একটি তালিকা।

পদক্ষেপ: নিয়মিত কে-মাধ্যমের মতো আপডেট হওয়া ক্লাস্টার সেন্টারগুলি গণনা করুন

এম পদক্ষেপ: সমস্ত পয়েন্টের মাধ্যমে আইট্রেট করা (কেবলমাত্র একটি, বা সমস্ত একটি ব্যাচে)

বর্তমান ক্লাস্টারের তুলনায় নিকটবর্তী ক্লাস্টার কেন্দ্রকে আপত্তি / সমস্ত ক্লাস্টার কেন্দ্রগুলি গণনা করুন। এটি যদি আলাদা ক্লাস্টার হয়:

  • অন্য ক্লাস্টারটি যদি বর্তমান ক্লাস্টারের চেয়ে ছোট হয় তবে এটি কেবল নতুন ক্লাস্টারে নিয়ে যান
  • যদি অন্য ক্লাস্টার থেকে অদলবদল প্রস্তাব (বা নিম্নতম দূরত্ব সহ যে কোনও ক্লাস্টার) থাকে তবে দুটি উপাদান ক্লাস্টারের কার্যভার অদলবদল করুন (যদি একাধিক অফার থাকে তবে সবচেয়ে বড় উন্নতি সহ একটি নির্বাচন করুন)
  • অন্যথায়, অন্য ক্লাস্টারের জন্য একটি অদলবদল নির্দেশ করুন

ক্লাস্টারের আকারগুলি অবিচ্ছিন্ন থাকে (+ - সিল / মেঝে পার্থক্য), কোনও বস্তু কেবলমাত্র একটি ক্লাস্টার থেকে অন্য ক্লাস্টারে সরানো হয় যতক্ষণ না এটি অনুমানের উন্নতি করে। সুতরাং এটি কে-মাধ্যমের মতো এক পর্যায়ে একত্রিত হওয়া উচিত। যদিও এটি কিছুটা ধীর হতে পারে (অর্থাত্ আরও পুনরাবৃত্তি)।

এটি আগে প্রকাশিত হয়েছে বা বাস্তবায়ন হয়েছে কিনা তা আমি জানি না। এটিই আমি যা চেষ্টা করব (যদি আমি কে-মানে চেষ্টা করতাম তবে আরও ভাল ক্লাস্টারিং অ্যালগরিদম রয়েছে))

ইএলকেআইতে কে- ইনের প্রয়োগের সাথে শুরু করার জন্য একটি ভাল জায়গা হতে পারে , যা ইতিমধ্যে তিনটি পৃথক সূচনা (কে-মানে ++ সহ) সমর্থন করে বলে মনে হয়, এবং লেখকরা বলেছেন যে তারা বিভিন্নগুলি সাধারণভাবে কভার করার জন্য বিভিন্ন পুনরাবৃত্তি কৌশলও রাখতে চায় একটি মডুলার ফ্যাশনে রূপগুলি (যেমন লয়েড, ম্যাককুইন, ...)।


2
ELKI তে টিউটোরিয়াল হিসাবে এবং টিউটোরিয়াল "এক্সটেনশন" মডিউলটিতে: অনুরূপ দৃষ্টিভঙ্গি অন্তর্ভুক্ত করা হয়েছে : elki.dbs.ifi.lmu.de/wiki/Tutorial/SameSizeKMeans
এরিচ

3

এটি একটি অপ্টিমাইজেশান সমস্যা। আমাদের কাছে একটি ওপেন সোর্স জাভা লাইব্রেরি রয়েছে যা এই সমস্যাটি সমাধান করে (ক্লাস্টারিং যেখানে ক্লাস্টারে প্রতি পরিমাণ সেট সেট রেঞ্জের মধ্যে হওয়া উচিত)। আপনার সর্বমোট কয়েক হাজার পয়েন্টের জন্য পয়েন্টের সংখ্যা প্রয়োজন - যদিও 5000 বা সম্ভবত 10000 এর বেশি নয়।

পাঠাগারটি এখানে:

https://github.com/PGWelch/territorium/tree/master/territorium.core

লাইব্রেরি নিজেই ভৌগলিক / জিআইএস টাইপ সমস্যার জন্য সেটআপ - যাতে আপনি এক্স এবং ওয়াইস, অক্ষাংশ এবং দ্রাঘিমাংশ, গ্রাহক, দূরত্ব এবং সময় ইত্যাদির উল্লেখ দেখতে পাবেন তবে আপনি কেবল 'ভৌগলিক' উপাদানগুলিকে উপেক্ষা করতে পারেন এবং এটি বিশুদ্ধ হিসাবে ব্যবহার করতে পারেন clusterer।

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

আপনি এই ইন্টারফেসটি ব্যবহার করে পয়েন্টগুলির মধ্যে সলভারকে একটি মেট্রিক ফাংশন (অর্থাত্ দূরত্ব ফাংশন) দেন:

https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/TravelMatrix.java

মেট্রিক আসলে একটি দূরত্ব এবং 'সময়' উভয়ই ফিরিয়ে আনার জন্য কাঠামোযুক্ত, কারণ এটি ভ্রমণ-ভিত্তিক ভৌগলিক সমস্যার জন্য তৈরি করা হয়েছে, তবে স্বেচ্ছাসেবী ক্লাস্টারিং সমস্যার জন্য 'সময়' শূন্য এবং আপনার প্রকৃত মেট্রিকের মধ্যে দূরত্ব নির্ধারণ করা হয়েছে পয়েন্ট।

আপনি এই শ্রেণীর মধ্যে আপনার সমস্যা সেট আপ করতে চাই:

https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Problem.java

আপনার পয়েন্টগুলি 'গ্রাহক' হবে এবং তাদের পরিমাণ 1 হবে the গ্রাহক শ্রেণিতে নিশ্চিত করুন যে আপনি কস্টপিরউনিটটাইম = 0 এবং কস্টপিরউনিট ডিসটেনশন = 1 নির্ধারণ করেছেন যে আপনি ট্র্যাভেলম্যাট্রিক্স দ্বারা ফেরত 'দূরত্ব' ক্ষেত্রে আপনার মেট্রিক দূরত্ব ফিরিয়ে দিচ্ছেন।

https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Customer.java

সলভার চালানোর উদাহরণের জন্য এখানে দেখুন:

https://github.com/PGWelch/territorium/blob/master/territorium.core/src/test/java/com/opendoorlogistics/territorium/TestSolver.java


2

আমি নিয়মিত তথ্য সর্বাধিকীকরণ (এবং এর উল্লেখগুলি) দ্বারা সাম্প্রতিক কাগজ বৈষম্যমূলক ক্লাস্টারিংয়ের পরামর্শ দিচ্ছি । বিশেষত, বিভাগ 2 ক্লাস ভারসাম্য এবং ক্লাস্টার অনুমান সম্পর্কে কথা বলে।


2

খুব বড় ডেটাসেটের জন্য সম্প্রতি আমার নিজের এটি দরকার ছিল myself আমার উত্তর, যদিও এটি তুলনামূলকভাবে দীর্ঘ চলমান সময় রয়েছে, এটি একটি স্থানীয় সর্বোত্তমকে রূপান্তরিত করার নিশ্চয়তাযুক্ত।

def eqsc(X, K=None, G=None):
    "equal-size clustering based on data exchanges between pairs of clusters"
    from scipy.spatial.distance import pdist, squareform
    from matplotlib import pyplot as plt
    from matplotlib import animation as ani    
    from matplotlib.patches import Polygon   
    from matplotlib.collections import PatchCollection
    def error(K, m, D):
        """return average distances between data in one cluster, averaged over all clusters"""
        E = 0
        for k in range(K):
            i = numpy.where(m == k)[0] # indeces of datapoints belonging to class k
            E += numpy.mean(D[numpy.meshgrid(i,i)])
        return E / K
    numpy.random.seed(0) # repeatability
    N, n = X.shape
    if G is None and K is not None:
        G = N // K # group size
    elif K is None and G is not None:
        K = N // G # number of clusters
    else:
        raise Exception('must specify either K or G')
    D = squareform(pdist(X)) # distance matrix
    m = numpy.random.permutation(N) % K # initial membership
    E = error(K, m, D)
    # visualization
    #FFMpegWriter = ani.writers['ffmpeg']
    #writer = FFMpegWriter(fps=15)
    #fig = plt.figure()
    #with writer.saving(fig, "ec.mp4", 100):
    t = 1
    while True:
        E_p = E
        for a in range(N): # systematically
            for b in range(a):
                m[a], m[b] = m[b], m[a] # exchange membership
                E_t = error(K, m, D)
                if E_t < E:
                    E = E_t
                    print("{}: {}<->{} E={}".format(t, a, b, E))
                    #plt.clf()
                    #for i in range(N):
                        #plt.text(X[i,0], X[i,1], m[i])
                    #writer.grab_frame()
                else:
                    m[a], m[b] = m[b], m[a] # put them back
        if E_p == E:
            break
        t += 1           
    fig, ax = plt.subplots()
    patches = []
    for k in range(K):
        i = numpy.where(m == k)[0] # indeces of datapoints belonging to class k
        x = X[i]        
        patches.append(Polygon(x[:,:2], True)) # how to draw this clock-wise?
        u = numpy.mean(x, 0)
        plt.text(u[0], u[1], k)
    p = PatchCollection(patches, alpha=0.5)        
    ax.add_collection(p)
    plt.show()

if __name__ == "__main__":
    N, n = 100, 2    
    X = numpy.random.rand(N, n)
    eqsc(X, G=3)

1
এই অবদানের জন্য ধন্যবাদ, @ ব্যবহারকারী 2341406। এই সমাধানটি কী, কীভাবে এটি কাজ করে, এবং কেন এটি সমাধান হয় তা ব্যাখ্যা করে এমন কোনও বিবরণ যুক্ত করতে আপনি কি আপত্তি করবেন?
গুং - মনিকা পুনরায়

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