2013-12-08 35 views
3

我想根据jaro距离给出的相似度对一组字符串进行聚类。我正在用python中的JellyFish进行计算。我一直在努力想出如何对数据进行聚类。我在聚类方面不是专家,这是我第一次尝试弄清楚如何做到这一点。字符串聚类算法 - 指导

目前,我已经写了,我相信接近分区的单程方法方法威胁我的理解是这样的:

  1. 作出的第一个字符串的第一个簇
  2. 的cnetroid在接下来的字符串使用Jaro Distance计算与该质心的相似度。
  3. 如果他们有足够的相似,然后添加字符串到集群,否则使用字符串开始一个新的集群作为重心
  4. 重复,直到没有串留下来评估

我想任何提示关于我的代码,但更重要的是,如果有人知道这样做的更好方法。我读了k-means,但我不知道如何指定k(更别说如何实际实现了)。如果你决定提供建议,那么用一般的术语来说明一下在哪里寻找指导的想法会非常困难。谢谢。

一些有关代码的注释。 1.我将随机数列表作为起始点是任意的 2.如果一个匹配得分高于前一个匹配,那么我更新质心 - 这对于第一个字符串来说是部分集群的任意值,但它是尝试作为群集质心到达'最真实'的字符串。

预先感谢任何指导

def SLINK(SList): 
    shuffle(SList) 
    Clusters = [] 
    Centroid = [] 
    Scores = [] 
    for string in SList: 
    Matched = 0 

    if len(Clusters) == 0: 
     Clusters.append([string]) 
     Centroid.append([string]) 
     Scores.append([]) 
     continue 

    for ClustNum in xrange(len(Clusters)): 
     Dist = jf.jaro_distance(string, Centroid[ClustNum][0]) 

     if Dist > 0.8: 
      Clusters[ClustNum].append(string) 

      if len(Scores[ClustNum]) == 0: 
       Scores[ClustNum].append(Dist) 
      else: 
       if Dist > Scores[ClustNum]: 
        Scores[ClustNum][0] = Dist 
        Centroid[ClustNum][0] = string 

      Matched = 1 
      break 

    if Matched ==0:  
     Clusters.append([string]) 
     Centroid.append([string]) 
     Scores.append([]) 

return Clusters 
+0

您对现有的代码有问题吗?如果是这样,你能详细说明这些吗? –

+0

其实它似乎工作正常!我只是张贴它来提醒我进行讨论,以表明我是如何处理这个问题的。我想我一直在寻找方法建议。 –

+0

您可能会对[Code Review Stack Exchange](http://codereview.stackexchange.com/)感兴趣,该代码通常更适合您的代码并且您对一般反馈感兴趣。 –

回答

2

如果您的问题只是一般有关群集我建议寻找一个更直观和容易实现的版本比你有什么就有什么。具体来说,FLAME聚类算法对如何在wikipedia上实现算法提供了一个奇妙的解释。

+0

哈哈哈,我认为我已经走过了最简单的技术。感谢您的提示,我会研究这一点。 –