【问题标题】:Finding the center of 1D data寻找一维数据的中心
【发布时间】:2020-11-06 23:12:09
【问题描述】:

假设我有数据:0 (or near 0), 0, 0, ..., 1, 10, 52, 80, 100, 100, 100, 100 (for a while), 90, 45, 5, 0, 0, 0... 我想找到我的数据高原“中心”的索引(不一定是 int,我想要更高的精度)。

我的第一个想法是进行高斯拟合,但数据在中心有一段时间相当平坦。所以也许某种方形(?)适合。我也一直在研究使用 gsl 进行最小化,但我不知道最简单的方法是什么。

一种简单的方法是找到与中值对应的索引,但这只能给我 1 的精度。使用曲线拟合我可以做得更好。

注意:我使用 C 语言并且可以使用 GSL,但通用数学解决方案也可以!

【问题讨论】:

  • 如果您打算大量使用这些数据,那么不妨先对其进行排序。之后,您可以简单地在大小为 n 的排序数组中获取项目编号 n/2 并获取中位数。
  • 我猜不够精确。但我只是想我可以简单地计算数据的重心......
  • 您能否定义“数据高原中心”,指定所需的精度,以及高原相对于两个斜率的大小?
  • 0 (or near 0), - 这是什么意思?如果这些值是整数,0 就是0。您是否正在谈论其他类型以获得 extra 精度?
  • 高原比斜坡大“几倍”(1 到 3 倍)。数据不是整数,随着测量的进行,总会有一些噪音。

标签: c curve-fitting gsl


【解决方案1】:

推荐算法:

  1. 可选择过滤数据:3 的中值、低通等

  2. 求平均值:Avg

  3. 查找高于Avg:Center_index的值的平均索引。

  4. 平均Center_index 附近的几个“上述值”。

【讨论】:

    【解决方案2】:

    Weighted Mean Center 的一行,与您的数据类似的数组:

    int w[] = {0, 0, 0, 1, 10, 52, 80, 100, 100, 100, 100, 90, 45, 5, 0, 0}
    

    ...通过将 x 和 y 坐标乘以权重来计算 对于该特征并分别对 x 和 y 求和,以及 然后将其除以所有权重的总和。

    因为这是一维数组,所以位置用数组中的位置表示,即索引,看起来像这样:

    weighted mean center = sum(w[i]*i)/sum(w[i])  //for all i
    

    在伪代码中:

    double sum_w=0;//sum of all values (weights)
    double prod_wx=0;//product of all corresponding weights and positions
    double wmc=0; //weighted mean center
    for(int i=0;i<sizeof(w)/sizeof(w[0]);i++)
    {
        prod_wx += w[i]*i;
        sum_w += w[i];
    }
    wmc = prod_wx/sum_w;
    

    【讨论】:

      猜你喜欢
      • 2018-05-11
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多