在 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
给定一列单维坐标(或线段),如下所示:
[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