Kérdés:
Van-e olyan R függvény, amely kiszámítja a koszinusz különbség mátrixát?
Greg Slodkowicz
2012-07-03 17:30:08 UTC
view on stackexchange narkive permalink

Szeretnék elkészíteni egy hőtérképet a fürtös csoportosítással, a koszinusz távolságok alapján. Az R és a heatmap.2 () elemeket használom az ábra elkészítéséhez. Látom, hogy van egy dist paraméter a heatmap.2 -ben, de nem találok olyan funkciót, amely a koszinusz különbség-mátrixát generálja. A beépített dist függvény nem támogatja a koszinusz távolságokat, találtam egy arules nevű csomagot is egy disszimilarity () függvénnyel, de csak ezen működik bináris adatok.

Gyorsabb lehet megírni a saját koszinusz-különbségfüggvényét.
A koszinusz hasonlóság, nem pedig eltérés. A koszinust viszont a skálázott adatok euklideszi távolságává alakíthatja: d = sqrt (2 * (1-cos)).
Ugyanaz a kérdés a SO-val kapcsolatban: [Keresse meg a koszinusz hasonlóságát két tömb között] (http://stackoverflow.com/questions/2535234/find-cosine-similarity-between-two-arrays)
öt válaszokat:
Macro
2012-07-03 19:33:59 UTC
view on stackexchange narkive permalink

Amint azt a @Max jelezte a megjegyzésekben (+1), egyszerűbb lenne "megírni a sajátodat", mint időt tölteni máshol. Mint tudjuk, a $ n $ hosszúságú $ A, B $ vektorok koszinuszi hasonlósága

$$ C = \ frac {\ sum \ limits_ {i = 1 } ^ {n} A_ {i} B_ {i}} {\ sqrt {\ sum \ limits_ {i = 1} ^ {n} A_ {i} ^ 2} \ cdot \ sqrt {\ sum \ limits_ {i = 1} ^ {n} B_ {i} ^ 2}} $$

amelyet egyszerű létrehozni az R fájlban. Legyen X az a mátrix, ahol a sorok azok az értékek, amelyek között ki akarjuk számítani a hasonlóságot. Ezután kiszámíthatjuk a hasonlósági mátrixot a következő R kóddal:

  cos.sim <- function (ix) {A = X [ix [1],] B = X [ix [2],] return (összeg (A * B) / sqrt (összeg (A ^ 2) * összeg (B ^ 2))} n <- nrow (X) cmb <- expand.grid (i = 1: n, j = 1: n) C <- mátrix (alkalmazza (cmb, 1, cos.sim), n, n)  

Ezután a mátrix A C a koszinusz-hasonlósági mátrix, és átadhatja tetszőleges hőtérkép-függvénynek (az egyetlen, amit ismerek, a image () ).

Köszönöm, ez hasznos. Tulajdonképpen nem magát a mátrixot akarom ábrázolni, hanem egy távolságfüggvényt kell használnom egy másik hőtérkép klaszterezéséhez.
Az @GregSlodkowicz, rendben van, talán átadhatja ezt a mátrixot a használt funkciónak. Továbbá, ha hasznosnak találta ezt a választ, kérjük, fontolja meg a pozitív szavazatot (vagy fogadja el a választ, ha véglegesnek tartja) :)
Nagyszerű, köszönöm a válaszodnak és a ttnphns megjegyzésének, amit megtudtam csinálni. Most szeretnék egy másik mutatót kapni a sorok klaszterezésénél, mint az oszlopok klaszterezésénél, de talán ez nyomja meg ...
Nyilván nincs elég pontom ahhoz, hogy hozzászólhassak.Csak fel akartam ajánlani Macro szép válaszának kissé módosított változatát.Itt van.# A ChirazB által készített cos.sim () verzió Macro-tól # ahol S = X% *% t (X) cos.sim.2 <- függvény (S, ix) {i <- ix [1] j <- ix [2] visszatérés (S [i, j] / sqrt (S [i, i] * S [j, j])) } # teszt X <- mátrix (rnorm (20), nrow = 5, ncol = 4) S <- X% *% t (X) n <- nrow (X) idx.arr <- expand.rács (i = 1: n, j = 1: n) C <- mátrix (alkalmazva (idx.arr, 1, cos.sim, X), n,n) C2 <- mátrix (Apply (idx.arr, 1, cos.sim.2, S), n, n) Nem szeretem a globális változót, ezért vettem fel S paraméterként.
vonjd
2014-05-09 17:53:12 UTC
view on stackexchange narkive permalink

Használhatja a koszinusz függvényt az lsa csomagból:
http://cran.r-project.org/web/packages/lsa

Brad
2018-09-17 07:46:14 UTC
view on stackexchange narkive permalink

Néhány fenti válasz számítási szempontból nem hatékony, próbálja ki ezt;


koszinusz-hasonlósági mátrixhoz

  Mátrix <- as.matrix (DF)
sim <- Matrix / sqrt (rowSums (Matrix * Matrix))
sim <- sim% *% t (sim)
 

Konvertálás koszinusz-különbségmátrixrá (távolságmátrix).

  D_sim <- as.dist (1 - sim)
 
Kimsche
2015-05-05 19:24:33 UTC
view on stackexchange narkive permalink

A következő funkció hasznos lehet, ha mátrixokkal dolgozunk, az 1-d vektorok helyett:

  # input: sormátrixok 'ma' és 'mb' (kompatibilis méretekkel) # output : koszinusz-hasonlóság matrixcos.sim = function (ma, mb) {mat = tcrossprod (ma, mb) t1 = sqrt (Apply (ma, 1, crossprod)) t2 = sqrt (Apply (mb, 1, crossprod)) mat / külső (t1, t2)}  
bmc
2018-05-23 01:43:59 UTC
view on stackexchange narkive permalink

A korábbi (@Macro) kód felgyorsításával ezt a kérdést tisztább verzióba csomagolhatjuk a következőkben:

  df <- data.frame (t (data.frame (c1 = rnorm (100),
                              c2 = rnorm (100),
                              c3 = rnorm (100),
                              c4 = rnorm (100),
                              c5 = rnorm (100),
                              c6 = rnorm (100))))

#df [df > 0] <- 1
#df [df < = 0] <- 0



Apply_cosine_similarity <- függvény (df) {
  cos.sim <- függvény (df, ix)
  {
    A = df [ix [1],]
    B = df [ix [2],]
    hozam (összeg (A * B) / sqrt (összeg (A ^ 2) * összeg (B ^ 2)))
  }
  n <- nrow (df)
  cmb <- expand.grid (i = 1: n, j = 1: n)
  C <- mátrix (alkalmazza (cmb, 1, függvény (cmb) {cos.sim (df, cmb)}), n, n)
  C
}
Apply_cosine_similarity (df)
 

Remélem, hogy ez segít!



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...