2017-11-17 6 views
1

Wie gehe ich vor, um Ähnlichkeiten in R zu finden? Insbesondere sind mir die Ähnlichkeitsmetriken Cosinus und ein KNN- # -Wert am wichtigsten. Ich denke, der Schlüssel dazu ist, dass die Daten für mich in einer brauchbaren Form erscheinen.Die meisten ähnlichen Artikel finden Sie bei euklidisch und cosine

Zum Beispiel mit dem eingebauten mtcars-Datensatz, würde ich die ähnlichsten Elemente finden wollen. Euklidische Distanz und anschließend einem separaten Cosinus-Score

library(tidyverse) 
mtcars$item = rownames(mtcars) 
mtcars = mtcars %>% select(item, mpg, hp, qsec) # use these 3 fields to find similar items. 
    #help <here> 

#desired format would be have the <N> most similar items in <N> columns indicating their respective importance 
# desired format would also have the weightings of each of these items 
mtcars$similar_1 = #most similar item 
mtcars$similar_1_score = #.8 
... 
mtcars$similar_5 = #5th most similar item 
mtcars$similar_5_score = #score associated with them. 

Ich möchte in der Lage sein, dies mit einem KNN Ansatz wieder zu tun.

+0

auch, sagen Sie „am ähnlichsten Artikel“, sondern verweisen nicht die Eingabewerte (Features), für die Sie diese Ähnlichkeit produzieren möchte. Willst du all diese verwenden? – lmo

+1

@Imo - hat das Paket hinzugefügt, um das zu erledigen. Zusätzlich, ja, möchte ich die 3 numerischen Spalten verwenden, die ich in der Select-Anweisung habe. – runningbirds

+0

Ah, verpasste den zweiten Teil in den Code-Kommentaren. – lmo

Antwort

1

Hier ist ein möglicher Solituin, wo Sie die dist() Funktion zur Berechnung der Eucledian Entfernungen verwenden. Zuerst berechnen Sie die Entfernungen für alle Artikel und erhalten dann die Bestellung für alle Artikel. Aus dieser Reihenfolge wählt man die i-te aus und wählt die Bewertung und die Artikelbezeichnung für jeden Artikel aus und legt sie in einen Datenrahmen, den man nachher an den ursprünglichen bindet.

mtcars$item = rownames(mtcars) 
    data <- (mtcars %>% select(item, mpg, hp, qsec))[1:10,] 

    euc_dist <- as.matrix(dist(data[1:10,-1])) 

    # Get the ith cars label name for one car 
    ith_item <- function(col, euc_dist, top_i) { 
     labels(euc_dist)[[1]][top_i[col]] 
    } 

    # Get the ith cars score from one column 
    ith_score <- function(col, euc_dist, top_i) { 
     euc_dist[top_i[col], col] 
    } 

    # Create a dataframe with the ith most similar item for all items 
    ith_similar <- function(euc_dist, i) { 
     orders <- apply(euc_dist, 2, order) 
     top_i <- orders[i + 1, ] 

     top_i_score <- sapply(1:ncol(euc_dist), ith_score, euc_dist, top_i) 
     top_i_items <- sapply(1:ncol(euc_dist), ith_item, euc_dist, top_i) 

     similarities <- data.frame(placeholder1 = top_i_score, 
           placeholder2 = top_i_items) 

     colnames <- c(paste0("similar_", i, "_score"), paste0("similar_", i)) 
     names(similarities) <- colnames 

     similarities 
    } 

    # For example top 2 similarities 
    n <- 2 

    for(i in 1:n) { 
     tmp_similarities <- ith_similar(euc_dist, i) 

     data <- cbind(data, tmp_similarities) 
    } 

    data 

Das wird die Ausgabe von geben:

      item mpg hp qsec similar_1_score   similar_1 similar_2_score  similar_2 
Mazda RX4     Mazda RX4 21.0 110 16.46  0.560000  Mazda RX4 Wag  3.006726 Hornet 4 Drive 
Mazda RX4 Wag   Mazda RX4 Wag 21.0 110 17.02  0.560000   Mazda RX4  2.452835 Hornet 4 Drive 
Datsun 710    Datsun 710 22.8 93 18.61  4.733297   Merc 230  12.987767  Valiant 
Hornet 4 Drive  Hornet 4 Drive 21.4 110 19.44  2.452835  Mazda RX4 Wag  3.006726  Mazda RX4 
Hornet Sportabout Hornet Sportabout 18.7 175 17.02  52.018155   Merc 280  65.040680 Mazda RX4 Wag 
Valiant      Valiant 18.1 105 20.22  6.041391 Hornet 4 Drive  6.606815 Mazda RX4 Wag 
Duster 360    Duster 360 14.3 245 15.84  70.148075 Hornet Sportabout  122.123141  Merc 280 
Merc 240D     Merc 240D 24.4 62 20.00  31.072369  Datsun 710  33.165796  Merc 230 
Merc 230     Merc 230 22.8 95 22.90  4.733297  Datsun 710  11.369802  Valiant 
Merc 280     Merc 280 19.2 123 18.30  13.186296  Mazda RX4 Wag  13.234032 Hornet 4 Drive 
Verwandte Themen