2014-09-03 63 views
3

我使用函數來計算一對文檔之間的相似度,並且想要使用此相似性度量執行聚類。
到目前爲止的代碼使用相似函數進行聚類scikit-learn

Sim=np.zeros((n, n)) # create a numpy arrary 
i=0 
j=0  
for i in range(0,n):  
    for j in range(i,n): 
    if i==j: 
     Sim[i][j]=1 
    else:  
     Sim[i][j]=simfunction(list_doc[i],list_doc[j]) # calculate similarity between documents i and j using simfunction 
Sim=Sim+ Sim.T - np.diag(Sim.diagonal()) # complete the symmetric matrix 

AggClusterDistObj=AgglomerativeClustering(n_clusters=num_cluster,linkage='average',affinity="precomputed") 
Res_Labels=AggClusterDistObj.fit_predict(Sim) 

我擔心的是,在這裏我用了一個類似的功能,我想按照文件應該是disimilarity矩陣,我怎麼可以把它改成相異矩陣。 還有什麼會是一個更有效的方式來做到這一點。

回答

5
  • 格式的代碼正確,如在Python縮進事項。

  • 如果可能,請保持代碼完整(您遺漏了import numpy as np)。

  • 由於range始終從零開始,因此可以省略並寫入range(n)

  • 索引numpy作品,如[i,j,k,...]。
    因此,您實際上不想寫Sim[i, j],否則您會執行兩個操作:首先取整行切片,然後索引列。下面有另一種方法來上部三角形的元素複製到下一個

    Sim = np.identity(n) # diagonal with ones (100 percent similarity) 
    
    for i in range(n):  
        for j in range(i+1, n): # +1 skips the diagonal 
         Sim[i, j]= simfunction(list_doc[i], list_doc[j]) 
    
    # Expand the matrix (copy triangle) 
    tril = np.tril_indices_from(Sim, -1) # take lower & upper triangle's indices 
    triu = np.triu_indices_from(Sim, 1) # (without diagonal) 
    Sim[tril] = Sim[triu] 
    
  • 假定塔你真的有該範圍內的相似性(0,1)連接到相似性矩陣轉換成距離矩陣可以然後簡單地做

    dm = 1 - Sim

    該操作將通過numpy的被矢量