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

08.17
Fri
たとえばある測定されたデータがこんな以下のような感じであったとします

(x1 , y1) , (x2 , y2) , (x3 , y3) ...... (xi , yi)

よくある例でいうなら、人の身長と体重のデータの組み、みたいなものです

これらのデータをグラフに点として入れていったときに、

以下のような感じになったとします

least_sq.png


このような散布図を適当な関数(モデル)で近似するときにつかう手法が最小二乗法です

考え方としては、例えばこの散布図に対してある一次の関数が以下のようにある時

各点からその直線までの距離の和が最小になるような時、

その一次関数はこの散布図のいいかんじな近似になるはずです。

こんな感じ

least_sq_dotd.png

一次関数の形は

linearf.png

なので、aとbが求まればいいのです


i個の点があるとして、まず各点から直線までの距離は、

dis_linear.png

ここでyiが各点の値でyが求めるべき関数です。んで絶対値が面倒なので二乗して

dis-sq.png

この距離の和なのでシグマをつけて

sum-dis.png


f(xk) が axk + b なのでそれに置き換え二乗を展開して各項にシグマを分配すると

sumexp.png

ここで各シグマの式は計算すると定数になるはずなので

c1~c6に分かりやすいように置き換えて

(iはc6に置きました)

twovar.png

ということでこの二変数の関数を最小にする時のa,bが求まればいいというわけで

それが傾きと切片になります

funct.png


でこの関数を微分して傾きが0になるとこを調べます。

twodiff1.png


twodiff2.png


equ-2.png

これをa,bについてといて

slvans1.png


slvans2.png


最後に置き換えていた、c1~c6をもどして


realansa.png


realansb.png


これで一次式で散布図を近似するときの傾きと切片がでました


では試してみます

点はA(2,3)B(5,6)C(6,3)です

めんどい計算なので省きますが

a = 3/13
b = 3

になりました。グラフを書いてみると

linear_func.png

いいのかな....w

てきとなこーど
スポンサーサイト
comment 0 trackback 0
06.16
Sat
以前にPythonで書いた行列を計算するやつを書き直してみました

今度は行列式や逆行列をちょっとは求められるようになりました.

ただ、特殊なアルゴリズムは全く使わずリストの中身をいじくりまわして計算してるだけなので

非常に遅いです。行列式を計算するとこなんて、ちょっと次数の高い行列が与えられたらまともに計算できないと思います

計算量を多項式時間?に表す方法がいまいちわかんないんですが、多分計算量は階乗で増えてくと思います

ま、いちおうコードを.

#!/usr/bin/env python
#coding:utf-8

import math

