2010-03-29 18 views
18

Ich frage mich, ob es eine eingebaute Funktion in R gibt, die die Kosinusähnlichkeit (oder Kosinusabstand) zwischen zwei Arrays finden kann?Kosinusähnlichkeit zwischen zwei Arrays finden

Momentan habe ich meine eigene Funktion implementiert, aber ich kann mir nicht helfen, aber denke, dass R schon mit einem kommen sollte.

+26

Benötigt R wirklich eine neue Funktion nur für 'x% *% y/sqrt (x% *% x * y% *% y)'? –

+1

Dieser Beitrag zeigt, wie man eine Cooccurrence-Matrix erstellt und dann die Kosinus-Ähnlichkeit berechnet - http://stackoverflow.com/a/24627329/168689 – Rob

+0

Siehe auch https://stackoverflow.com/questions/8158867/most-efficient- R-Cosinus-Berechnung –

Antwort

59

Diese Art von Fragen kommen die ganze Zeit (für mich - und wie durch die r -markierte SO Liste Frage - auch andere):

Gibt es eine Funktion, entweder in R-Kern oder in irgendeinem R-Paket, das x? und wenn ja,

Wo finde ich es unter den +2000 R-Paketen in CRAN?

kurze Antwort: geben dem sos Paket versuchen, wenn diese Art von Fragen kommen

Einer der früheren Antworten gab Cosinus zusammen mit einem Link zu seiner Hilfeseite. Dies ist wahrscheinlich genau das, was das OP will. Wenn Sie auf die verknüpfte Seite schauen, sehen Sie, dass sich diese Funktion im lsa Paket befindet.

Aber Wie würden Sie diese Funktion finden, wenn Sie nicht schon wüssten, in welchem ​​Paket Sie suchen?

Sie können immer versuchen, die Standard-R Hilfefunktionen (">" unten nur die R-Befehlszeile bedeutet):

> ?<some_name> 

> ??<some_name> 

> *apropos*<some_name> 

, wenn diese Anforderungen nicht, so & Last Paket des sos installieren dann

***findFn*** 

findFn wird auch auf "???" aliased, thou gh i oft nicht verwenden, weil ich Sie nicht denken, in andere Argumente als die Funktionsnamen passieren kann

für die Frage hier, versuchen Sie dies:

> library(sos) 

> findFn("cosine", maxPages=2, sortby="MaxScore") 

Die zusätzlichen Argumente übergeben (“ maxPages = 2 "und" sortby = "MaxScore") beschränkt nur die Anzahl der zurückgegebenen Ergebnisse und gibt an, wie die Ergebnisse sortiert werden, dh "finde eine Funktion mit dem Namen 'Cosinus' oder mit dem Begriff 'Cosinus' in Die Funktionsbeschreibung gibt nur zwei Ergebnisseiten zurück und sortiert sie nach absteigender Relevanz. "

Die findFn Aufruf oben gibt einen Datenrahmen mit neun Spalten und die Ergebnisse als Zeilen - als HTML gerendert.

Scannen der letzten Spalte, Beschreibung und Link- Punkt (Reihe) 21 Sie finden:

Cosinus Measures (Matrices)

dieser Text ist auch ein Link; Klick darauf Sie auf der Hilfeseite für diese Funktion im Paket nimmt, die diese Funktion enthält - mit anderen Worten

mit findFn, können Sie ziemlich schnell die Funktion, die Sie obwohl wollen finden Sie keine Idee, das Pakets es

+0

danke für die Informationen. Es wird wahrscheinlich viele meiner Probleme in der Zukunft lösen! – defoo

+5

+100 @doug für nicht eine Douchebag und antworten mit einer großen Antwort, die ein Lehrmittel ist! Weg zu sein! –

5

in ist können Sie auch das vegan Paket überprüfen: http://cran.r-project.org/web/packages/vegan//index.html

die Funktion vegdist in diesem Paket eine Vielzahl von Unähnlichkeit (Entfernung) Funktionen, wie manhattan, euclidean, canberra, bray, kulczynski, jaccard, gower, altGower, morisita, horn, mountford, raup, binomial, chao oder cao. Bitte prüfen Sie die .pdf im Paket für eine Definition oder konsultieren Sie Referenzen https://stats.stackexchange.com/a/33001/12733.

11

Mit dem Kommentar von Jonathan Chang schrieb ich diese Funktion, um dist. Keine zusätzlichen Pakete zum Laden.

cosineDist <- function(x){ 
    as.dist(1 - x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2))))) 
} 
+0

Warum haben Sie 1- x * t (x)/(...) gemacht? ist dieser Wert der Unähnlichkeit eher als Ähnlichkeit? – alily

+1

@alily die Kosinus Formel gibt eine Ähnlichkeit. Es ist 1, wenn die Vektoren in die gleiche Richtung zeigen. Abstandsmessungen müssen den Wert 0 haben, wenn Vektoren gleich sind, also 1 - Ähnlichkeit = Abstand. Viele Anwendungen brauchen Abstand statt Ähnlichkeit (zum Beispiel "hclust"). Das Hinzufügen der 'as.dist' formatiert die Matrix als eine schöne R-Distanz (im Grunde eine Dreiecksmatrix). Ich hoffe, das hilft. – pbible

16

Es sieht aus wie ein paar Optionen bereits verfügbar sind, aber ich stolperte über eine idiomatische Lösung Ich mag so dachte ich, dass ich es in die Liste aufnehmen würde.

install.packages('proxy') # Let's be honest, you've never heard of this before. 
library('proxy') # Library of similarity/dissimilarity measures for 'dist()' 
dist(m, method="cosine") 
+0

Ja, ich kenne Proxy-Paket vorher nicht, aber ich denke nicht, dass dies ein notwendiges Paket ist ... –

0

Wenn Sie eine Skalarprodukt-Matrix haben, können Sie diese Funktion verwenden, um die Cosinus-Ähnlichkeitsmatrix zu berechnen:

get_cos = function(S){ 
    doc_norm = apply(as.matrix(dt),1,function(x) norm(as.matrix(x),"f")) 
    divide_one_norm = S/doc_norm 
    cosine = t(divide_one_norm)/doc_norm 
    return (cosine) 
} 

Eingang S ist die Matrix des Skalarprodukts. Einfach, S = dt %*% t(dt), wobei dt Ihr Datensatz ist.

Diese Funktion ist im Grunde, das Skalarprodukt durch die Normen von Vektoren zu teilen.

Verwandte Themen