直方图箱的重新采样

数据挖掘 可能性 直方图
2022-02-08 20:07:15

我希望能够在不访问原始数据的情况下重新采样直方图箱。为了清楚起见,通过重新采样,我的意思是改变箱的数量,并且仍然提供对这些箱的原始概率的良好估计。

我可以想出很多方法来做到这一点,但是很难找出在结果直方图中保持相同概率的最佳方法。最简单的方法是输入直方图 X 有 x 个 bin,而期望的结果直方图 Y 有 y 个 bin,其中 x = y。这是原始箱的简单 1 - 1 采样。当我将 y 减小到低于 x 或将其增加到 x 之上时,问题就形成了。

例如:如果 x = 10 个 bin 和 y = 20 个 bin,看起来你可以简单地将 x 的每个 bin 加倍,这样你就有 Y = { x1, x1, x2, x2, x3, x3, ..., x10, x10但这似乎是一种幼稚的方法,因为前一个 bin 的第二个副本似乎也应该受到下一个 bin 值 y2 = (x1 + x2)/2 的影响。

如果 x = 20 个 bin 和 y = 7 个 bin,我可以看到简单地根据数据点之间的线性插值对一个值进行采样是不公平的,因为样本两侧可能有 3 或 4 个点应该是一部分重采样数据的概率。

我还想考虑直方图包含在末端的可能性,因此在测量低于冰点的水温的情况下,水的温度不太可能,标准情况下的水温也不会高于沸点。我希望能够考虑超出一个或两个极端箱的概率为 0。

是否有可以用 C++/C# 或伪代码编码的标准算法,我可以将其转换为上述重新采样/重新调整大小的代码?

1个回答

您可以Interpolation在容器和高度上使用HistogramList以产生平滑PDF的用于ProbabilityDistribution. 通过平滑分布,您无需担心增加或减少 bin 大小。

例如,与data

SeedRandom[9123]
data = RandomVariate[WeibullDistribution[2, 2], 10^6];

拥有Histogram

hist = Histogram[data, Automatic, "PDF", PlotRange -> Full]

数学图形

你有直方图箱和高度,所以我只会HistogramList用来收集它们并用ListStepPlot.

hlData = HistogramList[data, Automatic, "PDF"];
lstep = ListStepPlot[Transpose@{First@hlData, Append[Last@hlData, 0]}, Mesh -> Full]

数学图形

InterpolatingFunction可以从箱和高度构造平滑Interpolation

ifData = Interpolation[Transpose@{First@hlData, Append[Last@hlData, 0]}];
ifPlot = Plot[ifData[x], {x, Sequence @@ First@ifData["Domain"]}, PlotStyle -> Purple]

数学图形

可以看出,它与箱和高度相匹配。

Show[hist, ifPlot, lstep]

数学图形

我们想用这个函数作为PDFa 的ProbabilityDistribution,这样NProbability就可以计算和RandomVariates生成。

该函数需要在其域上是非负的。

NMinimize[ifData[x], {x} ∈ Interval @@ ifData["Domain"]]
{0., {x -> 7.4}}

最小值为零,x等于7.4

必须Integrate越过1它的域。

NIntegrate[ifData[x], {x} ∈ Interval @@ ifData["Domain"]] // N
0.996821

积分只是害羞,但我们可以1询问PDF。ProbabilityDistribution"Normalize"

dist = ProbabilityDistribution[ifData[x], {x, Sequence @@ First@ifData["Domain"]}, 
   Method -> "Normalize"];

此分布可用于随机变量指南RandomVariateProbability和其他函数。

可以计算概率

NProbability[0.9 < x < 2.2, x \[Distributed] dist]
0.514336

生成的伪随机数

RandomVariate[dist, 5]
{0.494373, 1.16545, 2.94366, 4.06116, 1.72519}

可以计算 , 和其他SurvivalFunction属性CDF

Plot[SurvivalFunction[dist, x], {x, Sequence @@ First@ifData["Domain"]}, 
 PlotStyle -> Purple]

数学图形

更新

扩大垃圾箱会导致信息丢失,所以我不建议这样做。但是,如果您必须Subdivide进入InterpolatingFunction "Domain"您需要的垃圾箱数量。

downsamples =
  Function[numbins,
    With[{bins = Subdivide[##, numbins] & @@ First@ifData["Domain"]},
     {
      bins,
      NProbability[#1 < x < #2, x \[Distributed] dist] & @@@ 
       Partition[bins, 2, 1]
      }]
    ] /@ Range[36, 12, -6];

在评论中解决您的问题;5 个案例中的每个案例的总概率仍然为 1。

Total[downsamples[[All, 2]], {2}]
{1., 1., 1., 1., 1.}

但是,请注意 PDF 直方图的差异。

ListStepPlot[
 Transpose[{First@#, Append[Last@#, 0]}] & /@ downsamples,
 Mesh -> Full,
 PlotRange -> All,
 PlotLegends -> StringTemplate["`` bins"] /@ Range[36, 12, -6]]

数学图形

初始直方图有 37 个 bin。上图显示了随着 bin 宽度的扩大(bin 数量减少),信息是如何丢失的。我会建议与之合作dist

希望这可以帮助。