Javascript 使用对数比例将事件组映射到段

Javascript 使用对数比例将事件组映射到段,javascript,math,logarithm,Javascript,Math,Logarithm,我有一些事件(一组事件的数组),我想使用对数比例将这些事件映射到分段 我希望解决方案遵守一些规则: 必须使用Math.log(x+1),因为它可以很好地缩放1和小于1的数字 我想计算单个分段,而不仅仅是总分段 一组i的段之和必须等于另一组i的段之和 如果事件的线性和相等(即,如果我有事件[1,1]和[2]的总和 两个组的映射段的长度必须相等) 我开发了您在下面看到的解决方案,但它部分有效,因为组[0]的总和。分段与组[1]的总和不同。分段,因为log(1+1)+log(1+1)!=日志(2+1)

我有一些事件(一组事件的数组),我想使用对数比例将这些事件映射到分段

我希望解决方案遵守一些规则:

  • 必须使用Math.log(x+1),因为它可以很好地缩放1和小于1的数字

  • 我想计算单个分段,而不仅仅是总分段

  • 一组i的段之和必须等于另一组i的段之和 如果事件的线性和相等(即,如果我有事件[1,1]和[2]的总和 两个组的映射段的长度必须相等)

  • 我开发了您在下面看到的解决方案,但它部分有效,因为组[0]的总和。分段与组[1]的总和不同。分段,因为log(1+1)+log(1+1)!=日志(2+1)

    当规则3起作用时,如何使用Math.log(x+1)来缩放事件

    var logSegmentLen=函数(x){
    返回Math.log(x+1);
    }
    var groupOfSegmentsTotal=函数(segmentLenFn){
    var f=函数(阵列分段){
    设segments=arrayOfSegments.map(segmentLenFn);
    让总数=段。减少((a,b)=>a+b,0);
    返回{
    总计:总计,
    分段:分段
    }
    }
    返回f;
    }
    变量事件=[[1,1],[2]]
    var groups=events.map(groupOfSegmentsTotal(logSegmentLen));
    console.log(组[0]。段,组[1]。段);
    console.log(Math.abs(组[0].total-groups[1].total)<0.001);//必须打印true
    当规则3起作用时,如何使用Math.log(x+1)来缩放事件

    显然这是不可能的。您的要求#3可以重新表述为给定的刻度功能
    F(x)

    实际上,这意味着唯一适合它的
    F(x)
    形式是
    F(x)=k*x
    ,也就是说,只是一个线性尺度。任何非线性尺度(包括对数尺度)都将打破这一要求。你可能应该描述一下你更高层次的问题,也许有人能想出一个非自相矛盾的问题翻译

    旁注证明的草图。将{Xi}固定为
    n
    相同值
    x
    的集合,{Yj}固定为
    m
    相同
    y
    的集合。所以

    sum(Xi) = n*x
    sum(Yj) = m*y
    sum(F(Xi)) = n*F(x)
    sum(F(Yj)) = m*F(y)
    
    要求变成:

    sum(Xi) = sum(Yj)  =>  sum(F(Xi)) = sum(F(Yj))
    n*x = m*y => n*F(x) = m*F(y)
    
    这适用于任意整数
    n
    m
    。现在让我们修复
    F(1)
    =
    k
    。这意味着对于任何
    m/n
    F(m/n)=m/n*k
    。由于实数可以用分数以任意精度近似,这意味着对于任何
    x
    F(x)=x*k

    当规则3起作用时,如何使用Math.log(x+1)来缩放事件

    显然这是不可能的。您的要求#3可以重新表述为给定的刻度功能
    F(x)

    实际上,这意味着唯一适合它的
    F(x)
    形式是
    F(x)=k*x
    ,也就是说,只是一个线性尺度。任何非线性尺度(包括对数尺度)都将打破这一要求。你可能应该描述一下你更高层次的问题,也许有人能想出一个非自相矛盾的问题翻译

    旁注证明的草图。将{Xi}固定为
    n
    相同值
    x
    的集合,{Yj}固定为
    m
    相同
    y
    的集合。所以

    sum(Xi) = n*x
    sum(Yj) = m*y
    sum(F(Xi)) = n*F(x)
    sum(F(Yj)) = m*F(y)
    
    要求变成:

    sum(Xi) = sum(Yj)  =>  sum(F(Xi)) = sum(F(Yj))
    n*x = m*y => n*F(x) = m*F(y)
    

    这适用于任意整数
    n
    m
    。现在让我们修复
    F(1)
    =
    k
    。这意味着对于任何
    m/n
    F(m/n)=m/n*k
    。由于实数可以用分数以任意精度近似,这意味着对于任何
    x
    F(x)=x*k

    我必须将事件绘制为直方图,我有像[1,1]、[2]这样的事件,它们必须生成两个片段,第一个由两个子片段组成,第二个由一个片段组成。两段的长度必须相等。这就是我的意思。我相信我解决了这个问题,我计算了第一个log(total+1)/log(max+1),其中total是段上的总数,max是max(total_I),它给出了段的长度。然后,为了绘制线段的内部部分,即子线段,我应用了您在这里给出的解决方案@cdarwin,对不起,我不认为我从您的评论中理解了您试图解决的问题是什么,以及对数刻度与它的关系。没问题,现在绘制线段:-)。对数缩放用于表示不同数量级的值我必须将事件绘制为直方图,我有[1,1],[2]等事件,它们必须生成两个段,第一个由两个子段组成,第二个由一个段组成。两段的长度必须相等。这就是我的意思。我相信我解决了这个问题,我计算了第一个log(total+1)/log(max+1),其中total是段上的总数,max是max(total_I),它给出了段的长度。然后,为了绘制线段的内部部分,即子线段,我应用了您在这里给出的解决方案@cdarwin,对不起,我不认为我从您的评论中理解了您试图解决的问题是什么,以及对数刻度与它的关系。没问题,现在绘制线段:-)。对数缩放用于表示可以相差一个数量级的值