গল্ফ কে-মানে অ্যালগরিদম


10

কে-ই মানে হ'ল একটি মানহীন নিরীক্ষণযোগ্য ক্লাস্টারিং অ্যালগরিদম, যা "পয়েন্ট" এবং কয়েকটি ক্লাস্টার কে দিয়ে থাকে, প্রতিটি "পয়েন্ট" কে কে ক্লাস্টারের একটিতে নির্ধারিত করে।

কে-মানে সিউডো-কোড

নোট করুন যে কে-মাধ্যমের অনেকগুলি রূপ রয়েছে। নীচে আমি যে অ্যালগরিদম বর্ণনা করছি তা আপনাকে প্রয়োগ করতে হবে। আপনার অ্যালগরিদমের কিছুটা ভিন্নতা থাকতে পারে বা বিল্ট-ইনগুলি ব্যবহার করা যেতে পারে আপনি যতক্ষণ না এই অ্যালগরিদমকে একই প্রাথমিক পয়েন্টগুলি দিয়েছিলেন তেমন ফল পাবেন।

এই চ্যালেঞ্জের মধ্যে, সমস্ত ইনপুটগুলি 2 ডি প্লেনে পয়েন্ট হবে (প্রতিটি পয়েন্টটি এর সমন্বয়কারী দ্বারা x এবং y তে প্রতিনিধিত্ব করা হবে)।

Inputs: K, the number of clusters
        P, the set of points

Choose K points of P uniformly at random
Each chosen point is the initial centroid of its cluster

Loop:
     For each point in P:
         Assign to the cluster whose centroid is the nearest (Euclidean distance)
         In case of a tie, any of the tied cluster can be chosen

     Recompute the centroid of each cluster:
         Its x coordinate is the average of all x's of the points in the cluster
         Its y coordinate is the average of all y's of the points in the cluster

Until the clusters don't change from one iteration to the next

Output: the set of clusters    

ইনপুট এবং আউটপুট

  • আপনি কে এবং পি মাধ্যমে নিতে পারেন STDIN, বা একটি ফাংশন যুক্তি হিসাবে, ইত্যাদি।
  • পি এবং পি এর পয়েন্টগুলি আপনার পছন্দ মতো ভাষাতে সেট / তালিকার জন্য প্রাকৃতিক যে কোনও কাঠামো ব্যবহার করে প্রতিনিধিত্ব করা যেতে পারে।
  • কে একটি কঠোর ইতিবাচক পূর্ণসংখ্যা।
  • আপনি ধরে নিতে পারেন ইনপুটগুলি বৈধ।
  • পি তে সর্বদা কমপক্ষে কে পয়েন্ট থাকবে
  • আপনি ক্লাস্টারগুলিকে আউটপুট করতে পারেন STDOUT, কোনও ফাংশন থেকে তাদের ফিরিয়ে দিতে পারেন etc.
  • গুচ্ছগুলির ক্রম এবং গুচ্ছগুলির ভিতরে ক্রমটি গুরুত্বহীন। - আপনি ক্লাস্টারগুলিকে উপস্থাপন করতে পয়েন্টের গ্রুপগুলি ফিরে আসতে পারেন, বা প্রতিটি পয়েন্ট ক্লাস্টারের জন্য সনাক্তকারী হিসাবে লেবেলযুক্ত (উদাহরণস্বরূপ একটি পূর্ণসংখ্যা)।

পরীক্ষার মামলা

যেহেতু ফলস্বরূপ ক্লাস্টাররা প্রাথমিকভাবে কোন পয়েন্টগুলি বেছে নেওয়া হয়েছিল তার উপর নির্ভর করে, আপনি সবাই একই ফলাফল (বা আপনি যখন প্রতিবার আপনার কোড চালাবেন একই ফলাফল) পেতে না পারেন।

সুতরাং, কেবল আউটপুটটিকে উদাহরণস্বরূপ আউটপুট হিসাবে গ্রহণ করুন।