class Matrix:

    #if flag is True , make elementary matrix in the [instance].e
    def __init__ ( self , matrixFactor , flag = True ):
        if ( isinstance( matrixFactor , str ) ): matrixFactor = self.transForm( matrixFactor )
        self.gyou = len( matrixFactor )
        self.retu = len( matrixFactor[ 0 ] )
        self.e = None
        for eachLine in matrixFactor:
            if ( self.retu != len( eachLine ) ): raise IOError
        self.matrix = matrixFactor
        if (( self.retu == self.gyou ) and ( flag == True )) :
            elementary_factor = []
            each_factor = []
            counter = 0
            for dummy in xrange( self.gyou ):
                for dummy2 in xrange( self.retu ):
                    if ( dummy2 == counter ) :
                        each_factor.append( 1 )
                    else:
                        each_factor.append( 0 )
                counter += 1
                elementary_factor.append( each_factor )
                each_factor = []
            self.e = Matrix( elementary_factor , False )


    def transForm( self , strdata ):
        result = []
        proc = []
        for eachRow in strdata.split( ";" ):
            for eachFactor in eachRow.split( "," ):
                proc.append( float( eachFactor ) )
            result.append( proc )
            proc = []
        return result

    #show format
    def printFormat( self ):
        print "%s Rows %s Columns  matrix" %( self.gyou , self.retu )


    #show matrix gui
    def printMatrix( self ):
        for each in self.matrix:
            for number in each:
                print str( number ) + "\t",
            print ""



    def getFactor( self , gyou , retu ):
        return self.matrix[ gyou - 1 ][ retu - 1 ]



    def getRow( self , row ):
        return self.matrix[ row - 1 ]


    def getColumn( self , column ):
        result = []
        for each in self.matrix : result.append( each[ column - 1 ] )
        return result


    def powMatrix( self , number):
        ins = Matrix( self.matrix )
        result = ins
        for dummy in xrange( number - 1 ):
            result = result.mult( ins )
        return result


    def timesMatrix( self , number ):
        result = []
        proc = []
        for each in self.matrix:
            for n in each:
                proc.append( n * number )
            result.append( proc )
            proc = []
        return Matrix(result)


    def multMatrix( self , matrix ):
        if ( self.retu != matrix.gyou ): raise IOError
        result =[]
        proc = []
        tmp = 0
        for each in self.matrix:
            for counter2 in xrange( matrix.retu ):
                r = matrix.getColumn( counter2 + 1 )
                for counter in xrange( self.retu ):
                    tmp += each[ counter ] * r[ counter ]
                proc.append( tmp )
                tmp = 0
            result.append( proc )
            proc = []
        return Matrix( result )

    #addMatrix
    def addMatrix( self , matrix  , flag = True):
        if ( ( self.gyou != matrix.gyou ) or ( self.retu != matrix.retu ) ): raise IOError
        new_matrix = []
        counter = 0
        for each in self.matrix:
            new_matrix.append( self.addList( each , matrix.matrix[ counter ] , flag ) )
            counter += 1
        return Matrix( new_matrix )


    #SubstractionMatrix
    def subsMatrix( self , matrix ):
        return self.addMatrix( matrix , flag = False )


    def compare( self , matrix ):
        if ( ( self.gyou != matrix.gyou ) or ( self.retu != matrix.retu ) ): return False
        counter = 0
        for each in self.matrix:
            target = matrix.matrix[ counter ]
            counter2 = 0
            for each2 in each:
                if ( each2 != target[ counter2 ] ) : return False
                counter2 += 1
            counter += 1
        return True

    def getRotatedPosition(self , angle):
        if ((self.gyou != 2) or (self.retu != 1)) : raise IOError
        rotatemat = Matrix([[math.cos(angle) , -math.sin(angle)] , [math.sin(angle) , math.cos(angle)]])
        return rotatemat.multMatrix(self)
		
    #get determinant
    def getDet( self ):
        if (self.retu != self.gyou) : raise IOError
        if (self.gyou == 1 and self.retu == 1) : return self.matrix[0][0]
        factorline = []
        signature = 1
        counter = 0
        dummy = ""
        for d in range(self.gyou-1):
		    for dd in range(self.gyou-1):dummy += "0,"
		    dummy = dummy.strip(",")
		    dummy += ";"
        dummy = dummy.strip(";")
        result = Matrix(dummy)
        result2 = 0
        for row1each in self.matrix[0]:
            for rowline in range(2 , self.gyou+1):
                tmp = self.matrix[rowline - 1]
                cp = tmp[:]
                del cp[counter]
                if rowline == 2:
					for suffix in range(len(cp)):
						cp[suffix] = cp[suffix] * signature * row1each
                factorline.append(cp)
            i = Matrix(factorline)
            factorline = []
            counter += 1
            signature *= -1
            if ((i.gyou != 1) and (i.retu != 1)):
                 result2 += i.getDet()
            else:
                 result2 += i.matrix[0][0]
        return result2
        
    def getTransposeMatrix(self):
        result = []
        for suffix in xrange(self.retu):
            result.append(self.getColumn(suffix+1))
        return Matrix(result)
        
    
	
    #this method is private. DON'T CALL WITH INSTANCE
    def addList( self , list1 , list2 , flag):
        result = []
        counter = 0
        for each in list1:
            if ( flag ):
                result.append( each + list2[ counter ] )
            else:
                result.append( each - list2[ counter ] )
            counter += 1
        return result

    
    def getCofactorMatrix(self , row , column):
        factor = []
        counter = 1
        for eachrow in self.matrix:
            if counter != row:
                cp = eachrow[:]  
                del cp[column-1]
                factor.append(cp)
            counter += 1
        return Matrix(factor)
        
    
    def getInverseMatrix(self):
        r = 1
        c = 1
        result = []
        tmp = []
        det = self.getDet()
        if det == 0 : raise IOError
        for d in self.matrix:
            if r % 2 == 0 :
                signature = -1
            else:
                signature = 1
            for dd in d:
                tmp.append(signature * (self.getCofactorMatrix(r , c).getDet()))
                c += 1
                signature *= -1
            result.append(tmp)
            tmp = []
            r +=1
            c = 1
        return Matrix(result).timesMatrix(1.0/det).getTransposeMatrix()


