我正在研究一个程序,该程序从图中读取数据,并以经过标准化的特定频率播放数值,以显示数据点之间的差异。如何使用对数刻度偏移标准化?
在测试中,我发现对于不太高或太低而不能使用的频率范围,“可接受的”声音范围介于200和〜3800之间。这意味着我需要将所有数据转换为数字范围。根据这些指导方针,这是一个解决方案。
function normalize(enteredValue, minEntry, maxEntry, normalizedMin, normalizedMax) {
var mx = (enteredValue-minEntry)/(maxEntry-minEntry);
var preshiftNormalized = mx*(normalizedMax-normalizedMin);
var shiftedNormalized = preshiftNormalized + normalizedMin;
return shiftedNormalized;
}
这是有效的,但它对某些情况提出了一个小问题。如果用户在同一数据集中具有非常小的值和非常大的值。
简单的例子:A公司的利润为1美元,B公司的利润为10亿美元,如果C公司和D公司等公司的利润远离边缘案例,则不存在问题。但是,假设C公司的利润为5000万美元。这大大超过1美元,远低于10亿美元,并不会成为太大的问题。但是,如果D有2万美元的利润,那么我们可能会遇到问题。
归一化后的数字将是本(使用3800作为max和200作为分):
1 = 200.0000036
20000 = 200.072
50000000 = 380
10亿= 3800
在这里我们可以看到明显的问题。如果我们使用上面的函数来将声音规范化到所需的频率范围,那么具有巨大数据差异的大型数据集可能会歪曲图形上表示内容的感知。由于规范化将大数据压缩到更小的数字范围,只有当最大和最小数字相距很远时,这才成为问题。
两种可能的解决方案:
设置,用户可以在数据集的最大数量。这是一个简单的解决方法,但它会限制程序的功能,因为 它会自动解析csv文件中的数据,因为 上的任何内容都只会播放最高的频率。
第二种解决方案很复杂,我不知道该怎么做,这是我希望能够从你或某人身上闪现的指向 me的正确方向。我认为使用某种对数 缩放比较大的数据不太重要将是一个很好的解决方案。我的意思是这样的曲线在这里:
原谅我差的油漆绘画技巧,但你可以明白我的意思。随着数字越来越大,他们的意义越来越小。这不是数字如何相互作用的结果,但我认为人类对大数字的感知已经很模糊,所以最好让大数字比小数字更接近。 (如1和20,000)。
您认为如何?
编辑: 我认为其中一个提到采取日志基数为10的评论是正确的,但它不适用于较小的数据点,因为数字会太接近。 IE日志1是1并且日志10是2. 1和2如此接近以至于你听不到区别。
我不太擅于用数学来表达我的想法,但是如何取代“正常”规范化,您将以10为底数。所以1会是1,10会是2,100会是3,依此类推?我认为这会进一步减少数量。 –
问题在于,我确实需要足够大的差别让用户知道数字何时高于下一个数字。从1到2的频率变化不会被大多数人听到。以日志库10为解决方案的一部分,但不是全部。 – Remixt