python - "Domain error in arguments." with "stats.beta.rvs"
问题描述
I meant to modle Thompson sampling, but the following code gives Domain error in arguments. I search about it and find someone says it may because Beta's parameters are negative, but here the paraameters must be positive,I have no idea how to fix it.
from scipy import stats
class TS():
def __init__(self,alpha,beta,n):
self.alpha=alpha
self.beta=beta
self.n=n
self.value=[0,0,0]#estimator
self.prob=[0.4,0.6,0.8]
def generate(self):
for j in range(self.n):
tmp=[0,0,0]
for i in range(0,3):
tmp[i]=stats.beta.rvs(self.alpha[i],self.beta[i])
max_index=tmp.index(max(tmp))
r=np.random.choice([0,1],p=(1-self.prob[max_index],self.prob[max_index]))
self.alpha[max_index]+=r
self.beta[max_index]-=(1-r)
print(self.value)
one=TS([1,1,1],[1,1,1],100)
one.generate()
error:
ValueError Traceback (most recent call last)
<ipython-input-18-9df20b1a6a3b> in <module>()
23 print(self.value)
24 one=TS([1,1,1],[1,1,1],100)
---> 25 one.generate()
<ipython-input-18-9df20b1a6a3b> in generate(self)
16 tmp=[0,0,0]
17 for i in range(0,3):
---> 18 tmp[i]=stats.beta.rvs(self.alpha[i],self.beta[i])
19 max_index=tmp.index(max(tmp))
20 r=np.random.choice([0,1],p=(1-self.prob[max_index],self.prob[max_index]))
C:\ProgramData\Anaconda3\lib\site-packages\scipy\stats\_distn_infrastructure.py in rvs(self, *args, **kwds)
938 cond = logical_and(self._argcheck(*args), (scale >= 0))
939 if not np.all(cond):
--> 940 raise ValueError("Domain error in arguments.")
941
942 if np.all(scale == 0):
ValueError: Domain error in arguments.
解决方案
self.beta[max_index]
应增加1 - r
. _ 将更新的行更改self.beta[max_index]
为
self.beta[max_index] += 1 - r
请参阅https://web.stanford.edu/~bvr/pubs/TS_Tutorial.pdf第 15 页的算法 2 。
推荐阅读
- c++ - 从 C++ 中的 .txt 文件中读取文件
- javascript - 如何分别处理多个ajax调用和最终结果
- ios - alamofire 没有准备正确的网址
- java - 多维数组java
- javascript - HTML 元素在 Javascript for 循环中添加,然后在计数器增加时删除
- r - 在 R 中需要帮助子集和顺序标记主数据文件
- ios - 如何在 Swift 中使用协议初始化 UIViews 和 UIViewControllers
- c# - C# / LINQ 新手,查询中的分组无法解决
- c# - 调用 Application.Calculate 中断正在编辑的公式
- machine-learning - 机器学习中超参数和启发式的区别?