2017-02-28 1 views
0

私は、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) を使用すると言う、これはすべてのケースでは動作しません。非常に大きな数字を使用する場合。 IE5000万も、それでも最大周波数を超えます。

私は何億もの有理数を正規化する方法を見つけようとしています。

編集:ご迷惑をおかけして申し訳ありません。グラフ上に置かれたデータに基づいてサウンドを再生するアプリを作っています。この目的は、視覚障害を持つユーザーが音を使用してデータをよりよく理解し、相互に関連する値を取得できるようにすることです。私の問題は、人間が特定の数を超える周波数を聞くことができないため、5000以上の値があると、その番号のサウンドは再生されません。

例: A社の利益は200ドル、B社は50百万ドルでした。周波数は人間の聴覚範囲外にあるため、ユーザーはA社の音は聞こえますがB社の音は聞こえません。

+0

シンプレックスの計算式が機能しない例を挙げることができますか?それは数学的に正確です。 – Pointy

+1

50,000,000/3800> 3800 – Remixt

+0

入力値の可能な範囲に入力値がどこにあるのかを判断し、それをターゲットドメインにマップする必要があります。 – Pointy

答えて

3

以下の関数は線形正規化(ありがとう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 
+0

これはとてもうまく動作します! – Remixt

2

このデータを正規化するための正しい方法は、データセット内の値の分布に多くを依存する予定です。

例えば、値の99%が0-1000の範囲にあり、残りの1%が10000000の範囲外の値である場合、線形正規化(Santiの答えのように)によってデータが望ましい範囲に完全に引き込まれますしかし、99%が非常に近い値に正規化されていると、その違いを聞くことができなくなります。

このような分布が非常に偏っている場合は、異常値を破棄したり、非線形正規化(対数など)を使用する必要があります。それは本当にデータと、どのような違いを強調したいのかによって異なります。

+0

私は対数的な解が良いと思います。私は、正規化のためのアルゴリズムがなくてもほとんどのケースで既に機能しているので、より多くのユースケースを扱うための改善を図っています。 – Remixt

関連する問題