Algorithm 布尔型的多维聚类

Algorithm 布尔型的多维聚类,algorithm,cluster-analysis,multidimensional-array,Algorithm,Cluster Analysis,Multidimensional Array,以下是我的问题场景: 我有几千件物品。每个对象有256个布尔维度(true或false)。我想找到这样的集群 每个集群都有最小数量的真维度(如果集群中的任何对象将此维度视为真,则集群的维度为真) 所有簇上所有真实维度的总和最小 每个簇都不大于某个预定义值 解的最优性不是必需的,但是算法应该是快速的 我应该如何最好地解决这个问题?你会推荐一种算法吗 注意:我已经用蛮力方法解决了这个问题,但是速度很慢。您可以将其写成: 您有固定数量的簇和对象。 每个群集最多可以有256个真实维度。 如果对象k中的

以下是我的问题场景:

我有几千件物品。每个对象有256个布尔维度(true或false)。我想找到这样的集群

  • 每个集群都有最小数量的真维度(如果集群中的任何对象将此维度视为真,则集群的维度为真)
  • 所有簇上所有真实维度的总和最小
  • 每个簇都不大于某个预定义值
  • 解的最优性不是必需的,但是算法应该是快速的

    我应该如何最好地解决这个问题?你会推荐一种算法吗



    注意:我已经用蛮力方法解决了这个问题,但是速度很慢。

    您可以将其写成

    您有固定数量的簇和对象。
    每个群集最多可以有256个真实维度。
    如果对象k中的尺寸i为真,则参数等于1

    您有以下变量

  • 如果维度j是簇i的真实维度,则二进制变量等于1
  • 是一个二进制变量,如果对象k位于簇i中,则为true
  • 您有以下约束条件:

  • 每个对象只能在一个簇中
  • 维度在集群iif中为真,如果它在集群内的所有对象中为真
  • 每个簇只能容纳M个对象
  • 第二个约束很棘手,因为它感觉不是线性的,但实际上您可以线性地编写它。 约束可以写为:

  • 为了所有的k
  • 我和j
  • 尽管我
  • 目标函数可以是所有维度的总和,因此可以最小化所有簇中所有真实维度的总和

    让我解释一下第二个约束条件:在右侧,计算簇i内的元素数量减去维度j设置为1的对象数量。如果所有对象都有尺寸j,则等于零;如果没有尺寸j,则等于正值

    如果计算结果为零,则必须等于1,以避免违反约束。如果不是,则可以是任何内容(零或一)。这是因为它将出现在目标函数中,这意味着当程序在0或1之间进行选择时,它将选择0

    一旦你写了这篇文章,你可以用一个商业解决方案来解决它(如果你有一个,他们会给学生免费的许可证,如果你是一个),或者只是举一个例子


    提醒一下:解决MILP是一个NP完全问题,所以我决定写下我提出的(理论)解决方案。一方面是因为它可能会帮助我(请参阅下文了解更多信息),另一方面是为感兴趣的人提供一个体面的解决方案。这是一个线性方程组,我们可以用

    我提出的限制条件是:


    1) 每个对象都恰好位于一个簇中

    2) 每个簇最多有M个(常量)对象

    3) 如果集群中至少有一个对象的维度设置为true,则集群的维度为true


    我现在将解释这些约束是如何实施的:

    设有n个对象和k个簇。我们考虑和(以下是一行)< /P> x11+x21+x31+…+xn1+d11+d21+d31+…+dn1+

    x12+x22+x32+…+xn2+d12+d22+d32+…+dn2+

    x1k+x2k+x3k+…+xnk+d1k+d2k+d3k+…+dnk

    在哪里

    xac为真iff对象a为int集群c

    如果集群c中的维度b为真,则dbc为真

    因为集群对象总是更好(或者至少从来不会有害),所以我们知道集群的数量是ceil(对象除以M)。为了简单起见,我现在将省略变量,只写系数

    1)每个对象恰好位于一个簇中

    10…0 0…0 10…0 0…0 10…0 0…0。。。10…0…0=1

    010…0 0…0 010…0 0…0 010…0 0…0 0。。。010…0…0=1

    0..01 0…0 0…01 0…0 0…01 0…0。。。0…01 0…0=1


    这将强制每个对象恰好位于一个集群中。这可以允许对象与零件一起使用(第1点是否意味着每个集群必须至少有一些固定数量的真实维度,或者每个集群必须有尽可能少的真实维度?如果您有一个功能性的但缓慢的实现,也许您应该提供一个小示例,其中维度要少得多。这意味着每个集群应该有尽可能少的真实维度。)尽可能。我只是注意到它可能有点多余。只有2和3应该足以定义问题。蛮力基本上是这样的:1)找到真实维度最少的非群集对象并添加到新群集(当前群集)2)找到最相似的非群集对象(到当前群集)并添加。重复此操作,直到当前簇已满3)转到1)如果有更多非簇对象我的直觉是,您应该从具有最真实维度的对象开始。一旦将其中一个对象放入集群中,就可以免费添加许多其他对象,因为它们的真实维度是第一个对象的子集。真实维度很少的对象几乎可以放在任何有空间的地方。这似乎是对“集群iif中的维度是真实的,如果集群iif中的所有对象都是真实的”的误解。这应该是“一个维度在集群中为false,如果它在集群中的所有对象中为false”。但总的来说,这是一个非常好的主意。非常感谢。一旦我有时间验证,我会将其标记为已接受!在这种情况下,第二个约束应该是d_i,j