该分销预期具有以下属性:
>样本是浮点值,但原则上可以认为分辨率低至.001
>样本从间隔[-4000; 4000]
>然而,对于任何两个样本a,b,| a – b | < 40
> 90%的时间,它会有一个尖峰或几个尖峰彼此接近
> 10%的时间,将有一个不平坦的高原宽度为0.5到5的高峰.
通常的表示 – 直方图阵列 – 是不希望的,主要是因为量化/分辨率和空间之间的折衷.我想象必须有一种代表性的方法,根据本地的“复杂性”自适应地改变纸箱尺寸.
空间是值得关注的,因为较高级别的网格状数据结构将包含数千个单元,每个单元至少包含一个这样的概率表示.磁盘或网络传输的简单序列化是可取的,但效率不是优先考虑.
任何帮助将不胜感激.
解决方法 有趣的问题.这是一个建议,这可能是相当困难的实现,取决于你有多少数学倾向.请注意,我交换空间的速度,因为我建议可能是相当沉重的计算(但这是要针对真实数据进行测试).
首先,使用功能性方法.概率分布是概率测度:
struct distribution{ virtual ~distribution() {}; virtual double integrate(std::function<double(double)>) = 0;};
这样,您就可以从生成的样品中抽出,因为您不想存储它们.告诉自己,您可以使用“集成”方法做任何事情.
当然,通过明确的样本,你会做一些类似的事情
struct Sampleddistribution{ double integrate(std::function<double(double)> f) { double acc = 0; for (double x: samples) acc += f(samples); return acc / samples.size(); } std::deque<double> samples;};
现在,存储部分:
The usual representation — a histogram array — is undesirable mainly
because of the Trade-off between quantization/resolution and space. I
imagine there must be a method of representation that adaptively
varIEs the bin size depending on local “complexity”.
传统的方法是wavelets.你可以产生一个调用集成的系数,你可以串行化.如果它们产生的积分估计器的方差较大,则将系数除以.
然后,为了反序列化,你生成一个distribution对象,其集成方法执行与小波的集成.可以使用您最喜欢的正交方法进行集成.由于实际执行取决于您选择的小波系列(平滑,紧凑支持,正交或不等等),因此我在这里保持故意模糊.无论如何,您将需要潜入细节.
这里的一点是,通常只需要很少的小波来表示具有很少特征的平滑功能(例如,几个峰,并且另外定期成形),不像更多的“常规”有限元(直方图是特定类型的有限元表示) .小波表示适应变形体的特征,无论其位置或大小.您还可以决定要保留多少系数,从而控制压缩比.
另外,0.001的数字是相当高的数字:我怀疑你只需要少量的系数
权衡就在于您使用的小波类:非常平滑的分布可能会很好地用平滑小波表示,但紧凑支持的小波可能更容易集成在一起等等.请注意,您不需要“小波变换”软件包:只有显式表示小波函数和正交例程(尝试Gauss-XXX程序进行重建,或者是高阶).
我喜欢在傅立叶域中定义的小波(如LemarIE小波),因为它们在傅立叶空间中的值和导数在零是已知的,这允许您执行分布上的约束:概率测量必须集成到一个,您可能会事先知道预期的价值或差异.
此外,您可能希望将变量更改为仅处理函数,例如.在[0,1]上.在间隔上有一个大小的小波.
总结以上是内存溢出为你收集整理的c – 寻求概率分布的数据表示全部内容,希望文章能够帮你解决c – 寻求概率分布的数据表示所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)