由于python伪随机生成器,Bootstrapping函数会停止运行?

时间:2014-05-30 14:47:56

标签: python numpy random iteration bootstrapping

我正在研究一种用于视觉固定数据的引导程序,并且在我遇到的这个问题上,其他人的见解可以帮助我。我怀疑要么我遗漏了与随机数生成器(random.randrange)功能相关的东西,要么它显示了我目前新手对numpy数组迭代和切片的理解。作为一名只有业余爱好程度的编程经验的心理学家,如果事实证明我是以一种非常倒退的方式做到这一点,我不会感到惊讶。

当你想对视觉注视数据进行统计分析时,你经常需要考虑中心偏差,这是观察者倾向于首先更多地固定在图像中心并且在图像中更随机地固定的偏差后来。这种偏差导致固定之间的时间相关性,并且对此类数据执行的ROC分析(接收器操作员特性)需要基于特定类型的 bootstrap 方法的基线。

在这种情况下,数据位于名为原始的numpy数组中。此数组的形状为(22,800,15,2),其中尺寸表示[观察者图像固定< / strong>( x y )]。因此,每个图像每个观察者有15个注视。

在引导程序中,我们通常希望用在所有其他图像和所有观察者的集合中的某个地方发生的另一个固定来替换每个固定,但同时(在这种情况下:相同的固定索引,指数2 原始)。

我认为这意味着我们必须做以下事情:

  1. 创建与原始相同尺寸的新数组。此数组将被称为 shuffled
  2. 检查原始 = NaN中的当前x或y。如果是这样,请不要更改此固定。否则继续;
  3. 从满足以下索引的原始子集中选择随机固定:[所有观察者,除当前图像之外的所有图像,当前固定]。确保它不含NaN,否则选择另一个随机固定,直到它不含NaN;
  4. 改组设置为原始中当前位置的随机固定。
  5. 我有一个函数,它采用数组原始并执行上面所描述的内容,稍作修改,当只有一个原始x,y对是NaN时,它只设置x或y随机固定到np.nan。当我遍历循环时,我看到了很好的结果。在迭代了+ - 10个循环后,我很满意,因为所有数据看起来都很完美,之后我继续删除我设置的raw_input()断点,让函数处理所有数据而不会中断。当我这样做时,我注意到函数减慢每个循环并在到达observer = 0 image = 48时停止。

    我的代码如下:

    for obs_index, obs in enumerate(original):
            for img_index, img in enumerate(obs):
                print obs_index, img_index
                for fix_index, fix in enumerate(img):
    
                    # do the following because sometimes only x or y in the original is NaN                    
                    rand_fix = (np.nan, np.nan)
    
                    while np.isnan(rand_fix[0]) or np.isnan(rand_fix[1]): 
    
                        rand_obs = randrange(observers)
                        rand_img = img_index
    
                        while rand_img == img_index:
                            rand_img = randrange(images)
    
                        rand_fix = original[rand_obs, rand_img, fix_index]
    
                    # do the following because sometimes only x or y in the original is NaN
                    if np.isnan(fix[0]):
                        rand_fix[0] = np.nan
                    if np.isnan(fix[1]):
                        rand_fix[1] = np.nan
    
                    shuffled[obs_index, img_index, fix_index] = rand_fix
    

    当此功能完成时,改组应包含正确改组的固定数据,以便在ROC分析中使用。

1 个答案:

答案 0 :(得分:0)

<强>解决

我提出了以下代码,不再放慢速度:

    for obs_index, obs in enumerate(original):
        for img_index, img in enumerate(obs):
            for fix_index, fix in enumerate(img):

                x = fix[0]
                y = fix[1]
                rand_x = np.nan
                rand_y = np.nan

                if not(np.isnan(x) or np.isnan(y)):
                    while np.isnan(rand_x) or np.isnan(rand_y): 

                        rand_obs = randrange(observers)
                        rand_img = img_index

                        while rand_img == img_index:
                            rand_img = randrange(images)

                        rand_x = original[rand_obs, rand_img, fix_index, 0]
                        rand_y = original[rand_obs, rand_img, fix_index, 1]

                shuffled[obs_index, img_index, fix_index, 0] = rand_x
                shuffled[obs_index, img_index, fix_index, 1] = rand_y

我还修复了将新固定分配到改组中的位置的方式,以便正确地遵循numpy索引。