【发布时间】:2011-12-29 17:09:51
【问题描述】:
我有一个有序的一维数字数组。数组长度和数组中数字的值都是任意的。我想根据数值将数组划分为 k 个分区,例如假设我想要 4 个分区,分布为 30% / 30% / 20% / 20%,即首先是前 30% 的值,然后是接下来的 30%,等等。我可以选择 k 和分布的百分比。此外,如果相同的数字在数组中出现多次,则不应包含在两个不同的分区中。这意味着上面的分配百分比并不严格,如果您愿意,可以是“目标”或“起点”。
例如,假设我的数组是ar = [1, 5, 5, 6, 7, 8, 8, 8, 8, 8]。
我选择k = 4,数字应该以pA = pB = pC = pD = 25%的百分比分布到分区A、B、C和D中。
鉴于我上面给出的约束,生成的分区应该是:
A = [1]
B = [5, 5]
C = [6, 7]
D = [8, 8, 8, 8, 8]
结果(达到/纠正)百分比pcA = 10%, pcB = 20%, pcC = 20%, pcD = 50%
在我看来,我需要一种改进的 k-means 算法,因为标准算法不能保证尊重我的百分比和/或相同值不能在多个集群/分区中的要求。
那么,有这种聚类的算法吗?
【问题讨论】:
-
如果指定 4 个分区并有一个数组
[ 1, 1, 1, 1, 1, 1, 1, 8],会发生什么? -
首先,您应该创建更多示例以明确要求。例如,当
ar=[1,2,3,4,5,6,7,8,9,10]时,您对 k=4、25% 的分布有何期望? -
您需要定义某种度量来量化特定分区与目标的接近程度。如果没有这样的措施,您将不知道哪种解决方案是“最好的”。天真的方法(根据原始百分比进行分区,然后移动分区边界以适应约束)总会给你一个解决方案,你只是不知道它有多好。
-
@Femaref 我也有同样的问题。要求来自客户,显然不是那么技术性的。我的猜测是他们会说数据数量足够多,以确保永远不会出现这种情况。我意识到这无助于正确制定算法。
-
@DocBrown 你的例子其实很简单。类似于
A=[1,2], B=[3,4,5], C=[6,7], D=[8,9,10]或A=[1,2,3], B=[4,5], C=[6,7,8], D=[9,10],但两者都是可以接受的。这取决于您如何对除法进行四舍五入。
标签: algorithm cluster-analysis partitioning