在 python 中的一维列表中查找 "hotspots"

Finding "hotspots" in unidimensional list in python

给定一列单维坐标(或线段),如下所示:

[1]: 1200, 1210
[2]: 1212, 1222
[3]: 1190, 1200
[4]: 300, 310
...
[n]: 800, 810

(这里可以取每对的中心来代表每个元素) 我想知道我可以使用什么算法或什么样的算法来找到 "hotspots" 或聚类。

热点是其中包含一定数量项目(假设为 k)的分段。

例如 [3]、[1] 和 [2] 属于同一个组,结果列表类似于:

[1']: 1190, 1222 ([1], [2], [3])

(开始、结束、包含的元素)

这个问题不是很明确,但也许这会对你有所帮助。

KMeans 是一种按距离对项目进行聚类的方法。 Scikit-learn 有一个实现,非常容易使用。有关示例,请参见 http://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_digits.html#example-cluster-plot-kmeans-digits-py

这将允许您定义要查找的集群的数量。但是,您无法知道每个集群中最终会有多少点。无论如何,这是一个小例子:

from sklearn.cluster import KMeans

data = [[1200, 1210], [1212, 1222], [1190, 1200], [300, 310], [800, 810]]
centers = [[sum(x) / len(x)] for x in data]

clf = KMeans(n_clusters=3)

clf.fit(centers)

for points in data:
    center = sum(points) / len(points)
    print points, center, clf.predict([center])

输出:

[1200, 1210] 1205 [1]

[1212, 1222] 1217 [1]

[1190, 1200] 1195 [1]

[300, 310] 305 [0]

[800, 810] 805 [2]

编辑:SKLearn 中提供的另一种算法是 Affinity Propagation,它不需要事先设置簇的数量。我不知道这到底是如何工作的,但你应该能够自己找到一些相关信息。

示例:

from sklearn.cluster import AffinityPropagation
import numpy as np

data = [[1200, 1210], [1212, 1222], [1190, 1200], [300, 310], [800, 810]]
centers = np.array([[sum(x) / len(x)] for x in data])

clf = AffinityPropagation()


for (points, cluster) in zip(data, clf.fit_predict(centers)):
    center = sum(points) / len(points)
    print points, center, cluster

输出:

[1200, 1210] 1205 0

[1212, 1222] 1217 0

[1190, 1200] 1195 0

[300, 310] 305 1

[800, 810] 805 2