K-araçları , bir dizi "nokta" ve bir dizi K kümesi verildiğinde, her bir "noktayı" K kümelerinden birine atayacak olan standart bir denetimsiz kümeleme algoritmasıdır.
K-anlamlarının Sahte Kodu
K-araçlarının birçok varyantı olduğunu unutmayın. Aşağıda açıkladığım algoritmayı uygulamalısınız. Algoritmada bazı farklılıklar olabilir veya aynı başlangıç noktaları verildiğinde bu algoritma ile aynı sonucu alacağınız sürece yerleşik kullanabilirsiniz.
Bu zorlukta, tüm girdiler 2B düzlemdeki noktalar olacaktır (her nokta x ve y'deki koordinatları ile temsil edilir).
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
Girdiler ve çıktılar
- K ve P'yi
STDIN
veya bir işlev argümanı vb. - P ve P'deki noktalar, seçtiğiniz dildeki set / listeler için doğal olan herhangi bir yapı kullanılarak temsil edilebilir.
- K kesinlikle pozitif bir tamsayıdır.
- Girişlerin geçerli olduğunu varsayabilirsiniz.
- P'de her zaman en az K puanı olacaktır.
- Kümeleri çıktı alabilir,
STDOUT
bir işlevden döndürebilir vb. - Kümelerin sıralaması ve kümelerin içindeki sıralamalar önemsizdir. -Kümeleri temsil etmek için nokta gruplarını veya küme için tanımlayıcı ile etiketlenmiş her noktayı (örneğin bir tamsayı) döndürebilirsiniz.
Test senaryoları
Ortaya çıkan kümeler başlangıçta hangi noktaların seçildiğine bağlı olduğundan, aynı sonuçları (veya kodunuzu her çalıştırdığınızda aynı sonucu) alamayabilirsiniz.
Bu nedenle, çıktıyı yalnızca örnek çıktı olarak alın.
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]]]
puanlama
Bu kod golf , bu yüzden bayttaki en kısa cevap kazanır.
1
tüm noktalarının etiketi , ikincisinin tüm noktalarının etiketi 2
vb.
K=2, P = [[1,1], [1,1], [1,1]]
.