我如何将非常大的数字算法盟友适当地归一化为相对较小的数字



我正在尝试根据从Excel导入的自定义用户数据来调整音调的方法。

self.changePitch(30 + (parseInt(self.infoCollection.collection[j].array[i])-200/(3600)));

上面的代码适用于大约5,000的"正常值"。但是,我想将它们归一化,以始终介于最低和最大频率之间。(200和3800)

我尝试使用此处找到的方程式:https://stats.stackexchange.com/questions/70801/how-to-normalize-data-data-to-0-1 range说使用(x-minval)/(maxval-minval)但是,这对所有情况都不起作用。使用非常大的数字。即5000万,它仍将超过最大频率。

我试图找到一种方法,即将所有理性数字都归一数到亿美元。

编辑:对不起。我正在制作一个基于图表上的数据播放声音的应用。目的是允许具有视觉障碍的用户使用声音更好地理解数据,以获取相对的值。我的问题是人类无法听到一定数量以上的频率,因此,如果有5000左右的值,该应用程序将不会为该数字播放任何声音。

示例:A公司的利润为200美元,B公司为5000万美元。用户会听到A公司的声音,但不会听到B公司的声音,因为频率将超出人类的听力范围。

以下功能将执行线性归一化(感谢S mcCrohan),您可以将其传递给它。

https://jsfiddle.net/7cn57wnd/

function normalize(enteredValue, minEntry, maxEntry, normalizedMin, normalizedMax) {
    var mx = (enteredValue-minEntry)/(maxEntry-minEntry);
    var preshiftNormalized = mx*(normalizedMax-normalizedMin);
    var shiftedNormalized = preshiftNormalized + normalizedMin;
    return shiftedNormalized;
}
//Acceptable values: 0 - 10,000,000
//User enters: 99,000,000
//Normalization window: 200 - 3800
normalize(99000000, 0, 100000000, 200, 3800);
//Returns 3764

归一化数据的正确方法将在很大程度上取决于数据集中的值分布。

例如,如果您的99%的值在0-1000范围内,而其余1%的离群值则在10000000左右,则线性归一化(如Santi的答案中)绝对会将您的数据拉到所需的范围中,但是,也将有99%的归一化为如此亲密的值,您将无法听到差异。

如果您有这样的偏斜分布,则您将要丢弃异常值,或使用非线性归一化(例如,对数)。这确实取决于数据以及您要突出的差异。

最新更新