2017-09-02 6 views
2

Ich arbeite an einem Empfehlungssystem. Es wäre eine Android-Anwendung, in die der Benutzer seine Präferenzen eingibt, und auf der Basis dieser Präferenzen würden diesem Benutzer andere passende Profile angezeigt. Ich erhalte Daten vom Benutzer und speichere sie im Firebase. Wie implementiert man das Strategy Design Pattern?

Dies sind die numerischen Werte und um die angepassten Profile zu diesem Benutzer zu zeigen, ich bin mit zwei Algorithmen für die Ähnlichkeitszählung zwischen den Benutzern Berechnung: Cosine similarity und Pearson correlation

Ich hole den Namen des Algorithmus von der Anwendung und dann Ausführen des Algorithmus, um dem Benutzer ähnliche Profile zu zeigen.

if (request.query.algo === "cosine") { 
    // compute cosine value 
} 
else if (request.query.algo === "pearson-correlation") { 
    // compute pearson correlation coefficents 

} 

Da es sich um eine Echtzeit-Anwendung wäre so dass diese Methode völlig falsch ist, möchte ich Strategy Design-Muster implementieren, wo der Algorithmus auf der Laufzeit entschieden werden und nicht auf der Kompilierung.

So, jetzt ist das Problem, in Strategie-Design-Muster, wie würde ich entscheiden, wann welchen Algorithmus verwenden?

Zum Beispiel, wenn Sie etwas mit einer Kreditkarte kaufen, spielt die Art der Kreditkarte keine Rolle. Alle Kreditkarten haben einen Magnetstreifen, auf dem Informationen kodiert sind. Die Streifen und das, was sie enthält, stellen die "Schnittstelle" dar, und die Art der Karte wäre die "Implementierung". Jede Kreditkarte kann durch eine andere ersetzt werden und alle sind völlig unabhängig voneinander.

Ähnlich, auf welchen Grundlagen sollte ich zwischen Cosine und Pearson zur Laufzeit mit Strategie Design-Muster wählen?

+0

Warum ist diese Methode falsch? Dies ist immer noch die Wahl der Strategie in der Laufzeit, denn es hängt von der Anfrage – ByeBye

Antwort

0

Von meinem Verständnis davon, Pearson würde schlechter in den Fällen durchführen, in denen zwei Benutzerprofile sehr unterschiedliche Menge von Elementen haben (in diesem Fall die Präferenzen).

Vielleicht könnten das Ihre Kriterien sein? In Fällen, in denen die Anzahl der übereinstimmenden Präferenzen über einem bestimmten Schwellenwert liegt, verwenden Sie Pearson und in anderen Fällen Cosinus.

Sie könnten Ihrem Benutzer vielleicht eine SCHLÜSSEL-Übereinstimmungsliste zeigen, die Cosinus verwendet, um Benutzern zu zeigen, deren Profile viel gemeinsam haben.

Dann könnten Sie eine zweite Liste anzeigen, die besagt, dass Sie vielleicht auch daran interessiert sind, die Pearson verwendet, um passende Profile anzuzeigen, die nicht viele gemeinsame Präferenzen haben.

+0

Vielen Dank für Ihre Antwort. Sie sagen, dass ich den Schwellenwert als Kriterium für die Umsetzung des Strategieentwurfs betrachten sollte. Zum Beispiel analysierte ich das Ergebnis, das ich von beiden erhalten hatte, dann fand ich heraus, dass für Pearson eine Schwelle von 0,2 ein perfektes Ergebnis ergibt und in Kosinus die Schwelle von 0,9 das perfekte Ergebnis ergibt. Wie könnte ich das SDP auf der Basis dieser Schwellenwerte implementieren? Können Sie diesen Punkt kurz beschreiben? –

+0

Ich würde einen besseren Blick auf Ihre Klassen benötigen, um Ihnen dabei helfen zu können. Aber nach dem Aussehen der Dinge könnte ein Fabrikdesign-Muster besser zu diesem Strategie-Muster passen. Sie rufen einfach die Fabrik an, geben Ihren Übereinstimmungsgrad zwischen dem Profil an und die Fabrik kann dann den entsprechenden Algorithmus zurückgeben, der verwendet werden muss. –

+0

Sie könnten vielleicht eine ProfileComparator-Schnittstelle behalten, die die Komparator-Strategie als Eingabe hat. Dann können Sie das in CosineProfileComparator und PearsonProfileComparator erweitern.Wenn Sie jetzt die Liste der nahen Übereinstimmungen zurückgeben, können Sie den ProfileComparator mit CosineComparator und die Liste der Profile mit unterschiedlichen Präferenzen mit dem PearsonComparator instanziieren. –

Verwandte Themen