一维数字数组聚类


75

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

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

有没有一种方便的方法可以将数组划分为类似的内容?

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

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

有人还建议进行严格范围划分,但并不总是能按预期呈现结果

Answers:


114

不要针对一维问题使用多维聚类算法。单个维度比您天真的想法特别得多,因为您可以对它进行排序,这使事情变得容易得多

实际上,它通常甚至不被称为聚类,而是例如分段或自然中断优化。

您可能需要查看Jenks Natural Breaks Optimization和类似的统计方法。内核密度估计也是一个很好的方法,具有很强的统计背景。密度的局部最小值是将数据拆分为聚类的好地方,出于统计原因,可以这样做。KDE可能是用于对一维数据进行聚类的最合理的方法。

使用KDE,很明显一维数据表现得更好。在1D模式下,您具有局部最小值;但是在2D模式下,您可能会有鞍点和此类“也许”分裂点。参见Wikipedia鞍点图,以了解该点可能适合或不适合拆分群集。

请参阅此答案以获取示例如何在Python中执行此操作的示例(绿色标记是群集模式;红色标记是剪切数据的点; y轴是密度的对数似然):

使用Python的KDE



您能否用为什么meanshiftdbscan可能不是集群1D的好方法来更新答案?参见scikit-learn.org/stable/modules/clustering.html
opyate

1
本质上,两者都是内核密度估计的非常幼稚的近似值。Mean-Shift是用于多变量KDE的一种模式寻求方法,DBSCAN使用最原始的KDE(盒形内核)来定义什么是密集的,什么不是密集的。将它们用于一维数据有0个好处。
已退出–Anony-Mousse 2015年

1
但是,值得一看的是Ckmeans.1d.dp(适用于维度聚类的k均值)。参见journal.r-project.org/archive/2011-2/…–
skoush

1
@skoush是较慢的k均值变量,可产生全局最优值(仅在1d中)。但是,如果SSQ k均值目标不能解决您的问题,那么与快速标准算法相比,您发现(通过SSQ)k均值解决方案好了0.1%没关系。
已退出–Anony-Mousse,2016年

4

您可能会寻找离散化算法。一维离散化问题与您要问的非常相似。他们根据频率,分级策略等确定截止点。

weka在其离散化过程中使用以下算法。

weka.filters.supervised.attribute.Discretize

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

weka.filters.unsupervised.attribute.Discretize

使用简单的装箱

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.