使用相似性函数来聚类scikit-learn

时间:2014-09-03 17:13:38

标签: python scikit-learn hierarchical-clustering

我使用函数来计算一对文档之间的相似性,并且想要使用这种相似性度量来执行聚类 代码到目前为止

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)

我担心的是,我在这里使用了相似度函数,我认为根据文档它应该是一个相异矩阵,我怎样才能将它改为不相似矩阵。 这也是一种更有效的方法。

1 个答案:

答案 0 :(得分:5)

  • 正确格式化代码,因为缩进在Python中很重要。

  • 如果可能,请保持代码完整(您遗漏了import numpy as np)。

  • 由于range始终从零开始,您可以省略它并写下range(n)

  • numpy中的索引就像[i,j,k,...]一样 因此,您实际上想要编写Sim[i][j]而不是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

  • 进行矢量化