無制限の変数を0から1の間の数で表す方法


28

変数を0から1の間の数として表現したい。変数は固有の境界のない非負の整数です。0から0にマッピングしますが、1または0から1の間の数値に何をマッピングできますか?

その変数の履歴を使用して制限を提供できます。これは、最大値が増加した場合、古い統計を再度説明する必要があることを意味します。これを行う必要がありますか、または他に知っておくべきトリックがありますか?


6
非減少関数がトリックを行うため、柔軟性が非常に高くなります。ただし、アプリケーションによっては、他の方法よりも優れている方法もあります。そのような再表現を求めるあなたの目的は何ですか?[0,)[0,1]
whuber

1
私は多くの異なる次元でコンテンツを測定していますが、特定のコンテンツがどれだけ関連性があるかという点で比較できるようにしたいと思っています。さらに、これらのディメンション全体で、わかりやすく理解しやすい値を表示したいと思います。
スペンサー

1
@Spencer正確にどのようにコンテンツと「関連性」を測定していますか?たとえば、任意のスケールで、カウント、割合、ビューの頻度、他のコンテンツとの相関などなど。さまざまな種類の測定値は、さまざまな種類の再表現の恩恵を受けます。
whuber

1
私はそれらを任意の尺度で測定しています。コンテンツの古さ。コンテンツが受信される「ポイント」の数。コンテンツのドメインにおける自己申告の「関心」。
スペンサー

2
使用できる最も簡単な変換の1つは、データを変位値スコアに変換することです。
charles.y.zheng

回答:


34

これを行うための非常に一般的なトリック(コネクショニストモデリングなど)は、双曲線正接タンを「押しつぶす関数」として使用することです。これにより、すべての数値が-1〜1の間隔に自動的に適合します。 0〜1にrし、matlabあなたはそれを経由して取得しますtanh()

もう1つのスカッシュ関数は、によって提供されるロジスティック関数(名前はSimonに感謝)です。 5)。したがって、結果を2で乗算し、1を減算して、データを0と1の間の間隔に合わせる必要があります。f(x)=1/(1+ex)

以下に、両方の関数(赤のタン、青のロジスティック)をプロットする簡単な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になるため、次に行う必要があるのは、この情報をスケーリングして、その範囲に基づいて行うことができる興味深い範囲に集中することです。ただ限界に達した。
ラッセルギャロップ

25

多くの場合のように、私の最初の質問は「になる予定だった、なぜあなたはこれを行うにはしたくない」、そして、私はあなたが質問に対するコメントでこれを既に回答しました見ました: " 私は多くの異なる次元間でコンテンツを測定していると私はなりたいです特定のコンテンツの関連性の観点から比較を行うことができます。さらに、説明可能で理解しやすいこれらのディメンション全体の値を表示したいです。

これを達成するために最大値が1で最小値がゼロになるようにデータを正規化する理由はありません。私の意見では、これは一般に悪い考えだと思います。最大値または最小値は、人口分布を代表しない外れ値になる可能性が非常に高くなります。@osknows は、zスコアの使用zに関する別れの発言がはるかに良いアイデアです。スコア(別名標準スコア)は、範囲ではなく標準偏差を使用して各変数を正規化します。標準偏差は、外れ値の影響をあまり受けません。zを使用するにはzz-スコア、各変数はほぼ正規分布を持っているか、少なくともほぼ対称分布を持っていることが望ましい(つまり、厳密に歪んでいない)が、必要に応じてこれを達成するために適切なデータ変換を最初に適用できます。どの変換を使用するかは、最適なBox-Cox変換を見つけることで決定できます。


これにデータを強制的にとは何の関係もありません著者が実際にそれを探している場合、一般的に私は標準化に同意します:)議論が現れる前に、私が答えたので、おそらくこの1つが私の答えを削除します正しい:)[0,1]
ドミトリーチェロフ

1
mad()rank()ecdf()ecdf(x)ppx1/nx1
カールオベハフハンマー

10

すべてのシグモイド関数が機能します:


erfは非常に便利な関数ではありませんが、派生関数として使用したくない場合に限ります。

最終的に、いくつかの小さな調整で単純なロジスティック関数を使用しました:(1 /(1 + java.lang.Math.exp(-1 *(factor * i)))-0.5)* 2. 0.05の係数を選びました。 0から数百のiでうまく機能するようです。
ジルヴァングルプ

1.0 /(1.0 + EXP(-1.69897 *(X-平均(X))/ SD(x)は))pnormに近い近似である
クリス・

3

HenrikとSimon Byrneによる優れた提案に加えて、f(x)= x /(x + 1)を使用できます。比較として、xが大きくなると、ロジスティック関数は違いを誇張します。つまり、f(x)とf(x + 1)の差は、f(x)= x /(x + 1)よりもロジスティック関数の方が大きくなります。その効果が必要な場合とそうでない場合があります。


1

私の以前の投稿には、0〜1の間にランク付けする方法があります。分類子の入力相関に関するアドバイス

ただし、私が使用したランキングでは、Tmin / Tmaxはサンプルの最小/最大を使用しますが、母集団の最小/最大の方が適切な場合があります。また、zスコアを調べる


1

pnormを示唆する他の回答に追加するには...

パラメーターを選択するための潜在的に最適な方法については、pnormのこの近似をお勧めします。

1.0/(1.0+exp(-1.69897*(x-mean(x))/sd(x)))

pnormish

これは本質的にSoftmax Normalizationです。

ピンチの基準 Pnorm


1

これを実装するには、よく使用する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

これはすべて、Max / MSP / Jitterで、最初の例では[peak]および[trough]オブジェクトを、2番目の例では[jit.3m]を使用して実装できます。
テラス

0

非常に簡単なオプションは、データ内の各数値をデータ内の最大の数値で除算することです。多くの小さな数字といくつかの非常に大きな数字がある場合、これは情報をうまく伝えない可能性があります。しかし、それは比較的簡単です。このようなデータをグラフ化するときに意味のある情報が失われると思う場合は、他の人が提案したより洗練された手法のいずれかを試すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.