在使用装饰器来定义"指数随机变量的对数"的随机对象不成功之后,我决定使用手动编写这个新分布的代码pymc.stochastic_from_dist.我想在这里实现的模型(第一个模型):

现在,当我尝试使用MCMC Metropolis和正态分布作为提议对日志(alpha)进行采样时(如下图所示,作为采样方法),我收到以下错误:
File "/Library/Python/2.7/site-packages/pymc/distributions.py", line 980, in rdirichlet
return (gammas[0]/gammas[0].sum())[:-1]
FloatingPointError: invalid value encountered in divide
Run Code Online (Sandbox Code Playgroud)
虽然采样不会出错的时间,但采样直方图与本文中的采样直方图相匹配.我的分层模型是:
"""
A Hierarchical Bayesian Model for Bags of Marbles
logalpha ~ logarithm of an exponential distribution with parameter lambd
beta ~ Dirichlet([black and white ball proportions]:vector of 1's)
theta ~ Dirichlet(alpha*beta(vector))
"""
import numpy as np
import pymc
from scipy.stats import expon
lambd=1.
__all__=['alpha','beta','theta','logalpha']
#------------------------------------------------------------
# Set up pyMC model: logExponential
# 1 parameter: (alpha)
def logExp_like(x,explambda): …Run Code Online (Sandbox Code Playgroud) 我在NumPy中编写了一些建模例程,需要从NumPy数组中随机选择单元格并对它们进行一些处理.必须选择所有单元而不进行替换(例如,一旦选择了单元,就不能再次选择,但必须在结束时选择所有单元).
我正在从IDL过渡,在那里我可以找到一个很好的方法来做到这一点,但我认为NumPy有一个很好的方法来做到这一点.你会建议什么?
更新:我应该说我正在尝试在2D数组上执行此操作,因此返回一组2D索引.
假设你有一个顶点的三角形任意A,B和C.本文(第4.2节)说,你可以通过以下顶点的凸组合P从三角形内均匀地生成一个随机点ABC:
P = (1 - sqrt(r1)) * A + (sqrt(r1) * (1 - r2)) * B + (sqrt(r1) * r2) * C
Run Code Online (Sandbox Code Playgroud)
在哪里r1和r2均匀地绘制[0, 1],并且sqrt是平方根函数.
你如何证明在三角形内均匀分布的采样点ABC?
编辑
正如在mathoverflow问题的评论中所指出的, Graphical Gems讨论了这种算法.
仅仅是为了练习(而不是作业),我一直试图解决这个问题(CLRS,第3版,练习11.2-6):
假设我们在大小为m的哈希表中存储了n个密钥,通过链接解决了冲突,并且我们知道每个链的长度,包括最长链的长度L. 描述从散列表中的密钥中随机均匀地选择密钥并在预期时间O(L*(1 + m/n))中返回它的过程.
到目前为止我所想的是每个键返回的概率是1/n.如果我们试图得到一个介于1到n之间的随机值x,并尝试按顺序查找按顺序排序的第x个密钥,然后沿着存储桶中的链,那么将需要O(m)才能找到正确的存储桶通过桶一个接一个地和O(L)时间来获得链中的正确密钥.
我有一个问题是在OpenCV(C++ API)中平滑和采样轮廓.假设我已经从中检索了一系列点数cv::findContours(例如应用于此图像:

最终,我想要
平滑后,我希望得到如下结果:

我还考虑在a中绘制轮廓cv::Mat,过滤Mat(使用模糊或形态学操作)并重新找到轮廓,但速度慢且次优.因此,理想情况下,我可以专门使用点序列来完成工作.
我在上面阅读了几篇帖子并天真地认为我可以简单地将一个std::vector(of cv::Point)转换为a cv::Mat然后像模糊/调整大小的OpenCV函数将为我做的工作......但他们没有.
这是我尝试过的:
int main( int argc, char** argv ){
cv::Mat conv,ori;
ori=cv::imread(argv[1]);
ori.copyTo(conv);
cv::cvtColor(ori,ori,CV_BGR2GRAY);
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i > hierarchy;
cv::findContours(ori, contours,hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
for(int k=0;k<100;k += 2){
cv::Mat smoothCont;
smoothCont = cv::Mat(contours[0]);
std::cout<<smoothCont.rows<<"\t"<<smoothCont.cols<<std::endl;
/* Try smoothing: no modification of the array*/
// cv::GaussianBlur(smoothCont, smoothCont, cv::Size(k+1,1),k);
/* Try sampling: "Assertion failed (func != 0) in resize"*/
// cv::resize(smoothCont,smoothCont,cv::Size(0,0),1,1);
std::vector<std::vector<cv::Point> > v(1);
smoothCont.copyTo(v[0]);
cv::drawContours(conv,v,0,cv::Scalar(255,0,0),2,CV_AA); …Run Code Online (Sandbox Code Playgroud) 如果我在R中有一个大型数据集,我如何考虑原始数据的分布随机抽取数据,特别是如果数据偏斜且只有1%属于次要类并且我想采取偏见样本的数据?
我想在1000到100000之间采样140个数字,这样140个数字的总和大约是2百万(2000000):
sample(1000:100000,140)
Run Code Online (Sandbox Code Playgroud)
这样:
sum(sample(1000:100000,140)) = 2000000
Run Code Online (Sandbox Code Playgroud)
任何指针如何实现这一目标?
我想在更大的应用程序中改进特定方法的性能.
目标是改善延迟(在特定功能中花费的挂钟时间),而不是(必要的)系统负载.
要求:
迄今为止丢弃的工具:
我尚未进一步评估的其他选项:
我很想知道:
我终于安顿下来了:
这个粗糙工具产生的痕迹很难解释,我可以很容易地想象一些工具来进一步处理它的输出,使它更加有用.但是,这对我来说现在已经完成了这项工作,所以我把这个项目放到了以后;).
如何选择常规密度的点子集?更正式的,
特定
dist(例如欧几里德距离),如何选择满足以下条件的最小子集B?
dist(x,y) <= d我目前的最佳镜头是
并重复整个过程,以获得最好的运气.但有更好的方法吗?
我试图用280,000个18-D点来做到这一点,但我的问题是一般策略.所以我也想知道如何用二维点做到这一点.我并不需要保证最小的子集.欢迎任何有用的方法.谢谢.
y的min(d(x,y) for x in selected)最大值我会把它称为自下而上和我最初自上而下发布的那个.这在开始时要快得多,所以对于稀疏采样,这应该更好吗?
如果不要求保证最优性,我认为这两个指标可能有用:
max {y in unselected} min(d(x,y) for x in selected)min {y in selected != x} min(d(x,y) for x in selected)RC是最小允许d,并且这两者之间没有绝对的不等式.但RC <= RE更可取. …
我注意到有两个函数关于张量流中的负采样来计算损失(sampled_softmax_loss和nce_loss).这两个函数的参数类似,但我真的想知道这两个函数有什么区别?