これを使って以下のような4元連立1次方程式を解いてみます

4eq.png

クラメールとかは使わないで、普通に逆行列を掛けました

#!/usr/bin/env python
#coding:utf-8

import Matrix



def main():
    #係数行列
    coefficient = [ [1,3,2,1] , [1,1,1,1] , [4,1,1,2] ,[1,2,-3,-1]]
    #定数行列
    const = [[30],[14],[21],[5]]
    #其々クラスからインスタンス作成
    i1 = Matrix.Matrix(coefficient)
    i2 = Matrix.Matrix(const)
    #係数行列の逆行列を求めて定数行列と掛け算。結果を表示
    i1.getInverseMatrix().multMatrix(i2).printMatrix()


if (__name__ == "__main__"): main()


結果: w = 1,x=7,y=2,z=4になってくれるかな
comment 0 trackback 0
04.16
Mon
お久しぶりです。

とうとう大学生になっちゃったmoratoriです。

大学生といったら、自由な時間がたくさんあって好きなことしまくれるのかなー

なんて思ってたら入学そうそうたくさんのタスクが山積みでちょっと挫けそうですw←

でもまぁー友達とかみんなが親切にしてくれるので総じて楽しい日々を送っています。

と、このへんにしといて、今日は画像を回転させる方法について書きます。

しかしこの方法はあっているのかも分からないし、とにかく効率が悪いです。

数学の内容は高校生ぐらいです。

でもまぁいちおう雑記的なあれで書いてみます。

まず、座標の移動について。

こんな図を用意してみました。

rotate_pos.png



はい。わかりずらいですねww

ちなみに1とか2とか3とかの数値は全く気にしないで下さい。関係ないので。

Rは半径で、θとβはそれぞれ図示された角度を表してます。

紫の線は直角三角形を作るための補助的な線です。

んでまず何をしたいかと言いますと、

(x,y)座標を反時計まわりにβだけ回転させた(x',y')が知りたい

ということで試行錯誤してみます。

まずx ,yをsinとかcosで表してみると

x = Rcos(θ)
y = Rsin(θ)

となります。①

で同様にx' , y'はそれぞれ

x' = Rcos(θ+β)
y' = Rsin(θ+β)

これを加法定理でばらすと、

x' = Rcos(θ)cos(β) - Rsin(θ)sin(β)
y' = Rsin(θ)cos(β) + Rcos(θ)sin(β)

となりますが、①より

x' = xcos(β) - ysin(β)
y' = ycos(β) + xsin(β)

となります。

これで任意の(x,y)の点からβ度回転したときの座標(x',y')が求まりました。

因みにこの形は行列で表せるので、表してみると

rotatemat.png

となります。


じゃあ実際に使ってみます。

ということで以前書いた拙作行列演算モジュールを折角なので用いて

画像をぐるっとまわしてみます。

例のMatrixモジュールは以下です

#!/usr/bin/env python
#coding:utf-8

import math