Input:
  K = 1
  P = [[1,2.5]]
Output:
  [[[1,2.5]]]

Input:
  K = 3
  P = [[4,8], [15,16], [23,42], [-13.37,-12.1], [666,-666]]
Output:
  [[[666,-666]],[[-13.37,-12.1],[4,8]],[[15,16],[23,42]]]

Input:
  K = 2
  P = [[1,1], [1,1], [1,1]]
Output:
  [[[1,1]],[[1,1],[1,1]]]

স্কোরিং

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর ins


ফলাফলগুলি যখন আপনার অ্যালগরিদম থেকে পৃথক করা যায় তখন কি বিল্ট-ইনগুলি অনুমোদিত হয়?
মার্টিন ইন্ডার

@ মার্টিনবাটনার যদি আপনি একই প্রাথমিক পয়েন্টগুলি প্রমাণ করতে পারেন তবে এটি একই ফলাফলে রূপান্তরিত হয়, হ্যাঁ।

এটি কি প্রতিটি পয়েন্টের জন্য একটি ক্লাস্টারের সদস্যতার লেবেল আউটপুট গ্রহণযোগ্য? (যেমন প্রথম ক্লাস্টারের 1সমস্ত পয়েন্টের লেবেল থাকে , দ্বিতীয়টির সমস্ত পয়েন্টের লেবেল থাকে 2ইত্যাদি)
flawr

@ ফ্লোয়ার হ্যাঁ, এটি গ্রহণযোগ্য।

অবক্ষয়িত পরীক্ষা মামলা: K=2, P = [[1,1], [1,1], [1,1]]
পিটার টেলর

উত্তর:


4

মতলব, 25 বাইট

@(x,k)kmeans(x,k,'S','u')

একটি n x 2ম্যাট্রিক্স দেওয়া হয়েছে (প্রতি পয়েন্ট প্রতি এক সারি [[4,8]; [15,16]; [23,42]; [-13.37,-12.1]; [666,-666]]) এই ফাংশন প্রতিটি ইনপুট পয়েন্টের জন্য লেবেলের একটি তালিকা প্রদান করে।


5

সি ++, 479 474 বাইট

মতলব হিসাবে মাত্র 20 ডলার!

Golfed

#define V vector<P>
#define f float
struct P{f x,y,i=0;f d(P&p){return(p.x-x)*(p.x-x)+(p.y-y)*(p.y-y);}f n(P&p){return i?x/=i,y/=i,d(p):x=p.x,y=p.y,0;}f a(P&p){x+=p.x,y+=p.y,i++;}};P z;int l(P a,P b){return a.d(z)<b.d(z);}f m(f k,V&p){f s=p.size(),i,j=0,t=1;V c(k),n=c,d;for(random_shuffle(p.begin(),p.end());j<k;c[j].i=j++)c[j]=p[j];for(;t;c=n,n=V(k)){for(i=0;i<s;i++)d=c,z=p[i],sort(d.begin(),d.end(),l),j=d[0].i,p[i].i=j,n[j].a(p[i]);for(j=t=0;j<k;j++)t+=n[j].n(c[j]);}}

অ্যালগরিদমের ইনপুট / আউটপুট হ'ল এবং এর struct Pসাথে পয়েন্টের একটি সেট ; এবং আউটপুট একই সেট, আউটপুট ক্লাস্টারের সূচীটি নির্দেশ করার জন্য তাদের সেট সহ পয়েন্টটি শেষ হয়।xyi

iক্লাস্টারগুলি সনাক্ত করতেও অতিরিক্ত ব্যবহার করা হয়। মূল লুপে, প্রতিটি বিন্দুর নিকটতম সেন্ট্রয়েড পাওয়া যায় সেই বিন্দুটির নিকটবর্তী হয়ে বর্তমান সেন্ট্রয়েডগুলির একটি অনুলিপি বাছাই করে।

