2012-04-25 93 views
6

我想跟隨在Python中Wikipedia Article on latent semantic indexing使用下面的代碼:潛在語義分析在Python差異

documentTermMatrix = array([[ 0., 1., 0., 1., 1., 0., 1.], 
          [ 0., 1., 1., 0., 0., 0., 0.], 
          [ 0., 0., 0., 0., 0., 1., 1.], 
          [ 0., 0., 0., 1., 0., 0., 0.], 
          [ 0., 1., 1., 0., 0., 0., 0.], 
          [ 1., 0., 0., 1., 0., 0., 0.], 
          [ 0., 0., 0., 0., 1., 1., 0.], 
          [ 0., 0., 1., 1., 0., 0., 0.], 
          [ 1., 0., 0., 1., 0., 0., 0.]]) 
u,s,vt = linalg.svd(documentTermMatrix, full_matrices=False) 

sigma = diag(s) 
## remove extra dimensions... 
numberOfDimensions = 4 
for i in range(4, len(sigma) -1): 
    sigma[i][i] = 0 
queryVector = array([[ 0.], # same as first column in documentTermMatrix 
        [ 0.], 
        [ 0.], 
        [ 0.], 
        [ 0.], 
        [ 1.], 
        [ 0.], 
        [ 0.], 
        [ 1.]]) 

如何數學說,它應該工作:

dtMatrixToQueryAgainst = dot(u, dot(s,vt)) 
queryVector = dot(inv(s), dot(transpose(u), queryVector)) 
similarityToFirst = cosineDistance(queryVector, dtMatrixToQueryAgainst[:,0] 
# gives 'matrices are not aligned' error. should be 1 because they're the same 

什麼工作,與數學看起來不正確:(從here

dtMatrixToQueryAgainst = dot(s, vt) 
queryVector = dot(transpose(u), queryVector) 
similarityToFirst = cosineDistance(queryVector, dtMatrixToQueryAgainsst[:,0]) 
# gives 1, which is correct 

爲什麼rou第一個沒有,當我能找到關於LSA數學的一切時,第一個是正確的?我覺得我錯過了一些顯而易見的東西...

+0

'##刪除多餘維度......'涉及什麼? – Avaris 2012-04-25 23:59:04

+0

編輯顯示排名減少 – Jmjmh 2012-04-26 21:06:04

+0

at'u,s,vt = linalg.svd(a,full_matrices = False)',其中''''來自??? – Oerd 2012-05-01 16:50:41

回答

7

在您的代碼混淆之前,您的代碼中會有幾處不一致導致錯誤。這使得很難準確理解你所嘗試的以及你爲什麼會感到困惑(顯然你沒有在代碼被粘貼的時候運行它,或者它之前會拋出異常)。

這就是說,如果我正確地遵循你的意圖,你的第一種方法幾乎是正確的。請看下面的代碼:

documentTermMatrix = array([[ 0., 1., 0., 1., 1., 0., 1.], 
          [ 0., 1., 1., 0., 0., 0., 0.], 
          [ 0., 0., 0., 0., 0., 1., 1.], 
          [ 0., 0., 0., 1., 0., 0., 0.], 
          [ 0., 1., 1., 0., 0., 0., 0.], 
          [ 1., 0., 0., 1., 0., 0., 0.], 
          [ 0., 0., 0., 0., 1., 1., 0.], 
          [ 0., 0., 1., 1., 0., 0., 0.], 
          [ 1., 0., 0., 1., 0., 0., 0.]]) 
numDimensions = 4 
u, s, vt = linalg.svd(documentTermMatrix, full_matrices=False) 
u = u[:, :numDimensions] 
sigma = diag(s)[:numDimensions, :numDimensions] 
vt = vt[:numDimensions, :] 
lowRankDocumentTermMatrix = dot(u, dot(sigma, vt)) 
queryVector = documentTermMatrix[:, 0] 
lowDimensionalQuery = dot(inv(sigma), dot(u.T, queryVector)) 
lowDimensionalQuery 
vt[:,0] 

您應該看到lowDimensionalQueryvt[:,0]是相等的。將vt想象爲低維子空間中文檔的表示形式。首先,我們將查詢映射到該子空間中以得到lowDimensionalQuery,然後我們將其與vt的對應列進行比較。您的錯誤是試圖將轉換後的查詢與原始空間中的文檔向量lowRankDocumentTermMatrix進行比較。由於轉換後的查詢比「重構」文檔的元素少,因此Python抱怨道。

+1

謝謝。美妙的答案 – Jmjmh 2012-05-01 17:55:19