【问题标题】:Clustering Algorithm (in Python) for Data数据的聚类算法(在 Python 中)
【发布时间】:2015-11-29 05:20:10
【问题描述】:

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

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,但我对其他可能性持开放态度。

【问题讨论】:

    标签: python algorithm cluster-computing


    【解决方案1】:

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

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

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

    【讨论】:

    • 我对 scipy 的问题是它需要编译。我正在使用 arm 处理器,但我无权访问工具集来创建新库。因此,首选标准库实现。每一个额外的计算都依赖于我的系统。因此,计算功率和平方根的额外步骤是显而易见的。
    • Scipy 和相关库绝对可以在 ARM 处理器上运行,尽管 SSE 优化失败了。如果您添加更多关于您的用例的信息,我可以添加到此以帮助您。
    • 这是一个 ARM926EJ-Sid(wb) rev 4 (v5l) (/proc/cpuinfo),我正在运行一个 uclibc 版本的 Linux(内核:2.6.8-rc2-fs3)。我也在 Python 2.5 上。
    • 如果你已经安装了 uclibc linux,集群模块已经足够老了,你应该能够通过 rpm 获得预编译的二进制文件。
    • 我去看看。到目前为止,我发现的任何二进制文件都有错误的 ABI。回到 gcc 3.x,GCC 从 OABI 转移到 EABI。在 gcc 3.x 之前生成的所有二进制文件都需要重新创建。此外,使用 gcc 3.x 或更高版本生成的任何新二进制文件都无法在旧的 gcc 2.x 上运行。我所有的构建都是用 gcc 2.x 生成的
    【解决方案2】:

    快速的 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]]
    

    【讨论】:

    • 谢谢你。我的理解是层次聚类方法不如 MinHash 性能好。不过,我确实喜欢这个包。
    猜你喜欢
    • 2020-07-07
    • 1970-01-01
    • 2011-05-18
    • 2013-11-26
    • 2012-05-03
    • 2020-11-22
    • 2021-07-21
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多