2014-01-15 81 views
0

如何標準化0到100之間的任何給定數字?簡單的數學公式驗證(標準化0-100)

最小值爲0,最大值沒有界限(這是關鍵字的搜索量)。

normalized = (x-min(x))/(max(x)-min(x))不起作用,因爲我沒有定義最大值。

+0

您可以使用非線性映射,其中'min - > 0'和'INF - > 100' - 可以爲您的應用程序工作嗎? –

+4

200/pi * atan(x) – Henrik

+0

@Henrik我喜歡你的配方。我做了一個試驗的情況下具有以下數字: 129166 = 99.9(99)50713053562 3933 = 99.9(83)8133801513 6491 = 99.9(90)19226979924 440 = 99.9(55)31393721305 15525 = 99.9(95)89938955565 77766 = 99.9(99)1813648994 我基本上調整了數字,並提取了從索引位置4開始到索引位置6結束的數字。這給了我最準確的結果。但我注意到的是,所有更高的數字都接近99,我可以明白爲什麼想,我可能需要檢查索引5到7,但這是我想避免的。 – user1275645

回答

0

弓tangens

代數,則可能是一些功能有極,例如啓動tan,並使用其逆,atan。該反轉將永遠不會超過給定的限制,即在這種情況下爲π/ 2。然後你可以用那種

f(x) = 100 * 2/π * atan(x - min) 

的公式。如果不產生對小投入「好」的結果,您可能需要預處理輸入:

f(x) = 100 * 2/π * atan(a*(x - min)) 

一些適當選擇a 。使a大於1會增加值,而對0 < a < 1則會得到更小的值。根據評論,後者是你最想要的。

你甚至可以在裏面添加電源:

f(x) = 100 * 2/π * atan(a*(x - min)^b) = 100 * 2/π * atan(pow(a*(x - min), b)) 

一些積極的參數b。有兩個參數來調整,讓您更自由地調整功能,以滿足您的需求。但是,要決定什麼是合適的,你可能必須決定對於各種輸入你期望什麼值。有點像this question,雖然那裏的輸入範圍並不是無界的。

極投影

如果你喜歡幾何的方法:你能想象你的輸入作爲X軸的正半,即從(0,0)的一縷(∞,0)。然後想象一箇中心(0,1)和半徑1坐在那條線上的圓。如果將點(0,2)連接到射線上的任意點,連線將與另一點中的圓相交。這樣你可以將光線映射到圓圈的右半邊。現在取圓形中心的角度,圓上點的座標或任何其他有限值,正確地對輸入和輸出進行歸一化,並且您的函數符合您的要求。你也可以爲此制定一個公式,並且atan可能會在這方面發揮作用。

+0

謝謝,我用這個: 100 * 2/Math.PI * atan(Math.pow(0.0001 *(kp.getSearch_volume()),1)) 然後我修剪從0開始到5結束。這給了我我正在尋找的東西,謝謝。 – user1275645

+0

@ user1275645:'Math.pow(x,1)== x'使得調用是多餘的。所以你基本上說你在小數點後修整爲兩位數,我寧願寫成'Math.round(20000/Math.PI * atan(0.0001 * kp.getSearch_volume()))/ 100'。這樣可以確保你不會因意外數字的數字而遇到奇怪的行爲;您將始終獲得相同的小數位數。當然,你也可以使用'printf'或'NumberFormat'或類似的東西打印一個給定小數位數的值。 – MvG