2017-03-02 83 views
2

我正在研究一个程序,该程序从图中读取数据,并以经过标准化的特定频率播放数值,以显示数据点之间的差异。如何使用对数刻度偏移标准化?

在测试中,我发现对于不太高或太低而不能使用的频率范围,“可接受的”声音范围介于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如此接近以至于你听不到区别。

+1

我不太擅于用数学来表达我的想法,但是如何取代“正常”规范化,您将以10为底数。所以1会是1,10会是2,100会是3,依此类推?我认为这会进一步减少数量。 –

+0

问题在于,我确实需要足够大的差别让用户知道数字何时高于下一个数字。从1到2的频率变化不会被大多数人听到。以日志库10为解决方案的一部分,但不是全部。 – Remixt

回答

1

试试这个:

function normalize(enteredValue, minEntry, maxEntry, normalizedMin, normalizedMax) { 

var mx = (Math.log((enteredValue-minEntry))/(Math.log(maxEntry-minEntry))); 
var preshiftNormalized = mx*(normalizedMax-normalizedMin); 
var shiftedNormalized = preshiftNormalized + normalizedMin; 

return shiftedNormalized; 

} 

这甚至应该进行分配。

随着你给了相同的参数,这里有新的价值观:

1:200

20000:1920.4119982655923

五千万:3279.588001734408

1十亿= 3800

这是使用log10。对于或多或少的对数效应,使用不同的基数,如log2或log16。

+0

请在原始帖子中查看我的编辑。我认为这是一个部分解决方案,但它会导致数量较小的问题。 – Remixt

+0

10和10亿中的1个非常接近,以至于用户不应该听到差异。除非你正在寻找别的东西?如果您需要更高分辨率,请使用较小的最大输入。 –

+0

所以问题是我不知道用户会看到什么数据。所以它需要与他们所需要的相关。如果数据从1到10,我仍然希望他们听到一个转变(非常轻微,但仍然存在),然后将极端转变从10转换为20,000。 – Remixt