Skip to content

Commit 072fe30

Browse files
Jan WielemakerJan Wielemaker
Jan Wielemaker
authored and
Jan Wielemaker
committed
Avoid setarg. Faster :-)
1 parent b8bbfaa commit 072fe30

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed

kmeans.pl

+20-19
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,13 @@
3434
k_cluster(Map, Centroites, Objects, Clusters0),
3535
( Clusters0 == Old
3636
-> Clusters = Old
37-
; partition(==([]), Clusters0, Empty, NonEmpty),
38-
fill_empty(Empty, NonEmpty, Clusters1),
37+
; length(Centroites, Needed),
38+
length(Clusters0, CCount),
39+
( CCount < Needed
40+
-> Extra is Needed-CCount,
41+
fill_empty(Extra, Clusters0, Clusters1)
42+
; Clusters1 = Clusters0
43+
),
3944
Iteration2 is Iteration+1,
4045
( Iteration2 < MaxIter
4146
-> maplist(k_mean(Map), Clusters1, NewCentroites),
@@ -50,31 +55,27 @@
5055
% If we end up with empty clusters, take some random element
5156
% from the remaining clusters to fill them up.
5257

53-
fill_empty([], Clusters, Clusters).
54-
fill_empty([_|T], Clusters0, Clusters) :-
58+
fill_empty(0, Clusters, Clusters).
59+
fill_empty(N, Clusters0, Clusters) :-
5560
repeat,
5661
random_select(Cluster, Clusters0, Clusters1),
5762
Cluster = [_,_|_], !,
5863
random_select(Obj, Cluster, RestCluster),
59-
fill_empty(T, [[Obj],RestCluster|Clusters1], Clusters).
64+
succ(N2, N),
65+
fill_empty(N2, [[Obj],RestCluster|Clusters1], Clusters).
6066

67+
%% k_cluster(:Map, +Centroites, +Objects, -Clusters) is det.
6168

6269
k_cluster(Map, Centroites, Objects, Clusters) :-
6370
CTerm =.. [c|Centroites],
64-
functor(CTerm, _, Arity),
65-
length(Empty, Arity),
66-
maplist(=([]), Empty),
67-
ClusterTerm =.. [c|Empty],
68-
k_cluster_t(Objects, Map, CTerm, ClusterTerm),
69-
ClusterTerm =.. [_|Clusters].
70-
71-
k_cluster_t([], _, _, _).
72-
k_cluster_t([H|T], Map, Centroites, Clusters) :-
73-
center(Map, H, CH),
74-
closest_centroit(CH, Centroites, I),
75-
arg(I, Clusters, Cluster),
76-
setarg(I, Clusters, [H|Cluster]),
77-
k_cluster_t(T, Map, Centroites, Clusters).
71+
maplist(closest_centroit_pair(Map, CTerm), Objects, Pairs),
72+
keysort(Pairs, Sorted),
73+
group_pairs_by_key(Sorted, Grouped),
74+
pairs_values(Grouped, Clusters).
75+
76+
closest_centroit_pair(Map, CTerm, Object, Centroit-Object) :-
77+
center(Map, Object, Center),
78+
closest_centroit(Center, CTerm, Centroit).
7879

7980
closest_centroit(C0, Centroites, I) :-
8081
functor(Centroites, _, Arity),

0 commit comments

Comments
 (0)