【问题标题】:Use a similarity function for clustering scikit-learn使用相似函数对 scikit-learn 进行聚类
【发布时间】:2014-10-28 07:05:18
【问题描述】:

我使用一个函数来计算一对文档之间的相似度,并希望使用这种相似度度量进行聚类。
到目前为止的代码

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)

我担心的是,我在这里使用了相似度函数,并且我认为根据文档它应该是一个相异矩阵,我怎样才能将其更改为相异矩阵。 还有什么是更有效的方法来做到这一点。

【问题讨论】:

    标签: python scikit-learn hierarchical-clustering


    【解决方案1】:
    • 正确格式化您的代码,因为缩进在 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向量化

    【讨论】:

      猜你喜欢
      • 2016-03-17
      • 2012-12-30
      • 2020-02-13
      • 2014-10-02
      • 2016-06-01
      • 2017-03-22
      • 2015-03-09
      • 2019-12-25
      • 2015-02-20
      相关资源
      最近更新 更多