这个问题是k-medians 问题的一维实例,可以表述如下。给定一组点 x_1...x_n,将这些点划分为 k 个集合 S_1...S_k 并选择 k 个位置 y_1...y_k,以使 |x_i - y_f(i)| 的所有 x_i 的总和最小化。 ,其中 y_f(i) 是 x_i 被分配到的集合对应的位置。
由于中位数是绝对距离的总体最小值(即 L_1 范数),因此每个位置 y_j 将是相应集合 S_j 中元素 x 的中位数(因此称为 k-medians)。由于您正在查看整数值,因此如果 S_j 包含偶数个元素,则中位数可能不是整数,但在这种情况下,选择高于或低于中位数的下一个整数将给出相同的总和绝对距离。
解决 k 中位数(以及相关且更常见的 k 均值问题)的标准启发式方法是迭代的,但这并不能保证产生最佳或什至好的解决方案。解决一般度量空间的 k-median 问题是 NP-hard,找到 k-median 的有效近似是一个开放的研究问题。例如,谷歌搜索“k-medians approximation”会导致一堆给出近似方案的论文。
http://www.cis.upenn.edu/~sudipto/mypapers/kmedian_jcss.pdf
http://graphics.stanford.edu/courses/cs468-06-winter/Papers/arr-clustering.pdf
在一维中,事情变得更容易,您可以使用动态编程方法。本文描述了相关一维 k-means 问题的 DP 解决方案,R 中的源代码可在此处获得。有关详细信息,请参阅论文,但该想法与@SajalJain 提出的想法基本相同,并且可以很容易地适应解决 k-medians 问题而不是 k-means。对于 j<=k 和 m<=n,令 D(j,m) 表示 x_1...x_m 的最优 j 中位数解的成本,其中假设 x_i 是有序的。我们有复发
D(j,m) = min (D(j-1,q) + Cost(x_{q+1},...,x_m)
其中 q 的范围从 j-1 到 m-1 并且Cost
等于距中位数的绝对距离之和。对于 的天真 O(n) 实现Cost
,这将产生整个问题的 O(n^3k) DP 解决方案。但是,这可以改进为 O(n^2k),因为 Cost 可以在恒定时间内更新,而不是每次都从头开始计算,使用以下事实:对于排序序列:
Cost(x_1,...,x_h) = Cost(x_2,...,x_h) + median(x_1...x_h)-x_1 if h is odd
Cost(x_1,...,x_h) = Cost(x_2,...,x_h) + median(x_2...x_h)-x_1 if h is even
有关更多详细信息,请参阅文章。除了 Cost 函数的更新不同之外,k-median 的实现与 k-means 的实现相同。
http://journal.r-project.org/archive/2011-2/RJournal_2011-2_Wang+Song.pdf