重複の可能性:
R でコサインの類似性を見つける
R にこのような大きなテーブルがあります。たとえば、(91, 93)、(91, 99)、(91, 100) … (101, 125)。最終的な出力は
No_1 No_2 Similarity
...
6518 6763 0.974
…
テーブルはこんな感じ。
No_ Product.Group.Code R1 R2 R3 R4 S1 S2 S3 U1 U2 U3 U4 U6
91 65418 164 0.68 0.70 0.50 0.59 NA NA 0.96 NA 0.68 NA NA NA
93 57142 164 NA 0.94 NA NA 0.83 NA NA 0.54 NA NA NA NA
99 66740 164 0.68 0.68 0.74 NA 0.63 0.68 0.72 NA NA NA NA NA
100 76712 164 0.54 0.54 0.40 NA 0.39 0.39 0.39 0.50 NA 0.50 NA NA
101 56463 164 0.67 0.67 0.76 NA NA 0.76 0.76 0.54 NA NA NA NA
125 11713 164 NA NA NA NA NA 0.88 NA NA NA NA NA NA
一部の行には があるためNA
、両方の行が NA でない列のみを比較するヘルパー関数をいくつか書きました。
compareNA <- function(v1,v2) {
same <- (!is.na(v1) & !is.na(v2))
same[is.na(same)] <- FALSE
return(same)
}
selectTRUE <- function(v1, truth) {
# This function selects only the variables which correspond to the truth vector
# being true.
for (colname in colnames(v1)) {
if( !truth[ ,colname] ) {
v1[colname] <- NULL
}
}
return(v1)
}
trimAndTuck <- function(v1){
# Turns list into vector and removes first two columns
return (unlist(v1, use.names = FALSE)[-(1:2)])
}
cosineSimilarity <- function(v1, v2) {
truth <- compareNA(v1, v2)
return (cosine(
trimAndTuck(selectTRUE(v1, truth)),
trimAndTuck(selectTRUE(v2, truth))
))
}
allPairs <- function(df){
for ( i in 1:length(df)) {
for (j in 1:length(df)) {
print( cosineSimilarity(df[i,], df[j,]) )
}
}
}
実行allpairs
すると正しい答えが得られますが、これは一連の 1x1 ベクトルで行われます。私が書いたことがおそらく関数の神への侮辱であることは十分承知していますが、他にどのように書けばよいかわかりませんでした。
正しい形式でデータを返すように、これをどのように書き直す (ベクトル化する) ことができるでしょうか?
編集: LSA パッケージの一部である余弦関数を使用しています。これは、標準のコサイン類似度を計算する方法ではなく、コサイン関数で NA 値を処理することに関するものです。