Python:准随机序列的替代方案
嘿,我有以下问题。我有一个很大的参数空间。在我的例子中,我有10个维度。但为了简化,我们假设我有3个变量x1,x2和x3。它们是从1到10的离散数。现在,我创建了所有可能的参数组合,并希望将它们用于后处理。在我的真实案例中,有太多的组合。所以我想做一个准随机序列搜索来减少搜索空间。但是搜索空间中的组合应该尽可能好地覆盖它。(均匀分布)。我想防止参数组合在搜索空间中聚类,它应该尽可能地覆盖整个搜索空间。我需要在参数处理过程中找到参数combiantions的首选项。有很多方法可以做到这一点,比如哈顿、哈默斯利或索波尔序列。但它们并不适用于离散数字。一个包做准随机序列是chaospy。如果我对序列的编号进行四舍五入,每个变量的变量编号将在不同的变量组合中出现不止一次。那不是我想要的。我希望每个变量只出现一次,并且变量在搜索空间中均匀分布。是否有可能从一开始就创建一个随机多维变量组合集,其中每个变量只出现一次?例如,在二维网格10x10中,一种可能的组合是对角线。当然,在3维中,我需要100个组合来覆盖所有参数值 让我们有一个简化的示例,其中有三个变量,从1到10,使用Sobol序列:Python:准随机序列的替代方案,python,numpy,scipy,Python,Numpy,Scipy,嘿,我有以下问题。我有一个很大的参数空间。在我的例子中,我有10个维度。但为了简化,我们假设我有3个变量x1,x2和x3。它们是从1到10的离散数。现在,我创建了所有可能的参数组合,并希望将它们用于后处理。在我的真实案例中,有太多的组合。所以我想做一个准随机序列搜索来减少搜索空间。但是搜索空间中的组合应该尽可能好地覆盖它。(均匀分布)。我想防止参数组合在搜索空间中聚类,它应该尽可能地覆盖整个搜索空间。我需要在参数处理过程中找到参数combiantions的首选项。有很多方法可以做到这一点,比如哈
import numpy as np
import chaospy as cp
#Create a Joint distributuon of the three varaibles, which ranges going from 1 to 10
distribution2 = cp.J(cp.Uniform(1, 10),cp.Uniform(1, 10),cp.Uniform(1, 10))
#Create 10 numbers in the variable space
samplesSobol = distribution2.sample(10, rule="S")
#Transpose the array to get the variable combinations in subarrays
sobolPointsTranspose = np.transpose(samplesSobol)
示例输出:
[[ 7.89886475 6.34649658 4.8336792 ]
[ 5.64886475 4.09649658 2.5836792 ]
[ 1.14886475 8.59649658 7.0836792 ]
[ 1.21917725 5.01055908 2.5133667 ]
[ 5.71917725 9.51055908 7.0133667 ]
[ 7.96917725 2.76055908 9.2633667 ]
[ 3.46917725 7.26055908 4.7633667 ]
[ 4.59417725 1.63555908 5.8883667 ]
[ 9.09417725 6.13555908 1.3883667 ]
[ 6.84417725 3.88555908 3.6383667 ]]
这里每个变量都是唯一的,但输出不是离散的。我可以绕过它,得到:
[[ 8. 6. 5.]
[ 6. 4. 3.]
[ 1. 9. 7.]
[ 1. 5. 3.]
[ 6. 10. 7.]
[ 8. 3. 9.]
[ 3. 7. 5.]
[ 5. 2. 6.]
[ 9. 6. 1.]
[ 7. 4. 4.]]
现在的问题是,例如1在第一维度出现两次,或者4在第二维度出现,或者7在第三维度出现。有没有可能从一开始就创建一个随机的多维变量组合集,其中每个变量只出现一次?”这样才能起作用,每个变量必须具有相同数量的可能值。在你们的例子中,这个数字是10,所以我将使用它
生成随机点的一种方法是堆叠范围(10)的随机排列。例如,使用以下三个变量:
In [180]: np.column_stack([np.random.permutation(10) for _ in range(3)])
Out[180]:
array([[6, 6, 4],
[9, 2, 0],
[0, 4, 3],
[5, 9, 5],
[2, 8, 7],
[1, 1, 9],
[8, 3, 8],
[3, 5, 1],
[4, 0, 2],
[7, 7, 6]])
import numpy as np
np.random.seed(0)
lhd(5, 2, method='fixed')
“是否有可能从一开始就创建一组随机的多维变量组合,其中每个变量只出现一次?”要使其起作用,每个变量必须具有相同数量的可能值。在你们的例子中,这个数字是10,所以我将使用它
生成随机点的一种方法是堆叠范围(10)的随机排列。例如,使用以下三个变量:
In [180]: np.column_stack([np.random.permutation(10) for _ in range(3)])
Out[180]:
array([[6, 6, 4],
[9, 2, 0],
[0, 4, 3],
[5, 9, 5],
[2, 8, 7],
[1, 1, 9],
[8, 3, 8],
[3, 5, 1],
[4, 0, 2],
[7, 7, 6]])
import numpy as np
np.random.seed(0)
lhd(5, 2, method='fixed')
这个答案给出了一个函数,该函数生成一个4值列表,以便 [a,b,c,d]是介于1和10之间的自然数。在每个集合中,参数只能取任意值一次
import random
def generate_random_sequences(num_params=4, seed=0)
random.seed(seed)
value_lists = [[val for val in range(1, 11)] for _ in range(num_params)]
for values in value_lists:
random.shuffle(values)
ret = [[] for _ in range(num_params)]
for value_idx in range(10):
for param_idx in range(num_params):
ret[param_idx].append(value_lists[param_idx][value_idx])
return ret
我刚刚看到沃伦用numpy的回答是非常好的,而且你已经用numpy了。仍然将此作为纯python实现提交。这个答案给出了一个函数,该函数生成一个4值列表,以便 [a,b,c,d]是介于1和10之间的自然数。在每个集合中,参数只能取任意值一次
import random
def generate_random_sequences(num_params=4, seed=0)
random.seed(seed)
value_lists = [[val for val in range(1, 11)] for _ in range(num_params)]
for values in value_lists:
random.shuffle(values)
ret = [[] for _ in range(num_params)]
for value_idx in range(10):
for param_idx in range(num_params):
ret[param_idx].append(value_lists[param_idx][value_idx])
return ret
我刚刚看到沃伦用numpy的回答是非常好的,而且你已经用numpy了。仍然将此作为纯python实现提交。这是一个非常晚的答案,因此我假设它与原始海报不再相关,但我在试图找到我下面描述的现有实现时遇到了这篇文章 听起来你在寻找类似拉丁超立方体的东西:。 基本上,如果我有n个变量,我想要10个样本,那么每个变量的范围被分成10个区间,每个变量的可能值是(例如)每个区间的中点。拉丁超立方体算法随机选取样本,使每个变量的10个值中的每个值只出现一次。沃伦回答中的例子是一个拉丁超立方体的例子 这无助于尽可能地覆盖搜索空间(或者换句话说,检查设计是否填充了空间)。莫里斯和米切尔1995年的论文《计算实验的探索性设计》中有一个标准,通过观察点之间的距离来计算样本的空间填充情况。您可以创建大量不同的拉丁超立方体设计,然后使用该标准选择最佳设计,或者采用初始设计并对其进行操作以提供更好的设计。后者在这里的算法中实现: 他们在代码中给出了一些示例,例如5个点和2个变量:
In [180]: np.column_stack([np.random.permutation(10) for _ in range(3)])
Out[180]:
array([[6, 6, 4],
[9, 2, 0],
[0, 4, 3],
[5, 9, 5],
[2, 8, 7],
[1, 1, 9],
[8, 3, 8],
[3, 5, 1],
[4, 0, 2],
[7, 7, 6]])
import numpy as np
np.random.seed(0)
lhd(5, 2, method='fixed')
返回类似于
array([[ 0.5 , 0.75],
[ 0.25, 0.25],
[ 0. , 1. ],
[ 0.75, 0.5 ],
[ 1. , 0. ]])
这将使拉丁超立方体在区间[0,1]上缩放,因此您需要使用例如
下面是我运行上述代码时得到的一个输出示例:
根据Morris Mitchell标准,这张海报在填充空间方面非常出色。这是一个非常晚的答案,因此我认为它与原始海报不再相关,但我在试图找到我下面描述的现有实现的同时,看到了这张海报 听起来你在寻找类似拉丁超立方体的东西:。 基本上,如果我有n个变量,我想要10个样本,那么每个变量的范围被分成10个区间,每个变量的可能值是(例如)每个区间的中点。拉丁超立方体算法随机选取样本,使每个变量的10个值中的每个值只出现一次。沃伦回答中的例子是一个拉丁超立方体的例子 这无助于尽可能地覆盖搜索空间(或者换言之,覆盖到ch)