我相信问题Is there a good way to do this type of mining?可以使用线性编程技术来解决。但我对此完全陌生,并且不知道将此作为最小化的最佳方法。
以下方法可以吗?
还有更好的方法吗?是否有可能以某种方式将其构建为纯约束问题(即没有最小化)?我的术语是否正确?谢谢!
答案 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
的总和。最小化这将使巴黎与大间距分开。
通过更改两个术语的相对权重,您可以更改水平组之间间距的重要性。
这取决于问题的不对称性,其中水平组对间距敏感,但垂直组不敏感。