Sortierung im SMS-Adressbuch

DaPhreak

Primus inter pares
ID: 30143
L
8 Mai 2006
2.417
295
Hallo auch,

Nicht ganz sicher ob es ein Bug ist, aber komisch ist es schon: Man kann das Adressbuch beim Versenden von SMS doch entweder alphabetisch oder nach Nutzungshäufigkeit sortieren lassen. Kann es sein, dass das mit der Nutzungshäufigkeit nicht mehr richtig geht?

Ich versende seit langer Zeit eigentlich immer nur an die gleiche Handy-Nummer und doch steht diese sehr weit unten in der Liste, zwischen anderen Nummern an die ich höchstens 1-2 mal was geschickt haben kann. Es kommt mir so vor, als würde da nicht mehr richtig mitgezählt.

Ich hab das jetzt eine ganze Zeit lang beobachtet, aber die Position in der Liste hat sich überhaupt nicht verändert, trotz einiger weiterer SMS.

Kann da mal wer nachschauen?
 
Das wird alle 4 Wochen (glaub) auf ne Art und Weise "resettet" (auf kleinere Zahlen runtergebrochen), sodass auch neue Nummern eine Chance gegen die langjährige Freundin mit 1000 SMS haben. Das führt bei seltenen SMS ggf. dazu, dass es so wirkt, als zähle es nicht korrekt.

Vorher:
Nummer A: 1000
Nummer B: 755
Nummer C: 12

Nach dem Runterbrechen:
Nummer A: 15
Nummer B: 10
Nummer C: 5

Der kleine 5er Puffer ist dazu da, dass die Reihenfolge erhalten bleibt und sich nicht sofort bei der 1. SMS wieder ändert. Würde auch verwirren. In Deinem Fall schickst Du aber innerhalb der Reset-Zeit weniger als 5 SMS an die Nummer, weshalb die augenscheinlich nicht aufsteigt.

Mögliche Lösung:
1) Puffer runtersetzen auf 2-3 + Optimierung
2) k.A.

Schau mal obs besser wird. ;)

"Nur alle SMS im Zeitraum von X Wochen berücksichtigen" ist nicht möglich, da diese Information nicht zwangsweise gespeichert ist. Ich habe nur "Name - Anzahl - letzte SMS" in der Adressbuch-DB.
 
Das wird alle 4 Wochen (glaub) auf ne Art und Weise "resettet" (auf kleinere Zahlen runtergebrochen), sodass auch neue Nummern eine Chance gegen die langjährige Freundin mit 1000 SMS haben.

Ah okay, das ist eine Erklärung.

Vorher:
Nummer A: 1000
Nummer B: 755
Nummer C: 12

Nach dem Runterbrechen:
Nummer A: 15
Nummer B: 10
Nummer C: 5

Was ist wenn es vorher 20,5,3,2,1,1,1,1,1 war, ist es danach 45,40,35,30,25,20,15,10,5? Also kann das den Abstand auch erhöhen?

Der kleine 5er Puffer ist dazu da, dass die Reihenfolge erhalten bleibt und sich nicht sofort bei der 1. SMS wieder ändert. Würde auch verwirren. In Deinem Fall schickst Du aber innerhalb der Reset-Zeit weniger als 5 SMS an die Nummer, weshalb die augenscheinlich nicht aufsteigt.

Grad mal nachgezählt: In den letzten 4 Wochen waren es 15, trotzdem hat sich die Nummer nicht einen Platz bewegt.

Gut klar, entscheidend ist der Stichtag. Ich werd's mal beobachten.
 
Was ist wenn es vorher 20,5,3,2,1,1,1,1,1 war, ist es danach 45,40,35,30,25,20,15,10,5? Also kann das den Abstand auch erhöhen?
Genau. Deshalb ist dieses System für SMS eher ungeeignet. :ugly: Es bezieht die Zeit nicht ein, wann man jemandem zuletzt eine SMS geschickt hat. Je nach Adressbuch-Größe bleibt der Erste so oder so uneinholbar.