এটি সংশ্লিষ্ট সেন্ট্রয়েডের আগের অবস্থানটি রেখে ডিজেনরেটেড কেসগুলি (খালি ক্লাস্টারগুলি) পরিচালনা করে (এর সংজ্ঞা দেখুন P::n, যা দূরত্ব থেকে পূর্বের-সেন্ট্রয়েডও ফিরিয়ে দেয়)। এইগুলি ক্রপ হবে না এই ধারণা করে কয়েকটি অক্ষর সংরক্ষণ করা যেতে পারে।

মেজাজহীন

#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;

#define V vector<P>
#define f float
struct P{
    f x,y,i=0;
    f d(P&p){return(p.x-x)*(p.x-x)+(p.y-y)*(p.y-y);} // distance squared
    f n(P&p){return i?x/=i,y/=i,d(p):x=p.x,y=p.y,0;} // normalize-or-reset
    f a(P&p){x+=p.x,y+=p.y,i++;}                     // add coordinates
};
P z;int l(P a,P b){return a.d(z)<b.d(z);}            // closer-to-z comparator 
f m(f k,V&p){
    f s=p.size(),i,j=0,t=1;V c(k),n=c,d;
    for(random_shuffle(p.begin(),p.end());j<k;c[j].i=j++)
        c[j]=p[j];                                // initial random assignment
    for(;t;c=n,n=V(k)){                           
        for(i=0;i<s;i++)                          // assign to clusters
            d=c,z=p[i],sort(d.begin(),d.end(),l),
            j=d[0].i,p[i].i=j,n[j].a(p[i]);       // and add those coords
        for(j=t=0;j<k;j++)t+=n[j].n(c[j]);        // normalize & count changes
    }        
}

int main(int argc, char **argv) {
    srand((unsigned long)time(0));

    int k;
    V p;
    sscanf(argv[1], "%d", &k);
    printf("Input:\n");
    for (int i=2,j=0; i<argc; i+=2, j++) {
        P n;
        sscanf(argv[i], "%f", &(n.x));
        sscanf(argv[i+1], "%f", &(n.y));
        p.push_back(n);
        printf("%d : %f,%f\n", j, p[j].x, p[j].y);
    }

    m(k,p);
    printf("Clusters:\n");
    for (int q=0; q<k; q++) {
        printf("%d\n", q);
        for (unsigned int i=0; i<p.size(); i++) {
            if (p[i].i == q) printf("\t%f,%f (%d)\n", p[i].x, p[i].y, i);
        }
    }
    return 0;
}

আমি এই মন্তব্যটি দেরী হতে পারে জানি, কিন্তু আপনি একটি ম্যাক্রো সংজ্ঞায়িত করতে পারে #define R p){returnএবং দ্বিতীয় যুক্তি পরিবর্তন lকরতে pতাই আপনি এটি তিনবার ব্যবহার করতে পারে সমষ্টি?
জাচারা

4

জে, 60 54 বাইট

