我正在尝试基于Jaro距离相似度对一组字符串进行聚类,并使用Python中的JellyFish计算。我一直在努力弄清楚如何聚类数据。我完全不是聚类方面的专家,这是我第一次尝试弄清楚如何做到这一点。
目前我已经编写了一个我认为近似于单遍分区方法的代码,其工作原理如下:
1. 将第一个字符串设为第一个聚类的质心 2. 对于下一个字符串,使用Jaro Distance计算与该质心的相似度。 3. 如果它们足够相似,则将该字符串添加到该聚类中,否则使用该字符串启动具有该字符串作为质心的新聚类。 4. 重复此过程,直到没有剩余字符串可评估为止。
我希望能得到任何关于我的代码的提示,但更重要的是,如果有人知道更好的方法来完成这个任务。我读过k-means,但我不知道如何指定k(更别说实际实现了)。如果您决定给出建议,请用外行人的语言表达,并提供一些寻求指导的方向,这将不胜感激。谢谢。
关于代码的几点说明: 1. 我洗牌列表,因为起始点是任意的 2. 如果一个匹配分数比以前的匹配得分更高,则更新质心 - 这是任意的,关于第一个字符串而言,它是该聚类的一部分,但是这是为了使聚类质心尽可能“真实”。
感谢您提前给予任何指导。
目前我已经编写了一个我认为近似于单遍分区方法的代码,其工作原理如下:
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