Ich nutze die Technik auch für die "Top10 FAQ" oder das "Jump-Menü" oben ... da gleichen sich die Werte aufgrund der häufigen Aufruferei sehr schnell wieder aus und da funzt es entsprechend gut. Da ordne ich auch nur die Top10 neu und setz den Rest einfach auf 0. Im schlimmsten Fall muss ein neuer Eintrag dann bis zu 50 aufholen, also kein Problem (sind ja Seitenabrufe und da sind 50 schnell beisammen).

Ideen 4SMS?
Vllt. nach 4 Wochen den count einfach halbieren?
Ich steh grad bissl aufm Schlauch.
 
Ideen?
Vllt. nach 4 Wochen den count einfach halbieren?
Ich steh grad bissl aufm Schlauch.

Der Ingenieur in mir hätte jetzt sofort (exponentielle) gleitende Mittelung gesagt, da vergisst man automatisch die Vergangenheit allmählich. Hat nur den Nachteil, dass Du bei jeder neuen SMS die ganze bisherige Tabelle[*] mit einem alpha gewichten müsstest bevor der neuen Wert addiert wird. Das ist dann vielleicht doch ein wenig aufwändig.

[*] Wobei Tabelle = das gesamte Adressbuch eines Nutzers, nicht aller Nutzer

Alternativ so wie Du sagt, zu regelmäßigen Abständen die ganze Tabelle mit irgendeinem forgetting factor multiplizieren, das wäre ja letztlich auch eine grobe Approximation der gleitenden Mittelung. 0,5 (halbieren) find ich aber etwas viel vielleicht?

*edit* zumindest weiß ich jetzt warum im Jump-Menu nie das drin steht was ich wirklich häufig nutze :ugly:
 
Zuletzt bearbeitet:
Der Ingenieur in mir hätte jetzt sofort (exponentielle) gleitende Mittelung gesagt, da vergisst man automatisch die Vergangenheit allmählich. Hat nur den Nachteil, dass Du bei jeder neuen SMS die ganze bisherige Tabelle mit einem alpha gewichten müsstest bevor der neuen Wert addiert wird. Das ist dann vielleicht doch ein wenig aufwändig.
Das geht imho nur, wenn ich den Zeitpunkt jeder einzelnen SMS dauerhaft speichere, oder? Das tue ich ja nicht. Ich hab nur Name|Anzahl|letztesMal.

0,5 (halbieren) find ich aber etwas viel vielleicht?
Naja im schlimmsten Fall erhält man durch dauerhaftes (int) Halbieren ne 1 und die sekundäre Sortierung könnte ich ja nach "letztesMal" ordnen, dann wärs zumindest nicht falsch. Den Zeitpunkt muss man bissl mit Bedacht wählen. Wer auf diese Sortierung Wert legt, der wird ja schon ne handvoll SMS im Monat verschicken, sodass 0.5/4Wochen doch ein schöner Anfangswert wäre.

zumindest weiß ich jetzt warum im Jump-Menu nie das drin steht was ich wirklich häufig nutze :ugly:
Wie gesagt ist dort nur die Top10 sortiert. Also Deine letzten aufgerufenen Seiten haben nach dem 14-tägigen Umlegen dann die Werte: 50,45,40,35, .... hm dann muss man ja schon 51x auf klamm-Toon klicken, damit der hochrutscht. Evtl. doch bisschen viel? :ugly: Vllt. wäre ein 3er-Puffer und 4 Wochen besser? Oder ändert sich eine klamm-Nutzung schneller?

Edit:
Jump läuft jetzt mit 28 Tage-Reset und 3er Puffer auf Top10.
SMS läuft mit 28 Tage-Halbierung.

Edit2:
Hm ich hab ja den Zeitpunkt der letzten SMS und nutze ihn immer noch nicht. Man könnte Einträge, welche schon x Wochen keine SMS mehr bekommen haben wesentlich schneller "halbieren" ... z.B. den Vergess-Faktor einfach (linear) daran koppeln? Vllt. 6 Monate keine SMS = 0 und letzte Woche = 1?
 
Das geht imho nur, wenn ich den Zeitpunkt jeder einzelnen SMS dauerhaft speichere, oder? Das tue ich ja nicht. Ich hab nur Name|Anzahl|letztesMal.

Das ist genau der Vorteil der exponentiell gleitenden Mittelung, das brauchst Du eben nicht wissen.

Neues Gewicht = alpha^(tage-seit-letztem-wert)*Altes Gewicht + Neuer Wert,

