我正在研究一個程序,該程序從圖中讀取數據,並以經過標準化的特定頻率播放數值,以顯示數據點之間的差異。如何使用對數刻度偏移標準化?
在測試中,我發現對於不太高或太低而不能使用的頻率範圍,「可接受的」聲音範圍介於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