所以说我有一个像这样的数组:
[1,1,2,3,10,11,13,67,71]
有没有一种方便的方法可以将数组划分为类似的内容?
[[1,1,2,3],[10,11,13],[67,71]]
我浏览了类似的问题,但大多数人建议使用k均值对点进行聚类,例如scipy,对于像我这样的初学者来说,这非常令人困惑。我也认为k均值更适合于二维或二维聚类,对吗?有什么方法可以将N个数字的数组划分为多个分区/集群,具体取决于数字吗?
有人还建议进行严格范围划分,但并不总是能按预期呈现结果
Answers:
不要针对一维问题使用多维聚类算法。单个维度比您天真的想法要特别得多,因为您可以对它进行排序,这使事情变得容易得多。
实际上,它通常甚至不被称为聚类,而是例如分段或自然中断优化。
您可能需要查看Jenks Natural Breaks Optimization和类似的统计方法。内核密度估计也是一个很好的方法,具有很强的统计背景。密度的局部最小值是将数据拆分为聚类的好地方,出于统计原因,可以这样做。KDE可能是用于对一维数据进行聚类的最合理的方法。
使用KDE,很明显一维数据表现得更好。在1D模式下,您具有局部最小值;但是在2D模式下,您可能会有鞍点和此类“也许”分裂点。参见Wikipedia鞍点图,以了解该点可能适合或不适合拆分群集。
请参阅此答案以获取示例如何在Python中执行此操作的示例(绿色标记是群集模式;红色标记是剪切数据的点; y轴是密度的对数似然):
您可能会寻找离散化算法。一维离散化问题与您要问的非常相似。他们根据频率,分级策略等确定截止点。
weka在其离散化过程中使用以下算法。
weka.filters.supervised.attribute.Discretize
使用Fayyad&Irani的MDL方法或Kononeko的MDL标准
weka.filters.unsupervised.attribute.Discretize
使用简单的装箱