我正在尝试根据从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-to-0-1-range
哪个说使用(x-minval)/(maxval-minval)
但是,这并不适用于所有情况。使用非常大的数字时。 IE 5000万还会超过最高频率。
我正试图找到一种方法,将任何有理数的数字标准化到数亿。
编辑:对不起,请注意。我正在创建一个基于图表上的数据播放声音的应用程序。目的是允许具有视觉障碍的用户使用声音更好地理解数据以获得彼此相对的值。我的问题是人类无法听到超过一定数量的频率,所以如果有超过5000左右的值,应用程序将不会播放该数字的任何声音。
实施例: A公司的利润为200美元,B公司的利润为5000万美元。用户会听到公司A的声音,但不会听到公司B的声音,因为频率超出人类听觉范围。
答案 0 :(得分:5)
以下功能将执行线性标准化(感谢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
答案 1 :(得分:4)
规范化此数据的正确方法将取决于数据集中值的分布。
例如,如果99%的值在0-1000范围内,剩下的1%在10000000左右,则线性标准化(如在Santi的回答中)绝对会将您的数据输入期望的范围,但它也将99%标准化为非常接近的值,您将无法听到差异。
如果您的分布严重偏差,那么您将要么丢弃异常值,要么使用非线性归一化(例如,对数)。这实际上取决于数据以及您要强调的差异。