我想根据jaro距离给出的相似度对一组字符串进行聚类。我正在用python中的JellyFish进行计算。我一直在努力想出如何对数据进行聚类。我在聚类方面不是专家,这是我第一次尝试弄清楚如何做到这一点。字符串聚类算法 - 指导
目前,我已经写了,我相信接近分区的单程方法方法威胁我的理解是这样的:
- 作出的第一个字符串的第一个簇
- 的cnetroid在接下来的字符串使用Jaro Distance计算与该质心的相似度。
- 如果他们有足够的相似,然后添加字符串到集群,否则使用字符串开始一个新的集群作为重心
- 重复,直到没有串留下来评估
我想任何提示关于我的代码,但更重要的是,如果有人知道这样做的更好方法。我读了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
您对现有的代码有问题吗?如果是这样,你能详细说明这些吗? –
其实它似乎工作正常!我只是张贴它来提醒我进行讨论,以表明我是如何处理这个问题的。我想我一直在寻找方法建议。 –
您可能会对[Code Review Stack Exchange](http://codereview.stackexchange.com/)感兴趣,该代码通常更适合您的代码并且您对一般反馈感兴趣。 –