class Matrix:

    #if flag is True , make elementary matrix in the [instance].e
    def __init__ ( self , matrixFactor , flag = True ):
        if ( isinstance( matrixFactor , str ) ): matrixFactor = self.transForm( matrixFactor )
        self.gyou = len( matrixFactor )
        self.retu = len( matrixFactor[ 0 ] )
        self.e = None
        for eachLine in matrixFactor:
            if ( self.retu != len( eachLine ) ): raise IOError
        self.matrix = matrixFactor
        if (( self.retu == self.gyou ) and ( flag == True )) :
            elementary_factor = []
            each_factor = []
            counter = 0
            for dummy in xrange( self.gyou ):
                for dummy2 in xrange( self.retu ):
                    if ( dummy2 == counter ) :
                        each_factor.append( 1 )
                    else:
                        each_factor.append( 0 )
                counter += 1
                elementary_factor.append( each_factor )
                each_factor = []
            self.e = Matrix( elementary_factor , False )


    def transForm( self , strdata ):
        result = []
        proc = []
        for eachRow in strdata.split( ";" ):
            for eachFactor in eachRow.split( "," ):
                proc.append( float( eachFactor ) )
            result.append( proc )
            proc = []
        return result

    #show format
    def printFormat( self ):
        print "%s Row %s Column  matrix" %( self.gyou , self.retu )


    #show matrix gui
    def printMatrix( self ):
        for each in self.matrix:
            for number in each:
                print str( number ) + "\t",
            print ""



    def getFactor( self , gyou , retu ):
        return self.matrix[ gyou - 1 ][ retu - 1 ]



    def getRow( self , row ):
        return self.matrix[ row - 1 ]


    def getColumn( self , column ):
        result = []
        for each in self.matrix : result.append( each[ column - 1 ] )
        return result


    def powMatrix( self , number):
        ins = Matrix( self.matrix )
        result = ins
        for dummy in xrange( number - 1 ):
            result = result.mult( ins )
        return result


    def timesMatrix( self , number ):
        result = []
        proc = []
        for each in self.matrix:
            for n in each:
                proc.append( n * number )
            result.append( proc )
            proc = []
        return Matrix(result)


    def multMatrix( self , matrix ):
        if ( self.retu != matrix.gyou ): raise IOError
        result =[]
        proc = []
        tmp = 0
        for each in self.matrix:
            for counter2 in xrange( matrix.retu ):
                r = matrix.getColumn( counter2 + 1 )
                for counter in xrange( self.retu ):
                    tmp += each[ counter ] * r[ counter ]
                proc.append( tmp )
                tmp = 0
            result.append( proc )
            proc = []
        return Matrix( result )

    #addMatrix
    def addMatrix( self , matrix  , flag = True):
        if ( ( self.gyou != matrix.gyou ) or ( self.retu != matrix.retu ) ): raise IOError
        new_matrix = []
        counter = 0
        for each in self.matrix:
            new_matrix.append( self.addList( each , matrix.matrix[ counter ] , flag ) )
            counter += 1
        return Matrix( new_matrix )


    #SubstractionMatrix
    def subsMatrix( self , matrix ):
        return self.addMatrix( matrix , flag = False )


    def compare( self , matrix ):
        if ( ( self.gyou != matrix.gyou ) or ( self.retu != matrix.retu ) ): return False
        counter = 0
        for each in self.matrix:
            target = matrix.matrix[ counter ]
            counter2 = 0
            for each2 in each:
                if ( each2 != target[ counter2 ] ) : return False
                counter2 += 1
            counter += 1
        return True

    def getInverseMatrix2( self ):
        if ( ( self.gyou != 2) or ( self.retu != 2 ) ): raise IOError
        d = self.getFactor(1,1) * self.getFactor(2,2) - self.getFactor(1,2) * self.getFactor(2,1)
        if ( d == 0): raise IOError
        inv = [ [self.getFactor(2,2) , -self.getFactor(1,2)] , [ -self.getFactor(2,1), self.getFactor(1,1)] ]
        return Matrix(inv).timesMatrix( 1.0/d )

    def getRotatedPosition(self , angle):
        if ((self.gyou != 2) or (self.retu != 1)) : raise IOError
        rotatemat = Matrix([[math.cos(angle) , -math.sin(angle)] , [math.sin(angle) , math.cos(angle)]])
        return rotatemat.multMatrix(self)
		
		
    #this method is private. DON'T CALL WITH INSTANCE
    def addList( self , list1 , list2 , flag):
        result = []
        counter = 0
        for each in list1:
            if ( flag ):
                result.append( each + list2[ counter ] )
            else:
                result.append( each - list2[ counter ] )
            counter += 1
        return result

		
