Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:准随机序列的替代方案_Python_Numpy_Scipy - Fatal编程技术网

Python:准随机序列的替代方案

Python:准随机序列的替代方案,python,numpy,scipy,Python,Numpy,Scipy,嘿,我有以下问题。我有一个很大的参数空间。在我的例子中,我有10个维度。但为了简化,我们假设我有3个变量x1,x2和x3。它们是从1到10的离散数。现在,我创建了所有可能的参数组合,并希望将它们用于后处理。在我的真实案例中,有太多的组合。所以我想做一个准随机序列搜索来减少搜索空间。但是搜索空间中的组合应该尽可能好地覆盖它。(均匀分布)。我想防止参数组合在搜索空间中聚类,它应该尽可能地覆盖整个搜索空间。我需要在参数处理过程中找到参数combiantions的首选项。有很多方法可以做到这一点,比如哈

嘿,我有以下问题。我有一个很大的参数空间。在我的例子中,我有10个维度。但为了简化,我们假设我有3个变量x1,x2和x3。它们是从1到10的离散数。现在,我创建了所有可能的参数组合,并希望将它们用于后处理。在我的真实案例中,有太多的组合。所以我想做一个准随机序列搜索来减少搜索空间。但是搜索空间中的组合应该尽可能好地覆盖它。(均匀分布)。我想防止参数组合在搜索空间中聚类,它应该尽可能地覆盖整个搜索空间。我需要在参数处理过程中找到参数combiantions的首选项。有很多方法可以做到这一点,比如哈顿、哈默斯利或索波尔序列。但它们并不适用于离散数字。一个包做准随机序列是chaospy。如果我对序列的编号进行四舍五入,每个变量的变量编号将在不同的变量组合中出现不止一次。那不是我想要的。我希望每个变量只出现一次,并且变量在搜索空间中均匀分布。是否有可能从一开始就创建一个随机多维变量组合集,其中每个变量只出现一次?例如,在二维网格10x10中,一种可能的组合是对角线。当然,在3维中,我需要100个组合来覆盖所有参数值

让我们有一个简化的示例,其中有三个变量,从1到10,使用Sobol序列:

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)