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 Aggregatfunktionen 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:
„
Hsei eine Hash-Funktion, die die Elemente vonAundBauf unterschiedliche ganzzahlige Werte abbildet, und für jede MengeSseiH_min(S)definiert als minimales Element vonSin Bezug aufH, d. h. als das ElementsvonSmit dem MindestwertH(s), wie in der folgenden Gleichung ausgedrückt:
H_min(S) = argmin_{s in S} (H(s))Wenn wir
H_minaufAundBanwenden, erhalten wir den gleichen Wert genau dann, wenn das Element der VereinigungA ∪ Bmit dem minimalen Hash-Wert in der SchnittmengeA ∩ Bliegt. 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
AundBist die Wahrscheinlichkeit, dassH_min(A) = H_min(B)gilt, gleichJ(A,B). Mit anderen Worten, wennXdie Zufallsvariable ist, die 1 ist, wennH_min(A) = H_min(B), und sonst 0 ist, dann istXein neutraler Schätzer vonJ(A,B). Beachten Sie, dassXeine 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
kverschiedene 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.