Schätzung der Ähnlichkeit von zwei oder mehr Sets¶
Snowflake verwendet MinHash zum Schätzen der ungefähren Ähnlichkeit von zwei oder mehr Datasets. Das MinHash-Schema vergleicht Mengen, ohne die Schnittmenge oder Vereinigung der Mengen zu berechnen, was eine effiziente und effektive Schätzung ermöglicht.
Unter diesem Thema:
Übersicht¶
Typischerweise wird der Jaccard-Ähnlichkeitskoeffizient (oder Index) verwendet, um die Ähnlichkeit zwischen zwei Sets zu vergleichen. Für zwei Sätze, A
und B
, ist der Jaccardindex definiert als das Verhältnis der Größe ihrer Schnittmenge (Intersection) und der Größe ihrer Vereinigung (Union):
J(A,B) = (A ∩ B) / (A ∪ B)
Diese Berechnung kann jedoch erhebliche Ressourcen und Zeit in Anspruch nehmen und ist daher nicht ideal für große Datasets.
Im Gegensatz dazu ist das Ziel des MinHash-Schemas, J(A,B)
schnell zu schätzen, ohne den Schnittpunkt oder die Vereinigung zu berechnen.
SQL-Funktionen¶
Die folgenden Aggregationsfunktionen sind für die Schätzung der ungefähren Ähnlichkeit mit MinHash vorgesehen:
MINHASH: Gibt einen MinHash-Status zurück, der ein MinHash-Array der Länge k (Eingabeargument) enthält.
MINHASH_COMBINE: Kombiniert zwei (oder mehr) MinHash-Eingabezustände zu einem einzigen MinHash-Ausgabezustand.
APPROXIMATE_SIMILARITY (oder APPROXIMATE_JACCARD_INDEX): Gibt eine Schätzung der Ähnlichkeit (Jaccard-Index) von Eingabesets basierend auf deren MinHash-Zuständen zurück.
Implementierungsdetails¶
Wie auf der englischen Wikipedia-Seite zu MinHash beschrieben:
„
H
sei eine Hash-Funktion, die die Elemente vonA
undB
auf unterschiedliche ganzzahlige Werte abbildet, und für jede MengeS
seiH_min(S)
definiert als minimales Element vonS
in Bezug aufH
, d. h. als das Elements
vonS
mit dem MindestwertH(s)
, wie in der folgenden Gleichung ausgedrückt:
H_min(S) = argmin_{s in S} (H(s))
Wenn wir
H_min
aufA
undB
anwenden, erhalten wir den gleichen Wert genau dann, wenn das Element der VereinigungA ∪ B
mit dem minimalen Hash-Wert in der SchnittmengeA ∩ B
liegt. Die Wahrscheinlichkeit, dass dies wahr ist, ist daher das obige Verhältnis, daher gilt:
Pr[H_min(A) = H_min(B)] = J(A,B)
Das heißt, bei zwei zufällig ausgewählten Mengen
A
undB
ist die Wahrscheinlichkeit, dassH_min(A) = H_min(B)
gilt, gleichJ(A,B)
. Mit anderen Worten, wennX
die Zufallsvariable ist, die 1 ist, wennH_min(A) = H_min(B)
, und sonst 0 ist, dann istX
ein neutraler Schätzer vonJ(A,B)
. Beachten Sie, dassX
eine zu große Varianz hat, um ein guter Schätzer für den Jaccardindex allein zu sein (da er immer 0 oder 1 ist).Das MinHash-Schema reduziert diese Varianz, indem es für mehrere gleich konstruierte Variablen den Mittelwert bildet, indem
k
verschiedene Hash-Funktionen verwendet werden.“
Um dies zu erreichen, erstellt die Funktion MINHASH zunächst k
verschiedene Hash-Funktionen und wendet diese auf jedes Element jedes Eingabesets an, wobei das Minimum von jedem einzelnen beibehalten wird, um ein MinHash-Array (auch MinHash-Status genannt) für jedes Set zu erstellen. Genauer gesagt, für i = 0 to k-1
entspricht der Eintrag i
des MinHash-Arrays für Set A
(dargestellt durch MinHash_A
) dem Minimalwert der Hash-Funktion H_i
, die auf jedes Element von Set A
angewendet wird.
Schließlich wird eine Approximation für die Ähnlichkeit der beiden Sets A
und B
wie folgt berechnet:
J_apprx(A,B) = (# of entries MinHash_A and MinHash_B agree on) / k
Beispiele¶
Im folgenden Beispiel zeigen wir, wie dieses Schema und die entsprechenden Funktionen verwendet werden können, um die Ähnlichkeit von zwei Elementesets zu approximieren.
Erstellen Sie zunächst zwei Beispieltabellen, und fügen Sie einige Beispieldaten ein:
CREATE OR REPLACE TABLE mhtab1(c1 NUMBER,c2 DOUBLE,c3 TEXT,c4 DATE); CREATE OR REPLACE TABLE mhtab2(c1 NUMBER,c2 DOUBLE,c3 TEXT,c4 DATE); INSERT INTO mhtab1 VALUES (1, 1.1, 'item 1', to_date('2016-11-30')), (2, 2.31, 'item 2', to_date('2016-11-30')), (3, 1.1, 'item 3', to_date('2016-11-29')), (4, 44.4, 'item 4', to_date('2016-11-30')); INSERT INTO mhtab2 VALUES (1, 1.1, 'item 1', to_date('2016-11-30')), (2, 2.31, 'item 2', to_date('2016-11-30')), (3, 1.1, 'item 3', to_date('2016-11-29')), (4, 44.4, 'item 4', to_date('2016-11-30')), (6, 34.23, 'item 6', to_date('2016-11-29'));
Approximieren Sie dann die Ähnlichkeit der beiden Mengen (Tabelle mhtab1
und mhtab2
) unter Verwendung der MinHash-Status:
SELECT APPROXIMATE_SIMILARITY(mh) FROM ((SELECT MINHASH(100, *) AS mh FROM mhtab1) UNION ALL (SELECT MINHASH(100, *) AS mh FROM mhtab2)); +----------------------------+ | APPROXIMATE_SIMILARITY(MH) | |----------------------------| | 0.79 | +----------------------------+
Der Ähnlichkeitsindex dieser beiden Tabellen wird auf 0,79 approximiert, während der genaue Wert bei 0,8 (d. h. 4/5) liegt.