我有点分布(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)
这个问题的正确,廉价(如果可能)解决方案是什么?
如果它不荒谬,我认为理论上会有类似的东西:
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)]
答案 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');
?>
); *这要求您从一开始就知道您希望样本的浓度。