2012-08-03 98 views
2

我想要取点集并将它们分成更小的集合。约束条件是每个维度都有一些最小值和一些最大值。我想要生成这些集合的所有可能组合(我们称之为一组集合)。完成后,每个集合中的每个集合恰好出现在一个集合中。生成一组n维点

作为一个例子,假设我只有数据点有两个独立变量,i和j。它们是:

(1,1) (1,2) (2,2) (3,1),(2,1),(2,3) 

任何这些拆分的都是精品:

(1,1)(1,2) and (2,2)(3,2)(2,1)(2,3) 
First set has i < 2, second set has i >= 2. 

(1,1)(3,1)(2,1) and (1,2)(2,2)(2,3) 
First set has j < 2, second set has j >= 2. 

(1,1)(1,2) and (2,2)(3,1)(2,1) and empty and (2,3) 
First set has (i < 2, j < 3), second set has (i >= 2, j < 3) 
Third set has (i < 2, j >= 3), fourth set has (i >= 2, j >= 3) 

我能在整组的分裂的,而无需通过每个点(个不同的数字)手动迭代!次?

这不是家庭作业,只是一个程序,我试图将其作为数据拟合者的一部分编写。

+0

您的示例仅显示每个维度中的一个分隔点。情况总是如此,或者你是否有时想将点分为j <2的点,2 <= j <3的点和3 <= j的那些点? – 2012-08-05 17:28:43

+0

@EricPostpischil不,必须为每个维度生成多个分割点。你的例子j <2,2 <= j <3和3 <= j对我而言是有效的。 – Jeremy 2012-08-07 01:48:57

回答

1

假设意图是具有在每一维(因此将所述点最多分成两组相对于该维度)至多一个分割点,那么:

对于每个维度,令V是该组该维度的坐标。例如,给定点(4,10),(4,20),(6,10),(6,18),(7,3),那么对于第一维度,V是{4,6,7 }。迭代v遍历集合中的每个值。

嵌套这些迭代,每个维度一个,这样,在最内层循环的主体中,每个维度都有一个v。我们将它们编号,v0,v1,v2,...

每个v形成一个标准:x < v或v < = x。对于n维,有这些标准的组合。每个组合都指定原始点的一个子集。例如,一个这样的子集是{p | x0 < v0和v1 < = x1和v2 < = x2和...},其中点p具有坐标(x0,x1,x2,...)。因此,遍历潜在的子集(有些相同,因为它们是空的),并将它们收集到一个集合中。这是原始点集的划分。

当您完成对v值的迭代后,您将构建符合条件的每个分区。

+0

这个策略对于我的目标来说也是最佳的,每个维度也超过两组。我相信它仍然只是多项式时间(n^2用于生成n^2个可能的范围组),甚至在维数上也是线性的,这是整齐的。谢谢! – Jeremy 2012-08-07 01:53:32