スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ActionScript 3.0] 最小二乗法

2008-01-18 | 20:56

最小二乗法で、データを直線に近似するデモ。
赤い点がプロットされたデータのつもりです。マウスドラッグで移動できます。 移動するごとに近似し直しています。

近似部分のプログラムはここのものをほぼそのまま流用しました。
package{
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        import flash.utils.*;
        import flash.filters.DropShadowFilter;
        
        [SWF(width="400", height="200",backgroundColor="0xffffff")]
        
        public class Algo2 extends Sprite{
                private var balls:Array = [];
                private var RADIUS:int = 6;
                private var line:Line = new Line(0xff, 4);
                public function Algo2(){
                        
                        var points:Array = [{x:0,y:20}, {x:40,y:38}, {x:80,y:64}, {x:120,y:86},
                                                                               {x:160, y:96}, {x:200, y:122} , {x:120, y:36}, {x:220, y:102} ,
                                                                               {x:240,y:144}];
                        for(var i:int = 0 ; i < points.length ; i++){
                                var b:Ball = new Ball(0xff0000, RADIUS);
                                balls.push(b);
                                addChild(b);
                                b.x = points[i].x;
                                b.y = points[i].y;
                                
                                b.addEventListener( MouseEvent.MOUSE_DOWN, pickup );
                                b.addEventListener( MouseEvent.MOUSE_UP, place );
                                b.addEventListener( MouseEvent.MOUSE_MOVE, function(e:*):void{
                                        cal();
                                });
                        }
                        
                        addChild(line);
                        
                        cal();
                }
                
                public function pickup( event:MouseEvent ):void {
                        // ドラッグ処理を開始して、影フィルターをつける
                        event.target.startDrag( );
                        event.target.filters = [ new DropShadowFilter( ) ];
                        // 最前面に表示されるようにする
                        setChildIndex( DisplayObject( event.target ), numChildren - 1 );
                }
                
                public function place( event:MouseEvent ):void {
                        // ドラッグ処理を終了して影フィルターをオフ
                        event.target.stopDrag( );
                        event.target.filters = null;
                        
                        cal();
                }
                
                private function cal() :void{
                        
                        var a:Number = 0;
                        var b:Number = 0;
                        var sum_xy:Number = 0, sum_x:Number = 0, sum_y:Number = 0, sum_x2:Number = 0;
                        
                        for each(var ball:Ball in balls) {
                                sum_xy += ball.x * ball.y;
                                sum_x += ball.x;
                                sum_y += ball.y;
                                sum_x2 += ball.x * ball.x;
                        }
                        
                        a = ( balls.length * sum_xy - sum_x * sum_y) / (balls.length * sum_x2 - sum_x*sum_x);
                        b = (sum_x2 * sum_y - sum_xy * sum_x) / (balls.length * sum_x2 - sum_x*sum_x);
                        
                        line.x = 0;
                        line.y = b;
                        line.rotation = Math.atan(a) / Math.PI * 180;
                }
        }
}

import flash.display.*;

internal class Ball extends Sprite{
        public function Ball(color:int, radius:int){
                graphics.beginFill(color);
                graphics.drawCircle(0,0,radius);
                graphics.endFill();
        }
}
internal class Line extends Sprite{
        public function Line(color:int, w:int){
                graphics.lineStyle(w, color, 0.5);
                graphics.moveTo(0,0);
                graphics.lineTo(400, 0);
        }
}

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。