c – 寻求概率分布的数据表示

前端之家收集整理的这篇文章主要介绍了c – 寻求概率分布的数据表示前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找一种优雅有效的方式来表示和存储通过明确抽样构建的任意概率分布.

该分销预期具有以下属性

>样本是浮点值,但原则上可以认为分辨率低至.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++相关文章