Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Normalizing a random unending unknown series?

I have an unending series with no equation, and is random, something like this,

   X = 1, 456, 555, 556, 557, 789 ... 

Note that I'm getting this list as a stream, and I do not know future values, and I do not know min and max of X.

How do I find out the inverted normal N(X) for any x in X, such that,

N(x) --> 0 if x --> inf

N(x) --> 1 if x --> 0

Read that as, the greater the x is the closer it should be to 0, the smaller the x is the closer it should be to 1.

How can I achieve such a transformation?

I tried the following:

#python
def invnorm(x):
    denom = 1 + math.exp(-x)
    return 2 - (2/denom)

invnorm(200)
Out[8]: 0.0

invnorm(20)
Out[9]: 4.1223073843355e-09

invnorm(2)
Out[10]: 0.23840584404423537

invnorm(1)
Out[11]: 0.5378828427399902

Somehow that doesn't give a satisfactory result as my range goes on to a large number, and 200 itself gives 0 and my range will be skewed towards 0.

like image 641
ComputerFellow Avatar asked Jan 22 '14 07:01

ComputerFellow


1 Answers

OK, so you're basically looking for a continuous monotone function N: [0,∞) → (0,1] such that:

  • limx → 0N(x) = 1, and
  • limx → ∞N(x) = 0.

In that case, the "obvious" choice would be N(x) = 1 / (x + 1), or, in Python:

def invnorm (x):
    return 1.0 / (x + 1)

Of course, there are also infinitely many other functions that satisfy these criteria, like N(x) = 1 / (x + 1)a for any positive real number a.

Yet another "natural" choice would be N(x) = ex, or, in Python:

def invnorm (x):
    return math.exp(-x)

This can also be rescaled to N(x) = bx for any real number b > 1 while still satisfying your requirements.

And of course, if we relax the monotonicity requirement (which I just assumed, even though you did not state it explicitly), even weirder functions like Abhishek Bansal's N(x) = sin(x) / x will qualify.

like image 140
Ilmari Karonen Avatar answered Oct 06 '22 02:10

Ilmari Karonen