Clustern nach WARD: Effizientes Speichern der Clusterschritte

Ich habe einen Algorithmus zum Clustern nach WARD geschrieben. Bislang schreibe ich die Clusterschritte in Strings. Das ist nicht sehr effizient, besonders dann, wenn man viele IDs hat.

Bei jedem Clusterschritt liegen vor: id, lagid, idNew and minid


id  lagid  idNew  minid
1   .
2   1      1_2    .
3   2      2_3    1
4   3      3_4    .
5   4      4_5    .

Die idNew, die zu dem gerinsten Informationsverlust durch das Clustern führt, wird gewählt und mit minid=1 markiert. Dann erhält man

 
id   lagid  ....
1    .
2_3  1
4    2_3
5    4

und am Ende des Clusterns z.B.

 
id      lagid idNew
1       .     .
2_3_4_5 1     1_2_3_4_5

Wie kann ich die Information in id, lagid und idNew effizienter speichern als jeweils in einem String, der sehr lang werden kann?

Vielen Dank für Eure Hilfe.

SAS-User.

PROC CLUSTER METHOD=WARD

Zunächst einmal: Warum verwenden Sie denn nicht PROC CLUSTER mit METHOD=WARD?

PROC CLUSTER METHOD=WARD

Das ist eine berechtigte Frage. Ich will die SAS-Macro-Sprache besser beherrschen und wissen, was der Algorithmus tut. Und der WARD-Algorithmus sieht auf den ersten Blick nicht so schwierig aus.

Ich habe bloß das Problem, dass mein Macro bei großen Datensätzen sehr lange läuft. Bei 450 ids um die 6 Minuten, bei 3100 ids mehr als 2 Tage. Ich versuche deshalb mein Macro effizienter zu machen. Eine Schwachstelle ist der sehr lange String, in dem die ids stehen, geclustert ist mit einem Unterstrich markiert: z.B. 1 2_3 4 5 6 7_8....

Aus diesem Grund denke ich darüber nach, wie ich die Information über die Clusterzugehörigkeit besser als in einem einzelnen String speichern kann?
Anbieten würde sich:
- in Spalten?
- in Zeilen?
- in Arrays/ Matrizen? In temporären Arrays? In multidimensionalen Arrays?

Für einen Ratschlag wäre ich sehr dankbar.

Laufzeit

Ich glaube nicht, dass die Tatsache, dass die Cluster in einem String gespeichert werden, die Ursache für die lange Laufzeit ist. Ich würde eher darauf tippen, dass es sich hier um eine Kombination aus zwei Faktoren handelt: einer ineffizienten Makroprogrammierung, die viele Steps erzeugt (sorry, aber Sie schreiben ja selbst, dass Sie Makros besser kennen lernen wollen) und der Tatsache, dass der Ward-Algorithmus hinsichtlich Laufzeit von der harten Sorte ist, nämlich proportional zu N**2. Das liegt ja daran, dass man dabei jedes Objekt mit jedem vergleichen muss.

Vielleicht ist der Ward-Algorithmus nicht die geeignete Spielwiese für die Makroprogrammierung und Sie sollten doch auf die eigentlich dafür vorgesehene Prozedur CLUSTER zurückgreifen, siehe oben.