字符串聚类算法-指导

3
我正在尝试基于Jaro距离相似度对一组字符串进行聚类,并使用Python中的JellyFish计算。我一直在努力弄清楚如何聚类数据。我完全不是聚类方面的专家,这是我第一次尝试弄清楚如何做到这一点。
目前我已经编写了一个我认为近似于单遍分区方法的代码,其工作原理如下:
1. 将第一个字符串设为第一个聚类的质心 2. 对于下一个字符串,使用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

你的现有代码出了问题吗?如果是,你能详细说明一下吗? - Jesse Rusak
实际上它似乎工作良好!我只是发布它来引发讨论,展示我如何处理问题。我想我正在寻求方法建议,就像任何事情一样。 - Woody Pride
你可能会对 Code Review Stack Exchange 感兴趣,这个网站通常更适合那些已经能够正常运行的代码,并且你想要一般性的反馈意见。 - Jesse Rusak
啊,很酷,我从未听说过那个。谢谢。 - Woody Pride
1个回答

2
如果您的问题只是关于聚类的一般性问题,我建议您寻找比您目前使用的更直观、更易实现的版本。具体来说,FLAME聚类算法在维基百科上有一个非常好的解释,可以告诉您如何实现该算法。请查看wikipedia

哈哈哈,我以为我已经采用了最简单的技巧。谢谢你的提示,我会研究一下的。 - Woody Pride

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接