2015-12-15 66 views
2

這是my_matrix:如何計算矩陣的第一行與R中的每一行之間的餘弦相似度?

ui 194635691 194153563 177382028 177382031 195129144 196972549 196258704 194907960 196950156 194139014 153444738 192982501 192891196 
1 237  0.00  0.00  0.00  0.00  0.00  0.00   0  0.01   0   0   0   0   0 
2 261  0.01  0.00  0.00  0.00  0.00  0.00   0  0.00   0   0   0   0   0 
3 290  0.00  0.00  0.01  0.01  0.00  0.00   0  0.00   0   0   0   0   0 
4 483  0.00  0.00  0.00  0.00  0.00  0.01   0  0.00   0   0   0   0   0 
5 533  0.00  0.01  0.00  0.00  0.00  0.00   0  0.00   0   0   0   0   0 
6 534  0.00  0.00  0.00  0.00  0.01  0.00   0  0.00   0   0   0   0   0 

這些都是我的代碼如下:

b=my_matrix[1,2:length(my_matrix)] 

for (i in nrow(my_matrix)) { 
res[i]=cosine(b,my_matrix[i,2:length(my_matrix)]) 
} 

我用「LSA」封裝和 我想要得到的是計算向量b每隔一個餘弦相似矩陣從矩陣,但我的代碼矢量扔,說一個錯誤:

argument mismatch. Either one matrix or two vectors needed as input. 

我應該做些什麼來解決我的問題呢? 許多在此先感謝

+0

誰是'了'?什麼是'餘弦'和它來自哪個包? – nicola

+0

當我嘗試'b = my_matrix [1,2:length(my_matrix)]'時出現錯誤。你的意思是'ncol'而不是'length'? 'my_matrix'是'矩陣'還是'data.frame'? – nicola

+0

已從'CRAN'中刪除'ISA'包。我找到了一個8歲的github存儲庫。要麼我找不到合適的軟件包,要麼找到更新的工具。 – nicola

回答

2

你可以試試這個:

A <- my_matrix[, -1] 
b <- A[1,] 
res <- apply(A[-1, ], 1, cosine, y=b) 

此代碼沒有錯誤被執行:

d <- read.table(skip=1, text="ui 194635691 194153563 177382028 177382031 195129144 196972549 196258704 194907960 196950156 194139014 153444738 192982501 192891196 
1 237  0.00  0.00  0.00  0.00  0.00  0.00   0  0.01   0   0   0   0   0 
2 261  0.01  0.00  0.00  0.00  0.00  0.00   0  0.00   0   0   0   0   0 
3 290  0.00  0.00  0.01  0.01  0.00  0.00   0  0.00   0   0   0   0   0 
4 483  0.00  0.00  0.00  0.00  0.00  0.01   0  0.00   0   0   0   0   0 
5 533  0.00  0.01  0.00  0.00  0.00  0.00   0  0.00   0   0   0   0   0 
6 534  0.00  0.00  0.00  0.00  0.01  0.00   0  0.00   0   0   0   0   0") 

my_matrix <- as.matrix(d)[,-1] # without rownumbers. 

library(lsa) 
A <- my_matrix[, -1] 
b <- A[1,] 
res <- apply(A[-1, ], 1, cosine, y=b) 

但結果是矢量的所有值0(即第一行與其他人是正交的)。這取決於你的數據,在這種情況下很容易看到。

+0

我仍然得到同樣的錯誤是參數不匹配。輸入需要一個矩陣或兩個向量。 –

2

lsa包中的餘弦函數計算餘弦量度的矩陣的所有列向量之間,因此:

cosine(t(my_matrix[,2:ncol(my_matrix)])) 

將返回一個矩陣,其中第一列是第一之間餘弦措施的矢量my_matrix的數據行(在你的例子中是b)和所有其他行。

如果只想餘弦相似性的第一行向量:

as.vector(cosine(t(my_matrix[,2:ncol(my_matrix)]))[,1]) 

該矢量的第n個元素是第一行和原始矩陣的第n行之間的餘弦相似性。

+0

當我運行你的第二個代碼塊時,我得到了這個[1] 1 0 0 0 0 0 0 0你能向我解釋什麼是你的向量的元素。我想得到一個列矩陣,這個矩陣的第一行應該給我們在1.行和第二行之間的餘弦相似性,第二行應該給我們1.row和3.row之間的餘弦相似性,並且它繼續像這樣。多謝先 –

+1

由於它是一個列矩陣,所以將其轉換爲向量更有意義。這就是最後一行代碼中的'as.vector'。該向量的第n個元素是原始矩陣的第一行和第n行之間的餘弦相似度。換句話說:第一個元素是1,它是第一行和它自身之間的餘弦測度。第二個元素是0,它是第一行和第二行之間的餘弦相似度。等所有行。 – Tom

3

對於R版本3.2.2不可用的軟件包「isa」沒有必要。只是做自己,用餘弦相似的definition

my_matrix <- as.matrix(my_matrix) # Make sure that "my_matrix" is indeed a "matrix". 
v <- as.vector(my_matrix[1,-1]) 
M <- my_matrix[-1,-1] 
cosSim <- (M %*% v)/sqrt(sum(v*v) * rowSums(M*M)) 

第一行是僅在必要時my_matrix尚未成爲matrixdata.frame

在問題中所示的原始的錯誤消息的可能的解釋:

我想該對象的類別my_matrix的這是在問題提出的代碼中使用而引起的錯誤消息

argument mismatch. Either one matrix or two vectors needed as input.

data.frame,而不是matrix。如果是這樣,cosine函數調用中的參數bmy_matrix[i,2:length(my_matrix)]也是數據幀,而不是預期的矢量和矩陣。

作爲題外話:

即使my_matrix被強制轉換爲matrix代碼中的問題會引發錯誤按摩,由於length(my_matrix)比列數多,因而my_matrix[i,2:length(my_matrix)]選擇未定義的列。 沒有第一列的imy_matrix行是my_matrix[i,2:ncol(my_matrix)]或更短my_matrix[i,-1]

+0

https://cran.r-project.org/web/packages/lsa/(不是「isa」) – jogo

+1

@ mra68我剛剛嘗試過你的代碼,並且在執行這個乘法時遇到了錯誤(M%*%v)任何想法? –

+0

錯誤信息是什麼?你有沒有使用你的問題中顯示的矩陣?如果沒有,請編輯你的問題。 – mra68

1

v是你的1×M矢量和中號您的M×n矩陣

for (i in 1:dim(M)[2]){ 
    sim_cos_v[i] <- (v%*%as.vector(M[,i]))/(norm(as.matrix(v), "f")*norm(as.matrix(M[,i]), "f")) 
} 
sim_cos_v 
相關問題