我可以在字符串上使用K-means算法吗?

时间:2011-06-09 13:36:24

标签: python algorithm cluster-analysis bioinformatics k-means

我正在研究一个python项目,在那里我研究RNA结构进化(表示为一个字符串,例如:“(((...)))”,其中括号代表碱基对。关键是我有一个理想的结构和一个向理想结构发展的人口。我已经实现了一切,但是我想添加一个功能,我可以获得“桶数”,即每代人口中最具代表性的结构。

我正在考虑使用k-means算法,但我不确定如何将它与字符串一起使用。我发现scipy.cluster.vq但我不知道如何在我的情况下使用它。

谢谢!

4 个答案:

答案 0 :(得分:11)

如果使用scipy.cluster.vq.kmeans,您将遇到的一个问题是该函数使用欧几里德距离来测量接近度。要通过k-means聚类将问题解决为一个可解决的问题,您必须找到一种方法将字符串转换为数字向量,并能够证明使用欧几里德距离作为接近度的合理度量。

这似乎......很难。也许您正在寻找Levenshtein distance

注意variants of the K-means algorithm可以使用非欧几里德距离指标(例如Levenshtein距离)。 K-medoids(又称PAM),例如,can be applied to data with an arbitrary distance metric

例如,使用k-medoids实施import nltk.metrics.distance as distance import Pycluster as PC words = ['apple', 'Doppler', 'applaud', 'append', 'barker', 'baker', 'bismark', 'park', 'stake', 'steak', 'teak', 'sleek'] dist = [distance.edit_distance(words[i], words[j]) for i in range(1, len(words)) for j in range(0, i)] labels, error, nfound = PC.kmedoids(dist, nclusters=3) cluster = dict() for word, label in zip(words, labels): cluster.setdefault(label, []).append(word) for label, grp in cluster.items(): print(grp) ,以及Pycluster's实施Levenshtein距离,

['apple', 'Doppler', 'applaud', 'append']
['stake', 'steak', 'teak', 'sleek']
['barker', 'baker', 'bismark', 'park']

产生类似

的结果
{{1}}

答案 1 :(得分:8)

K-means仅适用于欧氏距离。编辑距离如Levenshtein不要甚至服从三角不等式可以服从三角不等式,但不是欧几里得。对于您感兴趣的各种指标,最好使用不同类型的算法,例如分层聚类:http://en.wikipedia.org/wiki/Hierarchical_clustering

或者,只需将您的RNA列表转换为加权图,边缘处使用Levenshtein权重,然后将其分解为最小生成树。在某种意义上,该树的连接最多的节点将是“最具代表性的”。

答案 2 :(得分:1)

K-means并不真正关心所涉及的数据类型。你需要做一个K-means是衡量一个项目到另一个项目的“距离”的一些方法。无论如何从底层数据计算出来,它都会根据距离做到这一点。

那就是说,我没有使用scipy.cluster.vq,所以我不确定你是如何告诉它项目之间的关系,或者如何计算从项目A到项目B的距离。

答案 3 :(得分:0)

Kmeans所需的是一个“距离”度量(数字代表一个向量,因此它可以找到向量之间的距离,并根据距离将它们聚类在质心周围)。以下是我为您写的一些示例:

  • 假设您有代表日期的字符串,例如2019-06-27 15:52:41.623Z。在这种情况下,您想要做的是选择一个日期,例如UTC时间戳记开始的时间。现在,以该开始日期和时间为参考,您可以计算到每个日期字符串的“距离”。

  • 相反,假设您有代码字符串,if(a == b)if(a == c) 那么您可能想要使用其他“距离”,例如 字符串之间的字符不同。

  • 或者,如果您具有HTML DOM结构,则<html></html><html><head></head></html>您可能不想计算字符 但有多少标签与您的“距离”不同。

  • 或者对于数据库中已知的枚举,可以将每个键定义为不同的数字,并根据自己对枚举之间的“距离”的想法。例如,如果定义为向量[0],[1],[2],则“男性”,“女性”,“中性”将暗示中性比男性更接近女性。因此,您可能想要执行[0],[2],[1]或[-1],[1],[0]。

  • 对于问题中提出的RNA / DNA结构,“距离”可以是 链之间有多少个碱基对不同。

希望您能明白。因此,您需要考虑字符串的内容,并考虑定义内容之间“距离”的最佳方法。简单的字符差异距离可以用作字符串之间的通用距离量度,但是如果您获得更好的距离概念,您的算法将更好地工作。