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)
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,对不起,我不认为我从您的评论中理解了您试图解决的问题是什么,以及对数刻度与它的关系。没问题,现在绘制线段:-)。对数缩放用于表示可以相差一个数量级的值