我有数以千计的数据条目,类似于以下内容:
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,但我对其他可能性持开放态度。
答案 0 :(得分:1)
所以,它实际上取决于你想要什么样的聚类。聚类是一种非常大且通常非常昂贵的操作,并且存在大量不同的方法。
我会说,除了使用scikit的群集模块之外,没有比你的问题更好的解决方案了。他们对这里显示的不同聚类算法进行了精彩细分:http://scikit-learn.org/dev/modules/clustering.html
就我个人而言,我在大多数应用程序中使用DBSCAN,但具体取决于您希望如何聚类这些可能不是您的最佳选择的数据。另外值得一提的是,曼哈顿距离通常不是聚类算法的理想选择,余弦距离和欧几里德距离都可以更高效,并且可以更准确地表示数据。
答案 1 :(得分:-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]]