[一维数字数组聚类

问题描述 投票:61回答:2

所以,我说我有一个像这样的数组:

[1,1,2,3,10,11,13,67,71]

是否有一种方便的方法将数组划分为类似的内容?

[[1,1,2,3],[10,11,13],[67,71]]

[我看过类似的问题,但大多数人建议使用k均值对点进行聚类,例如scipy,对于像我这样的初学者来说,这非常令人困惑。我还认为k均值更适合于二维或二维聚类,对吗?是否有任何方法可以将N个数字的数组划分为多个分区/集群,具体取决于数字?

[有些人还建议采用严格范围划分,但是并不总是将结果呈现为预期

arrays cluster-analysis data-mining dimension partition-problem
2个回答
97
投票

对于一维问题,请勿使用多维聚类算法。单个维度比您天真的认为更特别,因为您实际上可以对其进行[sort],这使事情变得容易得多。]实际上,通常甚至不称其为聚类,但例如细分或自然休息优化。您可能希望查看Jenks Natural Breaks Optimization和类似的统计方法。

Kernel Density Estimation

也是一个很好的观察方法,具有强大的统计背景。密度的局部最小值是将数据拆分为聚类的好地方,但出于统计原因,也可以这样做。 KDE可能是最有效的一维数据聚类方法。

使用KDE,显然一维数据表现得更好。在1D模式下,您具有局部最小值;但在2D模式下,您可能会有鞍点和此类“也许”分裂点。请参阅此Wikipedia illustration of a saddle point,以了解这样的点可能适合或不适合拆分群集。

请参见this answer以了解如何在Python中执行此操作的示例(绿色标记是群集模式;红色标记是数据被切割的点; y轴是密度的对数似然):

KDE with Python

您可能会寻找离散化算法。一维离散化问题与您要问的非常相似。他们根据频率,分级策略等确定截止点。
[weka]在其离散化过程中使用以下算法。

weka.filters.supervised.attribute.Discretize

使用Fayyad&Irani的MDL方法或Kononeko的MDL标准

weka.filters.unsupervised.attribute.Discretize

使用简单装箱


4
投票
[weka]在其离散化过程中使用以下算法。
© www.soinside.com 2019 - 2024. All rights reserved.