p=:[:(i.<./)"1([:+/&.:*:-)"1/
]p](p(+/%#)/.[)^:_(?#){]

একটি সহায়ক ক্রিয়া সংজ্ঞায়িত করে pযা পয়েন্টগুলি এবং সেন্ট্রয়েডগুলির একটি তালিকা নেয় এবং নিকটতম সেন্ট্রয়েডের সূচক দ্বারা প্রতিটি পয়েন্টকে শ্রেণিবদ্ধ করে। তারপরে, এটি ব্যবহার করে প্রতিটি ক্লাস্টারের পয়েন্টগুলির গড় পরিবর্তনের আগ পর্যন্ত নতুন সেন্ট্রয়েড চয়ন করার প্রক্রিয়াটির পুনরাবৃত্তি করতে এবং আউটপুটটির জন্য পয়েন্টগুলি বিভাজন করতে।

ব্যবহার

মান LHS উপর একটি পূর্ণসংখ্যা হিসাবে দেওয়া হয়। পয়েন্টগুলির তালিকাটি আরএইচএসে 2 ডি অ্যারে হিসাবে দেওয়া হয়। এখানে এটি পয়েন্টগুলির তালিকা হিসাবে নির্দিষ্ট করা হয়েছে যা 5 x 2 এর 2 ডি অ্যারে আকারে রূপান্তরিত হয় আউটপুটটি এমন লেবেল হবে যার জন্য প্রতিটি পয়েন্ট একইভাবে ইনপুট হিসাবে একই পংক্তিতে থাকবে us

আপনি যদি পুনরনয়নযোগ্য ফলাফলের জন্য একটি স্থির বীজ ব্যবহার করতে চান, তবে এট ?দিয়ে প্রতিস্থাপন করুন ।?.(?#)

   p =: [:(i.<./)"1([:+/&.:*:-)"1/
   f =: ]p](p(+/%#)/.[)^:_(?#){]
   3 f (5 2 $ 4 8 15 16 23 42 _13.37 _12.1 666 _666)
0 1 1 0 2

ব্যাখ্যা

[:(i.<./)"1([:+/&.:*:-)"1/  Input: points on LHS, centroids on RHS
           (          )"1/  Form a table between each point and centroid and for each
                     -        Find the difference elementwise
            [:     *:         Square each
              +/&.:           Reduce using addition
                              Apply the inverse of square (square root) to that sum
[:(     )"1                 For each row of that table
     <./                      Reduce using min
   i.                         Find the index of the minimum in that row
                            Returns a list of indices for each point that shows
                            which centroid it belongs to

]p](p(+/%#)/.[)^:_(?#){]  Input: k on LHS, points on RHS
                    #     Count the number of points
                   ?      Choose k values in the range [0, len(points))
                          without repetition
                       ]  Identity function, get points
                      {   Select the points at the indices above
  ]                       Identity function, get points
   (         )^:_         Repeat until convergence
    p                       Get the labels for each point
             [              Identity function, get points
           /.               Partition the points using the labels and for each
      +/                      Take the sums of points elementwise
         #                    Get the number of points
        %                     Divide sum elementwise by the count
                            Return the new values as the next centroids
]                         Identity function, get points
 p                        Get the labels for each point and return it

আমি +1 দিই, তবে আমি ভয় পেয়েছি যে আপনার 3 কে ভেঙে দেওয়া আমাকে অভিশাপ দেবে।
NoOneIs এখানে

3

সিজেএম (60 বাইট)

{:Pmr<1/2P,#{:z{_:+\,/}f%:C,{P{C\f{.-Yf#:+}_:e<#1$=},\;}%}*}

এটি এমন একটি ফাংশন যা k pস্ট্যাকের আকারে এটির ইনপুট নেয় । এটি ধরে নিয়েছে যে পয়েন্টগুলি ডাবলস দ্বারা উপস্থাপিত হয়, ইনট নয়। এটি পয়েন্টগুলির মাত্রা সম্পর্কে স্পষ্টত কিছু অনুমান করে না, সুতরাং এটি নির্দিষ্ট 2-ডি এর মতো 6-ডি ইউক্লিডিয়ান স্পেসে সমানভাবে গুছিয়ে উঠবে।

অনলাইন ডেমো


2

গণিত 14 12 বাইট

যেহেতু বিল্ট-ইনগুলি অনুমোদিত, তাই এটি করা উচিত।

FindClusters

উদাহরণ

FindClusters[{{4, 8}, {15, 16}, {23, 42}, {-13.37, -12.1}, {666, -666}}, 3]

{{{4, 8}, 13 -13.37, -12.1}}, {{15, 16}, {23, 42}}, {6 666, -666}}


আপনার বন্ধনী দরকার নেই। f = FindClusters, f[something]
NoOneIs এখানে

ঠিক আছে, ধন্যবাদ আমি নিশ্চিত ছিল না।
ডেভিডসি

1

জেলি , 24 বাইট

_ÆḊ¥þ³i"Ṃ€$
ẊḣµÇÆmƙ³µÐLÇ

এটি অনলাইন চেষ্টা করুন!

এই চ্যালেঞ্জ পোস্ট হওয়ার পরে প্রয়োগ করা বৈশিষ্ট্যগুলি ব্যবহার করে। মনে হয়, এটি আর প্রতিযোগিতামূলক নয়

ব্যাখ্যা

_ÆḊ¥þ³i"Ṃ€$  Helper link. Input: array of points
             (Classify) Given a size-k array of points, classifies
             each point in A to the closet point in the size-k array
    þ        Outer product with
     ³       All points, P
   ¥         Dyadic chain
_              Subtract
 ÆḊ            Norm
          $  Monadic chain
      i"     Find first index, vectorized
        Ṃ€   Minimum each

ẊḣµÇÆmƙ³µÐLÇ  Main link. Input: array of points P, integer k
  µ           Start new monadic chain
Ẋ               Shuffle P
 ḣ              Take the first k
        µ     Start new monadic chain
   Ç            Call helper (Classify)
      ƙ         Group with those values the items of
       ³        All points, P
    Æm            Take the mean of each group
         ÐL   Repeat that until the results converge
           Ç  Call helper (Classify)

1

আর , 273 বাইট

function(K,P,C=P[sample(nrow(P),K),]){while(T){D=C
U=sapply(1:nrow(P),function(i)w(dist(rbind(P[i,],C))[1:K]))
C=t(sapply(1:K,function(i)colMeans(P[U==i,,drop=F])))
T=isTRUE(all.equal(C,D))}
cbind(U,P)}
w=function(x,y=seq_along(x)[x==min(x)])"if"(length(y)>1,sample(y,1),y)

এটি অনলাইন চেষ্টা করুন!

লাগে Pসঙ্গে একটি ম্যাট্রিক্স হিসাবে, xএবং yযথাক্রমে প্রথম ও দ্বিতীয় কলামে স্থানাঙ্ক। Pক্লাস্টার ইনডেক্স (পূর্ণসংখ্যা) নির্দেশ করে এমন একটি প্রথম কলাম যুক্ত যুক্ত দিয়ে ফিরে আসে ।

সম্পর্কের ক্ষেত্রে ক্লাস্টারটি এলোমেলোভাবে বেছে নেওয়া প্রয়োজনের সাথে সামঞ্জস্য করতে wউত্সটি অনুলিপি করে আমাকে নতুন করে সংজ্ঞা nnet::which.is.maxদিতে হয়েছিল। তা না হলে আমি ব্যবহার করেন which.minথেকে base210 বাইট মোট জন্য। গল্ফ করার জন্য এখনও অবকাশ আছে তবে আমি আমার কোডের মধ্যে অন্যকে সম্ভাব্য সমস্যাগুলি স্পষ্ট করার সুযোগ দেওয়ার জন্য এটি খুব একটা হতাশ করতে চাইনি।


0

জুলিয়া 213 বাইট

function f(p,k)
A=0
P=size(p,1)
c=p[randperm(P)[1:k],:]
while(true)
d=[norm(c[i]-p[j]) for i in 1:k, j in 1:P]
a=mapslices(indmin,d,1)
a==A&&return a
A=a
c=[mean(p[vec(a.==i),:],1) for i in 1:k]
end
end

pপূর্ণ দৈর্ঘ্যের একটি অ্যারে প্রদান করে , পূর্ণসংখ্যার সাথে ইঙ্গিত দেয় যে কোনটি ক্লাস্টারের সাথে সম্পর্কিত উপাদান pরয়েছে।

আমি মনে করি চরিত্র গণনা নিখুঁত করতে আরও কিছুটা সুযোগ আছে।

(অবশ্যই আমি এটি তুচ্ছভাবে করতে ক্লাস্টারিং.জেএল প্যাকেজটি ব্যবহার করতে পারি)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.