0

我有数千个类似于以下内容的数据条目:

08 00 00 00 c3 85 20 65 6e 61 62 6c 65 64 2e 0d 0a 45 78 70
5c 72 88 74 80 83 82 79 68 8d 7b 73 90 7c 60 84 80 74 00 00
5d 77 84 76 7d 85 7f 7d 6c 94 7e 73 82 74 61 7f 7b 76 00 00
63 70 84 8c 95 87 80 72 65 73 70 67 85 8a 64 93 89 74 00 00
65 7c 73 6c 6c 9a a2 86 7e 4f 7e 71 7c 79 5c 7f 72 7b 00 00
...

每个条目有 20 个数字,其中每个数字可以是 0 到 255 之间的任何值(显示为十六进制数字)。我有可以用来帮助固定集群的参考资料。引用具有与数据相同的模板。

我已经确定我可以使用曼哈顿距离方程来给每个人一个关于参考数组的数值。但我正在寻找一种对数据进行聚类的方法。根据我对数据的了解,应该有大约 50-60 个集群。我希望一些数据超出阈值,因此不属于任何集群。

通过设置数据的方式,我可以处理传入的数据(大约 20 秒一次)。我还没有找到一个方便的库来使用,整个东西必须用 python 编写(最好只使用标准库)。

我希望我不需要自己开发算法。我相信我可能想要一个 MinHash,但我对其他可能性持开放态度。

4

2 回答 2

1

所以,这真的取决于你想要什么样的集群。聚类是一个非常庞大且通常在数量上相当昂贵的操作,并且有大量不同的方法来处理它。

我想说的是,没有比使用 scikit 的集群模块更好的解决方案了。他们对此处显示的不同聚类算法进行了出色的细分:http: //scikit-learn.org/dev/modules/clustering.html

我个人将 DBSCAN 用于大多数应用程序,但具体取决于您希望如何对这些数据进行聚类,这可能不是您的最佳选择。还值得一提的是,曼哈顿距离通常不是聚类算法的好选择,余弦距离和欧几里得距离都可以提高性能并更准确地表示您的数据。

于 2013-05-24T15:11:48.827 回答
-1

快速的 Google 搜索显示位于https://pypi.python.org/pypi/cluster/1.1.0b1的 python-cluster 包。其中一个示例显示了我认为与您想要的数据设置有些相似的内容。该软件包确实建议大型数据集在单独的线程中执行聚类,但我相信您的具体情况没有必要。

>>> from cluster import *
>>> data = [12,34,23,32,46,96,13]
>>> cl = HierarchicalClustering(data, lambda x,y: abs(x-y))
>>> cl.getlevel(10)     # get clusters of items closer than 10
[96, 46, [12, 13, 23, 34, 32]]
>>> cl.getlevel(5)      # get clusters of items closer than 5
[96, 46, [12, 13], 23, [34, 32]]

因为您知道所有数据都在 0 到 255 之间,所以getlevel(5)调用会将您的数据分成大约 50-52 个集群。此外,您必须将数据集转换为整数列表。

编辑:事实证明,这不会做你想要的。我假设您有足够的数据,每五个至少有一个值。这种聚类算法只会将所有内容分组到一个大的嵌套列表中,如下所示。

>>> data = [1,2,3,4,5,6,7,8,9]
>>> x = HierarchicalClustering(data, lambda x,y: abs(x-y))
>>> x.getlevel(1)
[[1, 2, 3, 4, 5, 6, 9, 7, 8]]
于 2013-05-24T15:03:28.733 回答