2
我有類似這樣的在河,我想找到之間的餘弦相似一張大桌子每個項目,例如對(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值,而不是如何計算標準餘弦相似度。
函數R包中的餘弦函數? –
也許這[so-question](http://stackoverflow.com/questions/2535234/find-cosine-similarity-in-r)(可能重複)會有所幫助。按照接受的答案的指示。 – sgibb
這不是重複的,因爲它是關於如何在使用餘弦函數時處理NA值。 – Roland