Angenommen, ich habe zwei Vektoren. Welche Algorithmen kann ich sie vergleichen benutzen?

StackOverflow https://stackoverflow.com/questions/1805987

  •  05-07-2019
  •  | 
  •  

Frage

Firma 1 hat diesen Vektor:

['books','video','photography','food','toothpaste','burgers'] ... ...

Company 2 hat diesen Vektors:

['video','processor','photography','LCD','power supply', 'books'] ... ...

Nehmen wir an diese eine Häufigkeitsverteilung ist (ich es könnte ein Tupel machen, aber zu viel geben).
Wie Sie sehen können ... haben diese Vektoren Dinge, die sich überlappen. „Video“ und „Fotografie“ scheinen „ähnlich“ zwischen zwei Vektoren aufgrund der Tatsache zu sein, dass sie in ähnlichen Positionen sind. Und ... „Bücher“ ist offensichtlich ein starker Punkt für Unternehmen 1. Bestellung und Positionierung ist von Bedeutung, da dies eine Häufigkeitsverteilung ist.

Welche Algorithmen könnten Sie mit diesem zu spielen, um verwenden? Was Algorithmen nutzen könnten Sie, dass wertvolle Daten für diese Unternehmen bieten könnte, die diese Vektoren verwendet?

Ich bin neu in Text-Mining und Informationsabruf. Könnte mir jemand führen zu diesen Themen in Bezug auf diese Frage?

War es hilfreich?

Lösung

Ist Position sehr wichtig ist, wie Sie betonen, dann wird die entscheidende Metrik zwischen den gleichen Positionen in den verschiedenen Vektoren (Sie können zum Beispiel Summe der absoluten Werte der Differenzen auf der Differenz der Positionen basieren, oder deren Quadrate). Das große Problem, das ist gelöst werden muss - wie viel ein Element zu wiegen, die vorhanden ist (sagen, es ist die N-ten ist) in einem Vektor, und in den anderen völlig abwesend. Ist das ein relativ kleines Problem - als ob das fehlende Element tatsächlich vorhanden direkt nach den tatsächlich diejenigen war, zum Beispiel - oder eine wirklich, wirklich große Sache? Das ist unmöglich, ohne mehr Verständnis für die tatsächlichen Anwendungsgebiet zu sagen. Sie können verschiedene Weise versuchen, sich mit diesem Thema zu befassen und sehen, welche Ergebnisse sie geben beispielsweise Fälle, die Sie interessieren!

Angenommen, „ein fehlendes Element in etwa das gleiche ist, wie wenn sie vorhanden waren, direkt nach den tatsächlichen Einsen“. Dann können Sie Vorprozess jeder Eingangsvektor in ein dict Mapping Element zu positionieren (entscheidende Optimierung, wenn Sie viele Paare von Eingangsvektoren vergleichen haben!):

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

und dann vergleichen, zwei solche dicts:

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

(oder abs (d) anstelle der Quadrierung in der letzten Anweisung). Um fehlende Gegenstände mehr wiegen (machen dicts, das heißt Vektoren, weiter weg betrachtet werden), können Sie zweimal die Länge statt nur die Längen, oder eine große Konstante verwenden könnten wie 100, in einem ansonsten ähnlich strukturierten Programm.

Andere Tipps

Ich würde vorschlagen, dass Sie ein Buch namens Collective Intelligence Programmierung.
Es ist ein sehr schönes Buch auf, wie Sie Informationen von einfachen Daten wie diese abrufen können. Es gibt Code-Beispiele enthalten (in Python:)

Edit: Nur um gbjbaanb Antwort: Das ist Python

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

Hier finden Sie aktuelle Hammingabstands

Wie MBG erwähnt, ist die Hamming-Distanz ein guter Anfang. Es ist im Grunde eine Bitmaske für jeden möglichen Punkt zuweisen, ob es im Unternehmen Wert enthalten ist.

Eg. Zahnpasta ist 1 für das Unternehmen A, aber 0 für Unternehmen B. Sie dann die Bits zählen, die zwischen den Unternehmen unterscheiden. Das Jaccard-Koeffizient wird im Zusammenhang mit dieser.

Hamming-Distanz wird tatsächlich nicht in der Lage seine Ähnlichkeit zwischen den Dingen zu erfassen wie „Video“ und „Fotografie“. Offensichtlich ist ein Unternehmen, das man verkauft die anderen auch mit einer höheren Wahrscheinlichkeit als ein Unternehmen, das Zahnpasta verkauft verkauft.

Dazu kann man Sachen wie LSI verwenden (auch für Dimensionsreduktion verwendet wird) oder Fakultäts Codes (zB neuronale Netz Sachen wie Restricted Boltzmann-Maschinen, Autoencoder oder Predictablity Minimierungs) kompaktere Darstellungen zu erhalten, die Sie dann vergleichen, kann die Verwendung von euklidischer Abstand.

Pick den Rang jeden Eintrag (höherer Rang ist besser) und die Summe der geometrischen Mittel zwischen den Spielen machen

für zwei Vektoren

sum(sqrt(vector_multiply(x,y)))  //multiply matches

Summe der Ränge für jeden Wert über Vektor sollte für jeden Vektor (preferrebly 1) gleich sein So können Sie vergleicht zwischen mehr als zwei Vektoren machen.

Wenn Sie ikkebr die metod anwenden können Sie feststellen, wie ein simmilar ist zu b

, daß Fall nur verwenden

sum( b( b.intersection(a) ))

Sie könnten der set_intersection Algorithmus. Die zwei Vektoren zunächst sortiert werden müssen (Verwendung sortiert Anruf), dann in 4 Iteratoren passieren und Sie werden eine Sammlung mit den gemeinsamen Elementen wieder in sie eingefügt. Es gibt ein paar andere, die in ähnlicher Weise arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top