【问题标题】:Identifying column and row clusters with linear programming使用线性规划识别列和行簇
【发布时间】:2011-10-31 12:40:11
【问题描述】:

我相信问题Is there a good way to do this type of mining? 可以使用线性规划技术来解决。但我对此完全陌生,不知道将其视为最小化的最佳方法。

以下方法可以吗?

  • 对于每一行和每一列都有一个连续变量,它是该行/列中所有成员跨越的“长度”
  • 对于每个“点”(每个黑点)都有一个变量来指示它是行组还是列组的成员
  • 最小化第一个变量的总和

还有更好的方法吗?是否有可能以某种方式将此视为纯约束问题(即没有最小化)?我的术语正确吗?谢谢!

【问题讨论】:

    标签: linear-programming cluster-analysis


    【解决方案1】:

    是的,您绝对可以为此使用线性规划,但这很难,我认为您必须更准确地定义您的问题。我有太多问题要评论,希望你不介意我写这个作为答案......

    您的积分可以在“列组”或“行组”中。从您上面的提议,我了解到您知道列组和行组的数量?

    所以你知道你的组组成,你只想找到这些组中点的重新分配,以最小化成本总和,由以下因素决定:

    • 水平簇的垂直宽度 (c(H) = max (i,j in H) |yi - yj|)
    • 垂直簇的水平宽度 (c(V) = max (i,j in V) |xi - xj|)

    H 是水平集群,V 是垂直集群,总成本为:

    c(H1) + c(H2) + ... + c(Hn) + c(V1) + c(V2) + ... + c(Vp)
    

    预先知道n(水平簇数)和p(垂直簇数)。这是正确的吗?

    对于水平组,你说你不能有“洞”。如果您可以量化孔的大小,我会将其表示为您的问题的约束。例如:

    for each i in C, ( min (j in C) |xi - xj|  ) < r
    

    将确保您在水平集群 C 中的间隙不超过 r。这是您想要的吗? r 是固定数字吗?

    这是完整的问题,还是您有其他限制(每组的最少点数,或其他什么)?

    您需要一个精确的最小解决方案,还是一个“好的”解决方案就足够了?

    最后,技术部分,因为你之前的帖子被标记为'python',而这个不是,你必须使用python来解决模型吗?

    【讨论】:

    • 嗨,谢谢!最初的问题不是我的,所以我不知道所有细节 - 我只是好奇。但是,从那以后,我一直在研究 lp_solve 之类的软件包,它们似乎无法处理 min() 或循环之类的东西。什么是解决这个问题的好(免费)方法?我个人更喜欢python或java,但也想知道什么是“全球最佳”...... ps赏金即将到期,所以我继续并标记了这个最佳答案。另外(重要)我认为集群的数量是事先不知道的,这似乎使这更难......
    • 感谢赏金!是的,如果您不知道集群的数量,那就更难了,因为您无法为每个集群/点对添加二进制变量(如果点在集群中,则为 true),这是更自然的方式建模这个...
    • 您不能在约束中使用 min,但您通常可以使用一个附加变量:例如,min (x in C) f(x) 可以用变量 y 表示,例如:for each x in C, f(x) &gt;= y in某些情况(例如,当您y 在最小化问题的目标中具有正系数时)
    • 对于“循环”,那些是for each,即您可以为每个点添加all约束:同样,如果您有一个二进制变量x(i,C),例如x(i,C) = 1 iff i is in C,约束:for each i in C, f(x) &lt; K 与:for each point, x(i,C)*f(x) &lt; K 相同,如果f 是线性的,谁可以线性化:你不必使用其他工具,我认为上面的模型可以转换为没有太多痛苦的线性问题(对于固定数量的集群)
    • 我关于如何处理可变数量组的想法在acooke.org/cute/MixedInteg0.html - 但就我所知(我的笔记本电脑操作系统刚刚死机,所以我有点忙于修复现在……)。一些系统上的任何指针既足够灵活又足够有据可查,足以让我进一步实验......
    【解决方案2】:

    我终于想出了如何以线性形式表示这个问题。我在Is there a good way to do this type of mining? 的回答中有完整的描述,但这里有一个简短的总结:

    • 对一行中的每个相邻对使用二进制 (0/1) 变量,F_i。这对在同一组中时为 1,否则为 0。

    • 使用常量S_i来描述每对点之间的空格数。

    • 最小化两项之和:

      • 1 - F-i 的总和。将这种情况最小化会将成对组合成更大的组。

      • F_i * S_i 的总和。将其最小化会以大间距分隔巴黎。

    通过改变这两个术语的相对权重,您可以改变水平组之间间距的重要性。

    这依赖于问题中的不对称性,其中水平组对间距敏感,而垂直组则不敏感。

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2019-10-10
      • 1970-01-01
      • 2017-04-22
      • 2013-09-18
      相关资源
      最近更新 更多