如何将非常大的算法盟友正确规范化为相对较小的数字范围?
How do I properly normalize very large numbers algorithmic ally to a relatively small range of numbers?
我正在尝试找到一种方法来根据从 excel 导入的自定义用户数据调整音高。
self.changePitch(30 + (parseInt(self.infoCollection.collection[j].array[i])-200/(3600)));
以上代码适用于 "normal values" 最多约 5,000。但是,我想将它们归一化以始终落在最小和最大频率之间。 (200 和 3800)
我试过使用此处找到的公式:
https://stats.stackexchange.com/questions/70801/how-to-normalize-data-to-0-1-range
其中说使用 (x-minval)/(maxval-minval)
但是,这并不适用于所有情况。使用非常大的数字时。 IE 5000万还是会超过最大频率
我正在尝试找到一种方法,将数亿以内的任何有理数归一化。
编辑: 抱歉造成混淆。我正在制作一个根据放置在图表上的数据播放声音的应用程序。目的是让有视觉障碍的用户使用声音更好地理解数据以获得彼此相关的值。我的问题是人类无法听到高于某个数字的频率,因此如果值超过 5000 左右,应用程序将不会播放该数字的任何声音。
示例:
A 公司的利润为 200 美元,B 公司为 5000 万美元。用户会听到公司 A 的声音,但不会听到公司 B 的声音,因为频率超出了人类的听力范围。
下面的函数将执行线性归一化(感谢) ,您可以将需要的值传递给它。
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% 归一化为非常接近的值,您将无法听到差异。
如果你有像这样严重偏斜的分布,你会想要丢弃离群值,或使用非线性归一化(例如,对数)。这实际上取决于数据以及您想要突出显示的差异。
我正在尝试找到一种方法来根据从 excel 导入的自定义用户数据调整音高。
self.changePitch(30 + (parseInt(self.infoCollection.collection[j].array[i])-200/(3600)));
以上代码适用于 "normal values" 最多约 5,000。但是,我想将它们归一化以始终落在最小和最大频率之间。 (200 和 3800)
我试过使用此处找到的公式:
https://stats.stackexchange.com/questions/70801/how-to-normalize-data-to-0-1-range
其中说使用 (x-minval)/(maxval-minval)
但是,这并不适用于所有情况。使用非常大的数字时。 IE 5000万还是会超过最大频率
我正在尝试找到一种方法,将数亿以内的任何有理数归一化。
编辑: 抱歉造成混淆。我正在制作一个根据放置在图表上的数据播放声音的应用程序。目的是让有视觉障碍的用户使用声音更好地理解数据以获得彼此相关的值。我的问题是人类无法听到高于某个数字的频率,因此如果值超过 5000 左右,应用程序将不会播放该数字的任何声音。
示例: A 公司的利润为 200 美元,B 公司为 5000 万美元。用户会听到公司 A 的声音,但不会听到公司 B 的声音,因为频率超出了人类的听力范围。
下面的函数将执行线性归一化(感谢
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% 归一化为非常接近的值,您将无法听到差异。
如果你有像这样严重偏斜的分布,你会想要丢弃离群值,或使用非线性归一化(例如,对数)。这实际上取决于数据以及您想要突出显示的差异。