随机选择一个点,但没有密度偏差

时间:2017-04-13 19:06:58

标签: python

我有点分布(allPoints,列表列表:[[x1,y1] [x2,y2] [x3,y3] [x4,y4] ... [xn,yn]]) :

enter image description here

我想随机选择积分。

在Python中

我会做类似的事情:

from random import *
point = choice(allPoints)

除此之外,我需要随机选择不受现有密度的偏差。例如,在这里,"选择"倾向于在情节的最左边部分选择一个点。

我怎样才能在Python中摆脱这种偏见? 我试图将空间划分为大小的部分" div",然后在此部分内进行采样,但在很多情况下,根本不存在任何点,并且while循环不会找到任何解决方案:

def column(matrix, i):
    return [row[i] for row in matrix]    

div = 10

min_x,max_x = min(column(allPoints,0)),max(column(allPoints,0))
min_y, max_y = min(column(allPoints,1)),max(column(allPoints,1))

zone_x_min = randint(1,div-1) * (max_x - min_x) / div + min_x
zone_x_max = zone_x_min + (max_x - min_x) / div

zone_y_min = randint(1,div-1) * (max_y - min_y) / div + min_y
zone_y_max = zone_yl_min + (max_y - min_y) / div

p = choice(allPoints)

cont = True

while cont == True:
    if (p[0] > zone_x_min and p[0] < zone_x_max) and (e[1] > zone_y_min and e[1] < zone_y_max):
        cont = False
    else:
        p = choice(allPoints)

这个问题的正确,廉价(如果可能)解决方案是什么?

如果它不荒谬,我认为理论上会有类似的东西:

p = [uniform(min_x,max_x),uniform(min_y,max_y)]
while p not in allPoints:
    p = [uniform(min_x,max_x),uniform(min_y,max_y)]

4 个答案:

答案 0 :(得分:3)

这个问题有点不合理,但这是一个刺刀。

这个想法是使用高斯核密度估计,然后从您的数据中采样,其权重等于每个点的pdf的倒数。

在任何真正意义上,这在统计上都是不合理的。

import numpy as np
from scipy import stats

#random data
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)

#estimate the density
kernel = stats.gaussian_kde(np.vstack([x,y]))

#calculate the inverse of pdf for each point, and normalise to sum to 1
pvector = 1/kernel.pdf(np.vstack([x,y]))/sum(1/kernel.pdf(np.vstack([x,y])))

#get a vector of indices based on your weights
np.random.choice(range(len(x)), size = 10, replace = True, p = pvector) 

答案 1 :(得分:2)

我相信你想从你的图形中随机选择一个基准点。也就是说,一个小黑点。

计算质心,或选择像(1.0,70)这样的点。

计算从每个点到质心的距离,并将其作为您选择该点的概率。

即如果距离(P,C)为100并且距离(Q,C)为1,则让P更可能被选择100倍。所有积分都有资格获胜,但拥挤的积分个别不太可能(但补足.volume)。

答案 2 :(得分:1)

如果我理解你的初步尝试,我相信你可以做一个简单的调整来完成这项工作。

随机生成x值(0,4.5)和y值(0,70)。 然后循环allPoints以找到最近的点。

这有大空区域的缺点都汇聚到一个点。帮助(不删除)此问题的一种方法是使您的随机点具有范围。如果该范围内不存在点,则随机生成一个新点。

答案 3 :(得分:0)

假设您希望所选择的点在视觉上传播,我可以想到至少一种“高效/简单”的方法。

  • 选择一个随机点(例如<?php ini_set('memory_limit', '2048M'); ?> );
  • 从您的初始设置中移除任何“关闭”*;
  • 的点
  • 重复,直到你的设置中没有任何一点。

*这要求您从一开始就知道您希望样本的浓度。