Python 随机选择一个点,但不带密度偏差

Python 随机选择一个点,但不带密度偏差,python,Python,我有这样的点分布(allPoints,这是一个列表列表:[[x1,y1][x2,y2][x3,y3][x4,y4]…[xn,yn]]: 我想从中随机选择点 在Python中,我将执行以下操作: from random import * point = choice(allPoints) 除此之外,我需要随机选择不受现有密度的影响。例如,在这里,“选择”倾向于在绘图的最左上方选择一个点 在Python中,如何消除这种偏见? 我尝试将空间划分为大小为“div”的部分,然后在此部分中采样,但在许多

我有这样的点分布(allPoints,这是一个列表列表:[[x1,y1][x2,y2][x3,y3][x4,y4]…[xn,yn]]:

我想从中随机选择点

在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)

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

计算质心,或拾取一个点,如(1.0,70)

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


也就是说,如果距离(p,C)是100,距离(Q,C)是1,那么让p是100倍更有可能被选择。所有积分都有资格获胜,但拥挤的积分单独获胜的可能性较小(但以.volume弥补)。

假设您希望所选积分以视觉方式分散,我可以想出至少一种“高效/简单”的方法

  • 选择一个随机点(例如使用
    random.choice
  • 从初始设置中删除任何“关闭”的点*
  • 重复,直到集合中没有剩余的点

*这要求你从一开始就知道你希望你的样品有多浓。

如果我正确理解你最初的尝试,我相信你可以做一个简单的调整来实现这一点

随机生成一个x值(0,4.5)和一个y值(0,70)。 然后循环通过
所有点
,找到最近的点


这样做的缺点是大面积的空旷区域都集中在一个点上。一种帮助(而不是消除)这个问题的方法是使你的随机点有一个范围。如果该范围内不存在点,则随机生成一个新点。

这个问题有点不正确,但这里有一个提示

其思想是使用高斯核密度估计,然后从数据中采样,每个点的权重等于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) 

因此,为了澄清,你打算做的是在地图上选择一个随机点,而不是从你已有的点集中选择一个随机点?你必须更好地定义问题,然后才能解决它。您想从中选择什么?你想用什么样的分布来选择?听起来你想在地图上以均匀的概率随机选择一个点,然后在你的列表中找到最接近随机选择点的点。实际上这正是一个统计问题。你在最近的编辑中所写的内容表明,你并不真正了解你正在尝试做的事情背后的统计数据。您没有尝试删除偏差,因为“从X点中均匀选择一个点”过程中没有任何偏差。你想引入偏见,以避免有大量合格分数的领域。让我们尝试将其简化为更简单的内容。假设您试图从3个数字1、1.01和2中进行选择。您希望这些分数中的每一个都有1/3的机会,还是2分的机会为50%,1分和1.01分的机会为25%左右?这使得关于分数分布的假设无效。例如,考虑一个双峰的形状,在中心有几个点,但是许多点在左边或远的中心的右边。你的质心避免算法使得靠近中心的密度较小的区域更不可能被选中。我对点分布的一个假设是,它与上面显示的匹配。如果有10000个点“堆积”在其中一个异常点下面,所有点都有完全相同的(x,y)坐标,是的,那将是一个惊喜。但从OP提问的语气来看,他希望引入一种偏离左上角集群的偏向。这就是我想做的。
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)