変数を0から1の間の数として表現したい。変数は固有の境界のない非負の整数です。0から0にマッピングしますが、1または0から1の間の数値に何をマッピングできますか?
その変数の履歴を使用して制限を提供できます。これは、最大値が増加した場合、古い統計を再度説明する必要があることを意味します。これを行う必要がありますか、または他に知っておくべきトリックがありますか?
変数を0から1の間の数として表現したい。変数は固有の境界のない非負の整数です。0から0にマッピングしますが、1または0から1の間の数値に何をマッピングできますか?
その変数の履歴を使用して制限を提供できます。これは、最大値が増加した場合、古い統計を再度説明する必要があることを意味します。これを行う必要がありますか、または他に知っておくべきトリックがありますか?
回答:
これを行うための非常に一般的なトリック(コネクショニストモデリングなど)は、双曲線正接タンを「押しつぶす関数」として使用することです。これにより、すべての数値が-1〜1の間隔に自動的に適合します。 0〜1にr
し、matlab
あなたはそれを経由して取得しますtanh()
。
もう1つのスカッシュ関数は、によって提供されるロジスティック関数(名前はSimonに感謝)です。 5)。したがって、結果を2で乗算し、1を減算して、データを0と1の間の間隔に合わせる必要があります。
以下に、両方の関数(赤のタン、青のロジスティック)をプロットする簡単なRコードを示します。
x <- seq(0,20,0.001)
plot(x,tanh(x),pch=".", col="red", ylab="y")
points(x,(1 / (1 + exp(-x)))*2-1, pch=".",col="blue")
多くの場合のように、私の最初の質問は「になる予定だった、なぜあなたはこれを行うにはしたくない」、そして、私はあなたが質問に対するコメントでこれを既に回答しました見ました: " 私は多くの異なる次元間でコンテンツを測定していると私はなりたいです特定のコンテンツの関連性の観点から比較を行うことができます。さらに、説明可能で理解しやすいこれらのディメンション全体の値を表示したいです。」
これを達成するために最大値が1で最小値がゼロになるようにデータを正規化する理由はありません。私の意見では、これは一般に悪い考えだと思います。最大値または最小値は、人口分布を代表しない外れ値になる可能性が非常に高くなります。@osknows は、zスコアの使用に関する別れの発言がはるかに良いアイデアです。スコア(別名標準スコア)は、範囲ではなく標準偏差を使用して各変数を正規化します。標準偏差は、外れ値の影響をあまり受けません。zを使用するには-スコア、各変数はほぼ正規分布を持っているか、少なくともほぼ対称分布を持っていることが望ましい(つまり、厳密に歪んでいない)が、必要に応じてこれを達成するために適切なデータ変換を最初に適用できます。どの変換を使用するかは、最適なBox-Cox変換を見つけることで決定できます。
mad()
rank()
ecdf()
ecdf(x)
HenrikとSimon Byrneによる優れた提案に加えて、f(x)= x /(x + 1)を使用できます。比較として、xが大きくなると、ロジスティック関数は違いを誇張します。つまり、f(x)とf(x + 1)の差は、f(x)= x /(x + 1)よりもロジスティック関数の方が大きくなります。その効果が必要な場合とそうでない場合があります。
私の以前の投稿には、0〜1の間にランク付けする方法があります。分類子の入力相関に関するアドバイス
ただし、私が使用したランキングでは、Tmin / Tmaxはサンプルの最小/最大を使用しますが、母集団の最小/最大の方が適切な場合があります。また、zスコアを調べる
これを実装するには、よく使用する2つの方法があります。私は常にリアルタイムのデータを使用しているため、これは継続的な入力を前提としています。擬似コードは次のとおりです。
訓練可能な最小値を使用する:
define function peak:
// keeps the highest value it has received
define function trough:
// keeps the lowest value it has received
define function calibrate:
// toggles whether peak() and trough() are receiving values or not
define function scale:
// maps input range [trough.value() to peak.value()] to [0.0 to 1.0]
この機能を使用するには、初期トレーニングフェーズ(を使用calibrate()
)を実行するか、特定の間隔または特定の条件に従って再トレーニングする必要があります。たとえば、次のような関数を想像してください。
define function outBounds (val, thresh):
if val > (thresh*peak.value()) || val < (trough.value() / thresh):
calibrate()
通常、ピークとトラフは
outBounds()
値を受け取りませんが、現在のピークの1.5倍を超える値、または現在のトラフを1.5で割った値より小さい値を受け取るcalibrate()
と、関数が自動的に再キャリブレーションできるようになります。
履歴の最小値を使用する:
var arrayLength = 1000
var histArray[arrayLength]
define historyArray(f):
histArray.pushFront(f) //adds f to the beginning of the array
define max(array):
// finds maximum element in histArray[]
return max
define min(array):
// finds minimum element in histArray[]
return min
define function scale:
// maps input range [min(histArray) to max(histArray)] to [0.0 to 1.0]
main()
historyArray(histArray)
scale(min(histArray), max(histArray), histArray[0])
// histArray[0] is the current element