Algorithm 查找';平均值';与给定集合的值的上下距离相等

Algorithm 查找';平均值';与给定集合的值的上下距离相等,algorithm,math,distance,Algorithm,Math,Distance,我最近遇到了以下问题 问题: 给定一组高度为y的点ᵢ, 查找到线上点的平均距离等于线下点的平均距离的线的高度: 更抽象的定义:给定一组实值数据点Y={y1,…,yn},找到将Y分成两组Y的ȳ⁺ = {y∊ Y:Y>ȳ}和Y⁻ = {y∊ Y:Ya+b)/values.length, last=NaN; //迭代均衡平均距离: while(最后!=平均值){ 设下限_total=0, 下限n=0, 总上限=0, 上限n=0; for(让值的值){ 如果(值>平均值){ 上限_总+=值; ++上田

我最近遇到了以下问题 问题:

给定一组高度为y的点ᵢ, 查找到线上点的平均距离等于线下点的平均距离的线的高度:

更抽象的定义:给定一组实值数据点Y={y1,…,yn},找到将Y分成两组Y的ȳ⁺ = {y∊ Y:Y>ȳ}和Y⁻ = {y∊ Y:Y<ȳ}所以ȳ和Y元素之间的平均距离⁺ 等于ȳ和Y元素之间的平均距离⁻.

原始解决方案:使用Y的平均值初始化ȳ,计算平均上下距离,并根据上下平均距离是否更大迭代上移或下移


问题:这个问题非常基本,因此可能有更好的解决方案(?)甚至是非迭代代数算法?

如评论中所述,如果您知道哪些点在直线上方和下方,那么您可以这样解算:

a=线上方的点数

b=线下的点数

sa=线上方所有y的总和

sb=线下所有y的总和

现在我们可以创建以下等式:

(sa - a * y) / a = (b * y - sb) / b              | * a * b
sa * b - a * b * y = a * b * y - a * sb          | + a * b * y + a * sb
sa * b + a * sb = 2 * a * b * y                  | / (2 * a * b)
==> y = (a * sb + b * sa) / (2 * a * b)
      = sa / (2 * a) + sb / (2 * b)
      = (sa / a + sb / b) / 2

如果我们解释结果,那么我们可以说它是线上和线下各点平均值之间的平均值。

一个基于以下内容的迭代解决方案:

使用给定值的平均值初始化

  • 将给定值拆分为上方的下方的
  • 计算该分割的新最佳值
  • 重复直到ȳ收敛

    这比问题中概述的算法略快

    //找到与上下值平均距离相等的平均值:
    函数findEqualAverageDistanceMean(值){
    让平均值=值。减少((a,b)=>a+b)/values.length,
    last=NaN;
    //迭代均衡平均距离:
    while(最后!=平均值){
    设下限_total=0,
    下限n=0,
    总上限=0,
    上限n=0;
    for(让值的值){
    如果(值>平均值){
    上限_总+=值;
    ++上田;
    }否则如果(值<平均值){
    较低的_总+=值;
    ++下(n);
    }
    }
    last=平均值;
    平均值=(上总/上总+下总/下总)/2;
    }
    回归均值;
    }
    //例如:
    让canvas=document.getElementById(“canvas”),
    ctx=canvas.getContext(“2d”),
    points=Array.from({length:100},()=>Math.random()**4),
    平均值=点数。减少((a,b)=>a+b)/points.length,
    equalAverageDistanceMean=findEqualAverageDistanceMean(点);
    函数图(点、平均值、等平均距离平均值){
    for(设点的[i,point]个。entries()){
    ctx.fillStyle=(点
    
    y坐标等于ȳ的点怎么办?这些不包括在您的集合Y中⁺ 和Y⁻, 因此,似乎ȳ将Y分成了三组,其中一组似乎被忽略了。如果它们都包含在两个集合中,它们将改变平均距离。@RoryDaulton很好,任何解决方案都可以。因此,要么包含一个,要么都包含,要么不包含集合,只要算法是快速/简单的。如果你知道哪些点在直线的上方和下方,因为存在间隙,那么这是非常简单的。但是如果你不这样做,那么如果一个点在直线上会发生什么呢?不是100%清楚解决方案总是存在的。当一个点从直线下方移动到直线上方时,存在不连续性,分母在平均跳跃中。另一种解决问题的方法是,如果点位于两个连续的
    y
    (这是一个简单的线性方程)之间,则可以用代数方法求解该点的值但我看不到任何方法证明结果点至少一次位于这两个
    y
    之间。@leu\m我确信这是真的,并且有一个证明的草图,但需要使它更严格。其思想是连续候选
    y\u条
    之间的距离小于相应连续
    y
    之间的距离,因此如果
    y\u条
    在一个阶段高于两个连续
    y
    之间的间隔,它不能跳转到下一次的下一对连续
    y
    之间的间隔以下。因此,中间值定理的一种离散类比成立。但是,正如我所说,它还不严格,我可能忽略了一些东西。将您的答案与良好的初始估计和迭代更新相结合,与原始解决方案相比,给出了一个稍微改进的算法。