wobei alpha ein bisschen kleiner an 1 ist. Kommt jeden Tag eine rein dann hat damit automatisch der Wert der x Tage her ist ein Gewicht von alpha[sup]x[/sup].

Bsp:
Tag 0: Gewicht = 10.
-> 1 SMS an Tag 1: Gewicht = 0.98*10 + 1 = 10.8.
-> 1 SMS an Tag 3: Gewicht = 0.98[sup]2[/sup]*10.8 + 1 = 11.37.
-> 1 SMS an Tag 4: Gewicht = 0.98*11.37 + 1 = 12.14.

Somit hat das Ursprungsgewicht von 10 schon mit 0.98[sup]4[/sup] abgenommen, die SMS an Tag 1 mit 0.98[sup]3[/sup], die SMS an Tag 3 hat noch 0.98, etc.

Man muss immer nur das Datum des letzten Updates wissen.

Das nützt aber so natürlich nur was wenn die Gewichte aller anderen Einträge in meinem persönlichen Adressbuch auch mit jedem Update mit alpha^(tage-seit-letztem-wert) multipliziert werden und den Aufwand willst Du sicher nicht betreiben.

Wie gesagt ist dort nur die Top10 sortiert. Also Deine letzten aufgerufenen Seiten haben nach dem 14-tägigen Umlegen dann die Werte: 50,45,40,35, .... hm dann muss man ja schon 51x auf klamm-Toon klicken, damit der hochrutscht. Evtl. doch bisschen viel? :ugly: Vllt. wäre ein 3er-Puffer und 4 Wochen besser? Oder ändert sich eine klamm-Nutzung schneller?

Ich würde bei dem Runterbrechen auf kleinere Zahlen jedenfalls nie den Abstand erhöhen. Wenn etwas vorher Gewicht 3,2,1 hat, sollte es danach nicht 15,10,5 haben. Auch nicht 6,4,2. Nur was vorher zu groß war sollte so kleiner werden.
 
Das ist genau der Vorteil der exponentiell gleitenden Mittelung, das brauchst Du eben nicht wissen.
Siehe mein Edit2 oben.
Ich möchte es allerdings nicht on-the-fly berechnen (beim Verschicken), sondern ich möchte aus den vorhandenen Werten eine Reihenfolge bilden.

name | anzahl | letze sms

Aktuelle Anzeige
E | 5000 | letztes Jahr
A | 1000 | heute
D | 122 | vor 2 Monaten
B | 33 | gestern
C | 2 | heute

Sinnvolle Anzeige
A | 1000 | heute
B | 33 | gestern
D | 122 | vor 2 Monaten (oder C)
C | 2 | heute (oder D)
E | 5000 | letztes Jahr

Ich würde bei dem Runterbrechen auf kleinere Zahlen jedenfalls nie den Abstand erhöhen. Wenn etwas vorher Gewicht 3,2,1 hat, sollte es danach nicht 15,10,5 haben. Auch nicht 6,4,2. Nur was vorher zu groß war sollte so kleiner werden.
Aber was machst Du mit 1000 vs. 3 ?
Einfach nur die 1000 auf 10 oder so setzen und die 3 lassen?

Ich will im Prinzip ja nur die Reihenfolge erhalten, und ich will, dass diese sich nicht sofort mit dem nächsten Vorkommen des Ereignisses ändert. Sonst würde das Jump-Menü direkt nach dem Reset sich bei jedem Aufruf verändern. Daher die Idee mit dem kleinen Puffer. Der machts nach Oben hin ggf. "hoch", was bei einer Top10-Begrenzung nicht so tragisch ist wie bei einem unendlich großen SMS-Adressbuch.
 
Siehe mein Edit2 oben.
Ich möchte es allerdings nicht on-the-fly berechnen (beim Verschicken), sondern ich möchte aus den vorhandenen Werten eine Reihenfolge bilden.

Naja ein UPDATE musst Du sowieso machen, da sich ja das Datum der letzten SMS geändert hat. Da könntest Du genauso den Gewichtungsfaktor aktualisieren.

