GaussianDistribution

by aobyrne
♥0 | Line 142 | Modified 2012-04-13 17:25:42 | MIT License
play

ActionScript3 source code

/**
 * Copyright aobyrne ( http://wonderfl.net/user/aobyrne )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/3djL
 */

package  
{
    import flash.display.Sprite;
    
    public class GaussianDistributionClient extends Sprite 
    {
        
        public function GaussianDistributionClient() 
        {
            var mu:Number = 0;
            var sigma:Number = 1;
            var cx:Number = 0;
            var cy:Number = 0;
            
            graphics.lineStyle(9);
            drawGaussian(mu, sigma, cx, cy);
            graphics.lineStyle(2,255);
            drawGaussian(mu, 0.5, cx, cy);
            graphics.lineStyle(2,0xff7f00);
            drawGaussian(-2.5, sigma, cx, cy);
            graphics.lineStyle(5,0xff0000);
            draw();
            graphics.lineStyle(5,0x00ff00);
            drawNormalized(2.5,sigma,cx,cy);
        }
        
        private function draw():void 
        {
            var mu:Number = 0;
            var sigma:Number = 1;
            var cy:Number=0;
            var cx:Number=0;
            var gd:Number;
            var xx:Number;
            var nn:Number;
            var number:int = 100;
            var nInv:Number = 1 / number;
            var size:Number = 10;
            
            //units per pixel  Y axis
            var uppY:Number = 200;
            //pixels per unit X axis
            var ppuX:int = 2;
            var plotHeight:Number = 200;
            
            for (var i:int = 0; i <= number; i++) 
            {
                nn = i * nInv;
                xx = (nn - 0.5)*size;
                gd = GaussianDistribution.getValue(xx, mu, sigma);
                graphics.lineTo(cx + i * ppuX, cy + plotHeight - gd * uppY);
            }
        }
        private function drawNormalized(mu:Number, sigma:Number, cx:Number, cy:Number):void 
        {
            var gd:Number;
            var xx:Number;
            var nn:Number;
            var number:int = 100;
            var nInv:Number = 1 / number;
            var size:Number = 10;
            
            //units per pixel  Y axis
            var uppY:Number = 200;
            //pixels per unit X axis
            var ppuX:int = 2;
            var plotHeight:Number = 200;
            
            for (var i:int = 0; i <= number; i++) 
            {
                nn = i * nInv;
                xx = (nn - 0.5)*size;
                gd = GaussianDistribution.getNormalizedValue(xx, mu, sigma);
                graphics.lineTo(cx + i * ppuX, cy + plotHeight - gd * uppY);
            }
        }
        
        private function drawGaussian(mu:Number, sigma:Number, cx:Number, cy:Number):void 
        {
            var g1:GaussianDistribution = new GaussianDistribution(mu, sigma);
            var data1:Array = g1.getData();
            var l:uint = data1.length;
            var valueAtZero:Number = GaussianDistribution.getValue(0, mu, sigma);
            var vazInv:Number = 1 / valueAtZero;
            trace( "valueAtZero : " + valueAtZero );
            trace( "vazInv : " + vazInv );
            //units per pixel  Y axis
            var uppY:Number = 200;
            //pixels per unit X axis
            var ppuX:int = 2;
            var plotHeight:Number = 200;
            graphics.moveTo(cx, cy + plotHeight);
            for (var i:int = 0; i < l; i++) 
            {
                graphics.lineTo(cx + i * ppuX, cy + plotHeight - data1[i] * uppY);
            }
            graphics.drawRect(cx, cy, ppuX*l, uppY);
        }
        
    }

}
class GaussianDistribution 
{
    private var mu:Number;
    private var _sigma:Number;
    private var factor:Number;
    
    public function GaussianDistribution(mu:Number, sigma:Number) 
    {
        this.sigma = sigma;
        this.mu = mu;
        
        
    }
    
    public function getData():Array 
    {
        var gaussian:Number;
        var pow:Number;
        var xx:Number;
        var normal:Number;
        var steps:int = 100;
        var delta:Number = 1 / steps;
        var data:Array = [];
        var initxx:Number = -5;
        var finalxx:Number = 5;
        var size:Number = 10;
        size = finalxx > initxx?finalxx - initxx:initxx - finalxx;
        for (var i:int = 0; i < steps; i++) 
        {
            normal = i * delta;
            xx = size * normal - size*0.5;
            pow = -(xx - mu) * (xx - mu)/(2*sigma*sigma);
            gaussian = factor * Math.pow(Math.E, pow);
            data[i] = gaussian;
        }
        return data;
    
    }
    
    public static function getNormalizedValue(xx:Number, mu:Number, sigma:Number):Number
    {
        return getValue(xx, mu, sigma) / getValue(mu, mu, sigma);
    }
    public static function getValue(xx:Number, mu:Number, sigma:Number):Number
    {
        var gaussian:Number;
        var pow:Number;
        var s:Number = 1 / sigma;
        var factor:Number  = s / Math.sqrt(2 * Math.PI);
        pow = -(xx - mu) * (xx - mu)*s*s*0.5;            
        gaussian = factor * Math.pow(Math.E, pow);
        return gaussian
    }
    
    public function get sigma():Number 
    {
        return _sigma;
    }
    
    public function set sigma(value:Number):void 
    {
        _sigma = value;
        factor = 1 /( sigma * Math.sqrt(2 * Math.PI));
    }
    
}