if (__name__ == "__main__"): print "this is a matrix module."




因みにこの回転行列を使うために

getRotatedPosition()というメソッドを追加しました。

んで、上記のモジュールを使った簡単なサンプルが以下。

以下のソースコードは相当適当に書かれてるので注意!ww

多分大きい画像でやらなけりゃ大丈夫なはず

#!/usr/bin/env python
#coding:utf-8


import pygame
import math
import os
import Matrix as mat

			
filename = os.path.join( os.getcwd() , "src.jpg")

surface = pygame.image.load(filename)
size_x , size_y = surface.get_size()

picinfo = {}

newsur = pygame.Surface((700 , 700))

for x in xrange(size_x):
	for y in xrange(size_y):
		rm = mat.Matrix([[x],[y]]).getRotatedPosition(math.radians(95))
		newsur.set_at((int(rm.getRow(1)[0])+500 , int(rm.getRow(2)[0])+200) , surface.get_at((x,y)))
		
pygame.image.save(newsur , "dst.jpg")






なお、画像処理を行うためにpygameを使っているので動かすにはpygameをインストールしなきゃいけないですw(ぇ

では。
comment 0 trackback 0
03.16
Fri
こんばんは~

なんとなく春のけわいがしてきたのでブログのデザイン変えてみました。

あんま関係ないかぁ。

さて、最近STG的なものを制作中なのですが、

その中で敵の移動距離がしりたいなぁーって思った箇所がありまして、

自分なりに高校の時にやった曲線の長さの出し方をお浚いしてみました。

今回はその備忘録ということで。

だけど結局その処理は使わなかったんですけどねw


WARNING!!
これより下に書いてあることは真偽が定かじゃありません!
(そもそもどの記事もそうかもしれないけど)
なので鵜呑みにしないでね。


まぁこんなくだらない個人ブログで数学の勉強をする方がいないことを願って。

ただ、間違い等指摘して頂けると嬉しいです。


続きを読む
comment 1 trackback 0
12.31
Sat
どうもこんばんは。

今年もいよいよ終わりですね。

年の瀬ですね~

センター試験も迫っているわけですが私moratoriは

その"名前の通り"、学業という学生の本業を停止して

暢気にプログラムを書いて(ry

(もうこのくだりはいいですねw)

さて今回は円周率を求めてみます。

使うのはライプニッツ級数という非常に収束の遅い式。

式はこんなかんじです。

pi.png

(もし間違ってたら報告おねがいしますorz)

では早速Javaのコードにしていきましょう。

いちようタイマーつきです


import java.io.*;


class getpi{

	public static void main(String[] argv)throws IOException{


		System.out.println("--マーダヴァ-ライプニッツ級数で円周率を求める--\n");
		System.out.print("何項目まで計算しますか?: ");
		
		long max = Long.parseLong(new BufferedReader(new InputStreamReader(System.in)).readLine());
		System.out.println("計算中...");
		
		double proc = 0.0;
				
		timer count = new timer();
		count.start();
	
			
		for(long index = 1; index < max; index++){

			
			proc += Math.pow(-1 , index - 1) / ((2 * index) -1);
			
		}

		System.out.println( "PI ≒  " +  String.valueOf(proc * 4));
		System.out.println("約" + String.valueOf(count.counter) + "秒かかりました");
		count.flag = true;

	}
}

class timer extends Thread {

	boolean flag = false;
	long counter = 0;

	public void run(){
		while(true){
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e){}
			counter++;
			if (flag)
				break;
		}
	}
	
}


あんまり大きい値は与えないでくださいね。

マシンが動かなくなるかもしれないので!

では!!
comment 0 trackback 0
back-to-top
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。