Hab sogar schon einen Algorithmus im Kopf der das mit einem einzelnen Update schafft ohne das das ganze Adressbuch aktualisiert werde muss. :mrgreen: Der muss dann nur alle paar Wochen renormalisieren damit die Zahlenbereiche nicht überlaufen. :ugly:

Aber was machst Du mit 1000 vs. 3 ?
Einfach nur die 1000 auf 10 oder so setzen und die 3 lassen?

Joa. Ich würde von unten nach oben durchgehen, überall wo die Lücke > X ist sie auf X begrenzen. So wird für X = 3 aus [5000,1000,10,5,3,2,1,1,1] eben ein [14,11,8,5,3,2,1,1,1].

Ob das in der Praxis natürlich wirklich besser ist, keine Ahnung :ugly:
 
Hab sogar schon einen Algorithmus im Kopf der das mit einem einzelnen Update schafft
Nutze ich gerne, wenn Du ihn mir gibst. ;)
Ich update eh die Anzahl und den Timestamp, jap.

Würde mir auch besser gefallen als die Lückenlösung. Da gehen nämlich auch die Verhältnismäßigkeiten verloren. Aus 5000/1000/3 wird 9/6/3 ... dass der 5000 Kandidat WEIT vorne war, sieht man jetzt nicht mehr. Ist im Prinzip auch meine aktuelle Lösung: 5000,2000,1000 wird bei mir zu 9,6,3 ... hier auch (wenn man bei 0 anfängt Lücken zu suchen).
 
Nutze ich gerne, wenn Du ihn mir gibst. ;)
Ich update eh die Anzahl und den Timestamp, jap.

Nicht wirklich ausgegoren, aber mal so grob die Idee:

:arrow: Jeder Eintrag im Adressbuch bekommt einen Wichtungsfaktor W. Sortiert wird das Adressbuch dann immer nach W, absteigend.

:arrow: Es gibt einen Stichtag, sagen wir alle 4 Wochen, ist auch egal. Sei X die Anzahl der seit dem Stichtag vergangenen Tage.

:arrow: Für jede versendete SMS wird W aktualisiert mit W = W + alpha[sup]X[/sup], wobei alpha etwas größer als 1 ist (s.u.).

:arrow: Damit kann W natürlich für große X stark anwachsen, deshalb ist es nötig zum Stichtag das Adressbuch zu renormalisieren, also alle W[sub]i[/sub] beispielsweise durch das größte W zu teilen. Der maximale Abstand zweier Stichtage muss also so gewählt werden, dass alpha[sup]x[/sup] noch bequem in den vertretbaren Zahlenbereich passt.
*edit*
Ich würde diese Renormalisierung pro User machen, so dass jemand, der gar keine SMS versendet hat auch keine Veränderung mitbekommt. Für jeden User sollte das maximale W am Ende wieder 1 sein. Das macht das ganze natürlich aufwändiger, aber es ist auch nur selten nötig.
*/edit*

Das witzige ist nun, dass diese Wichtung äquivalent ist zu exponentiell gleitender Mittelung, es werden eben nicht alte Werte abgewertet sondern neue aufgewertet, was aber im relativen Vergleich das selbe ist.

Nun muss nur noch alpha sorgfältig gewählt werden. Dabei ist zu bedenken, dass eine SMS vor x Tagen um alpha[sup]-x[/sup] weniger stark gewichtet wird als eine SMS heute. Also beispielsweise für alpha = 1.1 hat eine SMS die 1 Woche her ist zu 50% vergessen, nach 4 Wochen zu 93%.

Will man dann nur einen Dynamikbereich bspw. 1000 haben, muss man halt nach log(1000)/log(alpha) = 72 Tagen renormalisieren.


Hmmm, einigermaßen verständlich?
 
Zuletzt bearbeitet:
es werden eben nicht alte Werte abgewertet sondern neue aufgewertet, was aber im relativen Vergleich das selbe ist.
Ahh, *klack*!

Jau thx, damit kann ich arbeiten.
Ich setze das dann so um (heute nicht mehr). ;)

Edit: Das SMS-Adressbuch hab ich aus Backups mal re-initialisiert.
Die Sortierung sollte jetzt passender sein.
 
Das "Pruning" hab ich zum Monatswechsel jeweils eingestellt.
Mal schaun was passiert. Wenn nix passiert isses gut. :ugly: