2017-03-02 62 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