Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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 np.random.choice:概率总和不等于1_Python_Numpy - Fatal编程技术网

Python np.random.choice:概率总和不等于1

Python np.random.choice:概率总和不等于1,python,numpy,Python,Numpy,如何在此处使用np.random.choice? 有p通过一些运算进行计算,如: p=[ 1.42836755e-01, 1.42836735e-01 , 1.42836735e-01, 1.42836735e-01 , 4.76122449e-05, 1.42836735e-01 , 4.76122449e-05 , 1.42836735e-01, 1.42836735e-01, 4.76122449e-05] 通常p之和不完全等于1: >>&

如何在此处使用np.random.choice?
p
通过一些运算进行计算,如:

 p=[  1.42836755e-01,   1.42836735e-01  , 1.42836735e-01,   1.42836735e-01
,   4.76122449e-05,   1.42836735e-01  , 4.76122449e-05  , 1.42836735e-01,
   1.42836735e-01,   4.76122449e-05]
通常p之和不完全等于1:

>>> sum(p)
1.0000000017347
我想通过概率=p进行随机选择:

>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)
array([4, 3, 2, 9])
这工作在这里!但在程序中有一个错误:

Traceback (most recent call last):
    indexs=np.random.choice(range(len(population)), population_number, p=p, replace=False)
  File "mtrand.pyx", line 1141, in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:17808)
ValueError: probabilities do not sum to 1
如果我打印
p

[  4.17187500e-05   2.49937500e-01   4.16562500e-05   4.16562500e-05
   2.49937500e-01   4.16562500e-05   4.16562500e-05   4.16562500e-05
   2.49937500e-01   2.49937500e-01]
>>> p=[  4.17187500e-05 ,  2.49937500e-01   ,4.16562500e-05  , 4.16562500e-05,
   2.49937500e-01  , 4.16562500e-05  , 4.16562500e-05  , 4.16562500e-05,
   2.49937500e-01   ,2.49937500e-01]
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)
array([ 9, 10,  2,  5])
但是它在pythonshell中通过以下
p
工作:

[  4.17187500e-05   2.49937500e-01   4.16562500e-05   4.16562500e-05
   2.49937500e-01   4.16562500e-05   4.16562500e-05   4.16562500e-05
   2.49937500e-01   2.49937500e-01]
>>> p=[  4.17187500e-05 ,  2.49937500e-01   ,4.16562500e-05  , 4.16562500e-05,
   2.49937500e-01  , 4.16562500e-05  , 4.16562500e-05  , 4.16562500e-05,
   2.49937500e-01   ,2.49937500e-01]
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)
array([ 9, 10,  2,  5])
更新 我已经通过精度=15对其进行了测试:

 np.set_printoptions(precision=15)
 print(p)
[  2.499375625000002e-01   2.499375000000000e-01   2.499375000000000e-01
   4.165625000000000e-05   4.165625000000000e-05   4.165625000000000e-05
   4.165625000000000e-05   4.165625000000000e-05   2.499375000000000e-01
   4.165625000000000e-05]
测试:

>>> p=np.array([  2.499375625000002e-01   ,2.499375000000000e-01   ,2.499375000000000e-01,
   4.165625000000000e-05   ,4.165625000000000e-05,   4.165625000000000e-05,
   4.165625000000000e-05  , 4.165625000000000e-05 ,  2.499375000000000e-01,
   4.165625000000000e-05])
>>> np.sum(p)
1.0000000000000002

如何使用np.random.choice解决此问题?查看差异的一种方法是:

numpy.set_printoptions(precision=15)
print(p)
这可能会显示您的
4.17187500e-05
实际上是
4.17187500005e-05
。请参阅。

这是一个与numpy的对话。随机选择函数使用给定的容差()检查概率之和

解决方案是,如果概率之和足够接近于1,则通过将概率除以概率之和来规范化概率

例如:

>>> p=[  1.42836755e-01,   1.42836735e-01  , 1.42836735e-01,   1.42836735e-01
,   4.76122449e-05,   1.42836735e-01  , 4.76122449e-05  , 1.42836735e-01,
   1.42836735e-01,   4.79122449e-05]
>>> sum(p) 
1.0000003017347 # over tolerance limit
>>> np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)

Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)
  File "mtrand.pyx", line 1417, in mtrand.RandomState.choice (numpy\random\mtrand\mtrand.c:15985)
ValueError: probabilities do not sum to 1
ValueError:概率总和不等于1

这是一个已知的numpy bug。当numpy无法足够精确地处理浮点操作时,会发生此错误。有时,概率总和约为0.999999997或1.0000000000003。它们将破坏np.random.choice()

有一个解决方法:。这种方法处理概率更加优雅,不需要精确到1.0

pvals:浮点数序列,长度p,每个浮点数的概率 不同的结果。它们的总和应为1(但是,最后一个元素 始终假定为剩余概率,只要 sum(pvals[:-1])将其转换为float64:

p = np.asarray(p).astype('float64')
p = p / np.sum(p)
np.random.choice([1,2,3,4,5,6,7,8,9, 10], 4, p=p, replace=False)

这是受另一篇帖子启发的:

thx。我在帖子上添加了更多评论。如何解决这个问题?请尝试打印
[repr(x)for x in p]
并且,如果
p
是一个numpy数组,
p.dtype
。尽管人们普遍认为,仅仅从
print
.thx的输出中重新创建一系列浮点数并不总是可能的。我如何在这里使用np.random.choice?它对我有效。你需要更加努力地创建一个。>>p=np.array([0.1999600079984003、0.1999600079984003、0.1999600079984003、3.9992001599680064e-05、0.1999600079984003、3.9992001599680064e-05、3.9992001599680064e-05、0.1999600079984003、3.9992001599680064e-05、3.99920015980064E-05])9680064E-05>>np.总和(p)0.999999999999978我不明白你为什么一直发布没有触发错误的示例。它们对解决你的问题没有帮助。thx但不起作用。ValueError:概率总和不等于1。怎么办?@pdshah你试过通过
p/=p.sum()
?是:>>p=np.array来规范化概率吗([0.1999600079984003,0.1999600079984003,0.1999600079984003,3.9992001599680064e-05,0.1999600079984003,3.9992001599680064e-05,3.9992001599680064e-05,0.1999600079984003,3.9992001599680064e-05,3.9992001599680064e-05])>>np.sum(p)0.9999999999999999999999999978>>p/>1.0000000000000002@pdshah好的,总和仍然不是一,但是
np.random.choice
有效吗?它并不总是加起来的