使用线性编程识别列和行簇

时间:2011-08-21 09:00:07

标签: linear-programming cluster-analysis

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

以下方法可以吗?

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

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

2 个答案:

答案 0 :(得分: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来解决模型?

答案 1 :(得分:0)

我终于找到了如何以线性形式表达这个问题。我在Is there a good way to do this type of mining?的答案中有完整的描述,但这里有一个简短的摘要:

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

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

  • 最小化两个术语的总和:

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

    • F_i * S_i的总和。最小化这将使巴黎与大间距分开。

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

这取决于问题的不对称性,其中水平组对间距敏感,但垂直组不敏感。