2017-11-17 6 views
1

R에서 유사점을 찾는 방법은 무엇입니까? 특히, 내가 가장 중요하게 생각하는 유사성 측정 기준은 코사인과 KNN- # 값입니다. 데이터의 핵심적인 측면은 나를 위해 쓸만한 형태로 나오기 때문입니다.유클리드와 코사인으로 가장 비슷한 항목 찾기

예를 들어 내장 된 mtcars 데이터 세트를 사용하면 가장 비슷한 항목을 찾고 싶습니다.

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. 

내가 유클리드 거리 후 별도의 코사인 점수를 사용하여 KNN 방법 다시이 작업을 수행 할 수 있도록하고 싶습니다.

+0

, 당신은 "가장 유사한 항목을"말을하지만,이 유사성을 생산하고자하는 입력 값 (기능)을 참조하지 않습니다. 이 모든 것을 사용하고 싶습니까? – lmo

+1

@Imo -이 문제를 해결하기 위해 패키지를 추가했습니다. 또한 예, select 문에있는 3 개의 숫자 열을 사용하고 싶습니다. – runningbirds

+0

아, 코드 주석의 두 번째 부분을 놓쳤습니다. – lmo

답변

1

여기는 Eucledian 거리를 계산하는 데 dist() 함수를 사용하는 solituin 중 하나입니다. 먼저 모든 항목의 거리를 계산 한 다음 모든 항목의 순서를 얻습니다. 그 순서에서 i 번째 것을 고르고 각 항목에 대한 해당 점수와 항목 레이블을 선택하여 데이터 프레임에 넣습니다. 그러면 데이터 프레임에 바인딩합니다.

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 

이의 출력을 제공합니다 : 또한

      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 
관련 문제