SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
1.0
        0.5




                                                                         Rでマンデルブロ集合
Im(d)

        0.0
        -0.5
        -1.0




               -2.0   -1.5   -1.0         -0.5         0.0   0.5   1.0

                                    step: 0.03 n = 2




                                                               @manozo
                                                       Tokyo.R#20 LT1 at Nifty
                                                             28.JAN.2012
なんで今さらマンデルブロ集合?

• マンデルブロ博⼠の「禁断の市場」
  を読んだから
                 クオンツ⼤仏様の
                   ご推薦本
• お断り
 – 「マンデルブロ集合」についてはwikipediaな
   どを⾒るか「禁断の市場」を読んでください。
 – 数学は数ⅡB?まで(⽂系)
  • 複素数は⾼校時代にうっすらやった記憶あり

                               2
でなんとかならないものか?
             と考えた
• マンデルブロ集合って何という⽅へ
  – これwikipediaマンデルブロ集合
   •マンデルブロ集合はどこだと思いますか?




                          3
偶然 plot(1+1i) ができること                                       




                       を
                       知
                     1.4



        複素平⾯(ガウス平⾯)    る
Y
                     1.2




軸
が
    Im(1 + (0+1i))




                                                                         これ
                     1.0




虚
部
                     0.8
                     0.6




                           0.6   0.8        1.0         1.2       1.4

                                       Re(1 + (0+1i))                   X軸が実部   4
「もしかしたら出来るかも」と
             思
             っ
漸化式
             た
Zk+1=Zk   2+C

Z0=0
複素数Cにおいて発散するか否か?
発散しないCがマンデルブロ集合
                   5
⼿順

• 複素数のリスト(ベクトル)を⽤意
• マンデルブロ集合に含まないものをリストアップ
  – ネガフィルムのように
• plot()

  – 以上なるべくRっぽく



                           6
準備(特別なpackage使わないで)

• 材料
 – outer(): 複素数のリスト作成
 – complex(real=1,imag=1) #‐>1+1i
   • Mod(): 絶対値 2を超えると発散してしまうらしい
       – 無限のチェックはいらない(is.infinite())

 – setdiff(): 集合演算(差)
 – plot(): 複素数もplotで
                                       7
複素数の            絶対値とは
a<‐c()
step=0.05
a<‐outer(seq(‐2,2,step),seq(‐2,2,step),
          function(x,y)complex(r=x,i=y))   原点からの距離
d <‐ c()
for(c in a){




                                                   2
  if(Mod(c) < 2) #⿊いところが絶対値が2未満




                                                   1
    d<‐c(d,c)




                                           Im(d)

                                                   0
}




                                                   -1
plot(d,pch=19,asp=1)




                                                   -2
                                                        -3   -2   -1    0      1   2   3

                                                                       Re(d)




                                                                                           8
スクリプト1(複素数のリストを⽤意)
forの⼆重ループを使わずに                              outer(1:9,1:9,"*")
step=0.1                                    で九九
                         outer(1:9,1:9)でもOK!
g<‐outer(seq(‐2,1,step),
     seq(‐1,1,step),
function(x,y)complex(r=x,i=y))



                              1.0
dim(g) #‐> 31 21
                              0.5
length(g) #‐> 651
                      Im(a)

                              0.0




plot(g)
                              -0.5




⼀粒⼀粒発散するか確認
                              -1.0




                                     -2.0    -1.5   -1.0   -0.5    0.0   0.5   1.0   9
                                                           Re(a)
スクリプト2(マンデルブロ集合に含まれるか否か)
• zの絶対値が2を超えるものをリストアップ
m <‐c() #ここへリストアップ
for(c in g){
  z<‐0 #初期値は0とする(⼀般的なマンデルブロ集合)
    for(i in 1:100){#100回を超えて発散しないものをマンデルブロ集合とする
      z <‐ z^2 + c #漸化式
        if(Mod(z) > 2){
       #絶対値が2を超えると発散(マンデルブロ集合ではない)
        m<‐c(m,c) #リストに追加
        break     #抜ける
  }
 }
       絶対値が2を超えるとzは無限遠に⾶んでいく
}
                                                   10
スクリプト3(plotする)

• mm<‐setdiff(g,m) #集合演算(差をとる)
• plot(mm)


                                                                         1.0
おぼろげながら                                                                  0.5




⾒えてきた
                                                                 Im(g)

                                                                         0.0
                                                                         -0.5
        1.0
        0.5
Im(m)

        0.0




                                                                         -1.0
        -0.5




                                                                                -2.0   -1.5   -1.0           -0.5   0.0

                                                                                                     Re(g)
        -1.0




               -2.0   -1.5   -1.0   -0.5    0.0   0.5   1.0

                                    Re(m)




        plot(m)                                                 この⼀粒⼀粒がマンデルブロ集合                                           11
mandelbrot()として         定義する
• mandelbrot<‐function(step=0.1){...} 
  #stepのデフォを0.1に
  – ステップ1,2,3を囲むだけ
    • おまけはありますが




                                         12
やっぱり               カラフル じゃないと...              



mandelbrot<‐function(step=0.1,n=2){
g<‐outer(seq(‐2,1,step),seq(‐1,1,step),function(x,y)complex(r=x,i=y))
g<<‐g[Mod(g)<=2] #絶対値2以下のものだけにする
#‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
m<‐c()#マンデルブロ集合でないもの(絶対値が2より⼤きいものを⼊れる)
mc<‐c()#発散するまでの回数を⼊れる

                                        発散した回を
for(c in g){
  z<‐0 #初期値
  for(i in 1:100){
     z <‐ z^n + c                     カウントして⾊づけ
     if(Mod(z) > 2){
m <‐c(m,c);mc<‐c(mc,i);break}}}
#‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
#回数で⾊分け
plot(m,pch=pch,xlab=paste("step:",step,"n = ",n),
xlim=c(‐2,1),ylim=c(‐1,1),col = colors()[mc*30])

m<<‐m #永続化(関数の外でも使えるように)
mc<<‐mc
print(length(m))
}                                  length(colors())#‐>657⾊
                                                                         13
1.0
        0.5
                      デモ mandelbrot(0.03)
Im(d)

        0.0
        -0.5
        -1.0




               -2.0     -1.5   -1.0         -0.5         0.0   0.5   1.0

                                      step: 0.03 n = 2                     14
ちょっとかわいいマンデルブロ集合ですが
                       い
                       か
> mandelbrot(0.03)     が
                       で
                  n    し
      Z k +1 = Z k + C ょ
                       う
おまけ(nを変えてみる)           か
> mandelbrot(0.03,11)  ?


          Rらしくいろいろ遊べます 15
たとえば

par(mfrow=c(2,5))#画⾯を2×5=10
for(i in 1:10)#nを1〜10に
  mandelbrot(0.1,i)




                              16
1.0




                                                                                                    1.0




                                                                                                                                                                                                1.0
                                                      1.0




                                                                                                                                                  1.0
        0.5




                                                                                                    0.5




                                                                                                                                                                                                0.5
                                                      0.5




                                                                                                                                                  0.5
Im(d)




                                              Im(d)




                                                                                            Im(d)




                                                                                                                                          Im(d)




                                                                                                                                                                                        Im(d)
        0.0




                                                      0.0




                                                                                                    0.0




                                                                                                                                                  0.0




                                                                                                                                                                                                0.0
        -0.5




                                                      -0.5




                                                                                                    -0.5




                                                                                                                                                  -0.5




                                                                                                                                                                                                -0.5
        -1.0




                                                      -1.0




                                                                                                    -1.0




                                                                                                                                                  -1.0




                                                                                                                                                                                                -1.0
               -2.0   n=1
                       -1.0    0.0      1.0                  -2.0   n=2
                                                                     -1.0    0.0      1.0                  -2.0   n=3
                                                                                                                   -1.0    0.0      1.0                  -2.0    n=4
                                                                                                                                                                 -1.0    0.0      1.0                  -2.0    n=5
                                                                                                                                                                                                               -1.0     0.0      1.0

                      step: 0.1 n = 1                               step: 0.1 n = 2                               step: 0.1 n = 3                               step: 0.1 n = 4                               step: 0.1 n = 5
        1.0




                                                      1.0




                                                                                                    1.0




                                                                                                                                                  1.0




                                                                                                                                                                                                1.0
        0.5




                                                      0.5




                                                                                                    0.5




                                                                                                                                                  0.5




                                                                                                                                                                                                0.5
Im(d)




                                              Im(d)




                                                                                            Im(d)




                                                                                                                                          Im(d)




                                                                                                                                                                                        Im(d)
        0.0




                                                      0.0




                                                                                                    0.0




                                                                                                                                                  0.0




                                                                                                                                                                                                0.0
        -0.5




                                                      -0.5




                                                                                                    -0.5




                                                                                                                                                  -0.5




                                                                                                                                                                                                -0.5
        -1.0




                                                      -1.0




                                                                                                    -1.0




                                                                                                                                                  -1.0




                                                                                                                                                                                                -1.0
               -2.0   n=6
                       -1.0    0.0      1.0                  -2.0   n=7
                                                                     -1.0    0.0      1.0                  -2.0   n=8
                                                                                                                   -1.0    0.0      1.0                  -2.0    n=9
                                                                                                                                                                 -1.0    0.0      1.0                  -2.0    n=10
                                                                                                                                                                                                               -1.0     0.0      1.0

                      step: 0.1 n = 6                               step: 0.1 n = 7                               step: 0.1 n = 8                               step: 0.1 n = 9                               step: 0.1 n = 10
                                                                                                                                                                                                                                  17
円の⼤きさは回数のlog                                                               たとえば2
                                                                                 mct<‐table(mc)
                                                                                 plot(mct,col=colors()[30*as.integer(names(mct))])
        1.0




                                                                          1500
                                                                                            発散するまで
        0.5




                                                                                            の回数分布




                                                                          1000
                                                              table(mc)
Im(m)

        0.0




                                                                          500
        -0.5
        -1.0




                                                                          0




               -2.0   -1.5   -1.0   -0.5    0.0   0.5   1.0                        1 7 15   24 33   42 51   60 69   81 90   99

                                    Re(m)                                                             mc                         18
たとえば3
           plot3d()もおもしろい
• 複素数をそのまま渡してもOK!
  – 3D表⽰
> library(rgl)
> plot3d(m,mc,col=mc)




                            19
?complex でヘルプをみると   




...
更に、複素数値に対する初等的な三⾓関数、
  対数関数、指数関数が使える。
 – http://www.is.titech.ac.jp/~mase/mase/h
   tml.jp/temp/complex.jp.html


 とある。
              もちろん複素数に対する四則も
                                             20
1.0




                                                                                           1.0
                                  0.5




                                                                                           0.5
                                  0.0




                                                                                           0.0
                                  -0.5




                                                                                           -0.5
                                  -1.0




                                                                                           -1.0
          逆数
     -1       0   1   2       3          -1.5        -1.0   -0.5   0.0        0.5    1.0               -0.5        0.0        0.5   1.0        1.5


           逆数                     3                          sin()
                                                            sin()                                                  cos()
                                                                                                                    cos()




                                                                                           2
                                  2




                                                                                           1
                                  1
                                  0




                                                                                           0
                                  -1




                                                                                           -1
                                  -2




                                                                                           -2
                                  -3




10        tan()
          5       0       5                     10          log()
                                                            05           00         05            00          05   exp() 10   15    20    25

                                                                                                                                                     21
まとめ
• Rでマンデルブロ集合が何となく理解できる
  ようになるはず
• zoom in しなくても楽しい
• ⾊々と試してみて下さい
 – ジュリア集合(Z0を0以外、Cを固定)デモします
 – 解像度を上げる
 – (⾊|n)を変える
 – アニメーション(gifアニメーションなど)

                              22
参 考

• マンデルブロ集合の不思議な世界
 – マンデルブロ集合の作り⽅
 – あじさん
  • マンデルブロ集合のjavaアプレットあり
• wikipedia マンデルブロ集合
• マンデルブロー集合ー2次関数の複素⼒学系⼊⾨
 – 川平 友規(名古屋⼤学⼤学院多元数理科学研究科)
 – 平成24年1⽉10⽇


                                 23
謝謝


                    2
                    1
Im(setdiff(a, d))

                    0
                    -1
                    -2




                         -2   -1          0            1   2

                                   Re(setdiff(a, d))
                                                                    24
Gallery




          25
2




                                                           ジュリア集合で遊ぶ
        1
Im(d)

        0
        -1
        -2




             -2    -1              0               1   2

                        step: 0.1 ri = -0.4-1.1i




                  • ソースは次
                  > par(bg=1)#バックを⿊に
                  > julia(step=0.1, n=2, col=30)
                  • パラパラジュリア
                        > for(i in 1:100)julia()
                  • サイケジュリア




                                                                        2
                                                                        1
                        > for(i in 1:100)



                                                                Im(d)

                                                                        0
                                                                        -1
                        + julia(col=sample(1:100,1)) 


                                                                        -2
                                                                             -2   -1             0               1   2

                                                                                       step: 0.1 ri = 0.9+1.5i
                                                                                                                     26
julia<‐function(step=0.1,pch=19,col=30,n=2){

a<‐outer(seq(‐2,2,step),seq(‐2,2,step),
         function(x,y)complex(r=x,i=y))
a<<‐a[Mod(a) <= 2]
ri<‐sample(a,1)#Zの初期値をランダムに選ぶ
d<‐c()
dc<‐c()
for(z in a){
    c<‐ ri
  zz<‐z
  for(i in 1:100){
     zz <‐ zz^n + c
     if(Mod(zz) >= 2){
                    d <‐c(d,z)
                    dc<‐c(dc,i) #何回⽬で発散したか
                    break
                    }
  }
}

#発散した回数で⾊分け
plot(d,pch=pch,xlab=paste("step:",step,"ri = ",ri),xlim=c(‐2,2),ylim=c(‐2,2),
col=colors()[dc+col])
d<<‐d
dc<<‐dc
}                                                                               27
ジュリアサイコロ
> par(bg=1,mfrow=c(2,3))
> for(i in 1:6)julia(n=i)




                          2




                                                                                   2




                                                                                                                                             2
                          1




                                                                                   1




                                                                                                                                             1
                  Im(d)




                                                                           Im(d)




                                                                                                                                     Im(d)
                          0




                                                                                   0




                                                                                                                                             0
                          -1




                                                                                   -1




                                                                                                                                             -1
                          -2




                                                                                   -2




                                                                                                                                             -2
                               -2   -1             0               1   2                -2   -1              0               1   2                -2   -1              0               1   2

                                         step: 0.1 ri = 0.4-1.3i                                  step: 0.1 ri = -0.1-1.6i                                  step: 0.1 ri = -1.2+0.5i




                          2




                                                                                   2




                                                                                                                                             2
                          1




                                                                                   1




                                                                                                                                             1
                  Im(d)




                                                                           Im(d)




                                                                                                                                     Im(d)
                          0




                                                                                   0




                                                                                                                                             0
                          -1




                                                                                   -1




                                                                                                                                             -1
                          -2




                                                                                   -2




                                                                                                                                             -2
                               -2   -1             0               1   2                -2   -1              0               1   2                -2   -1              0               1   2

                                         step: 0.1 ri = -1.6+2i                                    step: 0.1 ri = 0+1.2i                                    step: 0.1 ri = 0.1+1.3i




                                                                                                                                                                                               28
マンデルブロ            マスク
mandelbrot(0.03)#解像度(マシンに合わせて)

library(rgl)
rgl.bg(col=1)#バックは⿊
plot3d(‐1i/tan(m),mc,col=heat.colors(100)[dc])
#無限ループで回す(⼿ぶらで)ESCでストップ。
i<‐0;while(1)rgl.viewpoint(i<‐i+1)




                                                 29
以上 デモしました

• ジュリアサイコロはお初。




                     30

Weitere ähnliche Inhalte

Was ist angesagt?

2値分類・多クラス分類
2値分類・多クラス分類2値分類・多クラス分類
2値分類・多クラス分類t dev
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法nitoyon
 
パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)Yukara Ikemiya
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
東京都市大学 データ解析入門 4 スパース性と圧縮センシング1
東京都市大学 データ解析入門 4 スパース性と圧縮センシング1東京都市大学 データ解析入門 4 スパース性と圧縮センシング1
東京都市大学 データ解析入門 4 スパース性と圧縮センシング1hirokazutanaka
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 
クラシックな機械学習の入門  5. サポートベクターマシン
クラシックな機械学習の入門  5. サポートベクターマシンクラシックな機械学習の入門  5. サポートベクターマシン
クラシックな機械学習の入門  5. サポートベクターマシンHiroshi Nakagawa
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011finalMikio Kubo
 
正則化つき線形モデル(「入門機械学習第6章」より)
正則化つき線形モデル(「入門機械学習第6章」より)正則化つき線形モデル(「入門機械学習第6章」より)
正則化つき線形モデル(「入門機械学習第6章」より)Eric Sartre
 
パターン認識 05 ロジスティック回帰
パターン認識 05 ロジスティック回帰パターン認識 05 ロジスティック回帰
パターン認識 05 ロジスティック回帰sleipnir002
 
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜Takeshi Arabiki
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
第17回コンピュータビジョン勉強会@関東
第17回コンピュータビジョン勉強会@関東第17回コンピュータビジョン勉強会@関東
第17回コンピュータビジョン勉強会@関東ukyoda
 
【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスターUnity Technologies Japan K.K.
 

Was ist angesagt? (20)

2値分類・多クラス分類
2値分類・多クラス分類2値分類・多クラス分類
2値分類・多クラス分類
 
アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法アルゴリズムイントロダクション15章 動的計画法
アルゴリズムイントロダクション15章 動的計画法
 
Python opt
Python optPython opt
Python opt
 
パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
東京都市大学 データ解析入門 4 スパース性と圧縮センシング1
東京都市大学 データ解析入門 4 スパース性と圧縮センシング1東京都市大学 データ解析入門 4 スパース性と圧縮センシング1
東京都市大学 データ解析入門 4 スパース性と圧縮センシング1
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
クラシックな機械学習の入門  5. サポートベクターマシン
クラシックな機械学習の入門  5. サポートベクターマシンクラシックな機械学習の入門  5. サポートベクターマシン
クラシックな機械学習の入門  5. サポートベクターマシン
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
 
Cv 14th
Cv 14thCv 14th
Cv 14th
 
Gurobi python
Gurobi pythonGurobi python
Gurobi python
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
線形計画法入門
線形計画法入門線形計画法入門
線形計画法入門
 
正則化つき線形モデル(「入門機械学習第6章」より)
正則化つき線形モデル(「入門機械学習第6章」より)正則化つき線形モデル(「入門機械学習第6章」より)
正則化つき線形モデル(「入門機械学習第6章」より)
 
20111107 cvim(shirasy)
20111107 cvim(shirasy)20111107 cvim(shirasy)
20111107 cvim(shirasy)
 
パターン認識 05 ロジスティック回帰
パターン認識 05 ロジスティック回帰パターン認識 05 ロジスティック回帰
パターン認識 05 ロジスティック回帰
 
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
文字列カーネルによる辞書なしツイート分類 〜文字列カーネル入門〜
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
第17回コンピュータビジョン勉強会@関東
第17回コンピュータビジョン勉強会@関東第17回コンピュータビジョン勉強会@関東
第17回コンピュータビジョン勉強会@関東
 
【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター【Unite Tokyo 2018】誘導ミサイル完全マスター
【Unite Tokyo 2018】誘導ミサイル完全マスター
 

Ähnlich wie Rでマンデルブロ集合

Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会Shuyo Nakatani
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Tetsuya Yoshida
 
Infinite SVM [改] - ICML 2011 読み会
Infinite SVM [改] - ICML 2011 読み会Infinite SVM [改] - ICML 2011 読み会
Infinite SVM [改] - ICML 2011 読み会Shuyo Nakatani
 
数列で学ぶ初めての CommonLisp #fibonacci
数列で学ぶ初めての CommonLisp #fibonacci数列で学ぶ初めての CommonLisp #fibonacci
数列で学ぶ初めての CommonLisp #fibonaccipgf2alpha
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programmingKeisuke OTAKI
 
円錐曲線の極座標表示
円錐曲線の極座標表示円錐曲線の極座標表示
円錐曲線の極座標表示Maruyama Tetsutaro
 
代数トポロジー入門
代数トポロジー入門代数トポロジー入門
代数トポロジー入門Tatsuki SHIMIZU
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 
TopCoder SRM614 解説
TopCoder SRM614 解説TopCoder SRM614 解説
TopCoder SRM614 解説EmKjp
 
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM) コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM) Takahiro (Poly) Horikawa
 
動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)kakira9618
 
【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について和人 桐ケ谷
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター Unity Technologies Japan K.K.
 
Rで実験計画法 前編
Rで実験計画法 前編Rで実験計画法 前編
Rで実験計画法 前編itoyan110
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化Miyoshi Yuya
 

Ähnlich wie Rでマンデルブロ集合 (15)

Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会Infinite SVM - ICML 2011 読み会
Infinite SVM - ICML 2011 読み会
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
 
Infinite SVM [改] - ICML 2011 読み会
Infinite SVM [改] - ICML 2011 読み会Infinite SVM [改] - ICML 2011 読み会
Infinite SVM [改] - ICML 2011 読み会
 
数列で学ぶ初めての CommonLisp #fibonacci
数列で学ぶ初めての CommonLisp #fibonacci数列で学ぶ初めての CommonLisp #fibonacci
数列で学ぶ初めての CommonLisp #fibonacci
 
Sec15 dynamic programming
Sec15 dynamic programmingSec15 dynamic programming
Sec15 dynamic programming
 
円錐曲線の極座標表示
円錐曲線の極座標表示円錐曲線の極座標表示
円錐曲線の極座標表示
 
代数トポロジー入門
代数トポロジー入門代数トポロジー入門
代数トポロジー入門
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
TopCoder SRM614 解説
TopCoder SRM614 解説TopCoder SRM614 解説
TopCoder SRM614 解説
 
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM) コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
コンピュータービジョン最先端ガイド2 3.4ベクトルデータに対するカーネル法(SVM)
 
動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)
 
【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター
 
Rで実験計画法 前編
Rで実験計画法 前編Rで実験計画法 前編
Rで実験計画法 前編
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化
 

Mehr von Yoshiteru Kamiyama

Mehr von Yoshiteru Kamiyama (7)

オイラーの公式で感じる次元の呪い
オイラーの公式で感じる次元の呪いオイラーの公式で感じる次元の呪い
オイラーの公式で感じる次元の呪い
 
Tokyo.rの輪
Tokyo.rの輪Tokyo.rの輪
Tokyo.rの輪
 
Listを串刺し
Listを串刺しListを串刺し
Listを串刺し
 
R language definition3.1_3.2
R language definition3.1_3.2R language definition3.1_3.2
R language definition3.1_3.2
 
rで踊るパスタ
rで踊るパスタrで踊るパスタ
rで踊るパスタ
 
黄金比.再帰
黄金比.再帰黄金比.再帰
黄金比.再帰
 
医療費ts
医療費ts医療費ts
医療費ts
 

Rでマンデルブロ集合

  • 1. 1.0 0.5 Rでマンデルブロ集合 Im(d) 0.0 -0.5 -1.0 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 step: 0.03 n = 2 @manozo Tokyo.R#20 LT1 at Nifty 28.JAN.2012
  • 2. なんで今さらマンデルブロ集合? • マンデルブロ博⼠の「禁断の市場」 を読んだから クオンツ⼤仏様の ご推薦本 • お断り – 「マンデルブロ集合」についてはwikipediaな どを⾒るか「禁断の市場」を読んでください。 – 数学は数ⅡB?まで(⽂系) • 複素数は⾼校時代にうっすらやった記憶あり 2
  • 3. でなんとかならないものか? と考えた • マンデルブロ集合って何という⽅へ – これwikipediaマンデルブロ集合 •マンデルブロ集合はどこだと思いますか? 3
  • 4. 偶然 plot(1+1i) ができること     を 知 1.4 複素平⾯(ガウス平⾯) る Y 1.2 軸 が Im(1 + (0+1i)) これ 1.0 虚 部 0.8 0.6 0.6 0.8 1.0 1.2 1.4 Re(1 + (0+1i)) X軸が実部 4
  • 5. 「もしかしたら出来るかも」と 思 っ 漸化式 た Zk+1=Zk 2+C Z0=0 複素数Cにおいて発散するか否か? 発散しないCがマンデルブロ集合 5
  • 7. 準備(特別なpackage使わないで) • 材料 – outer(): 複素数のリスト作成 – complex(real=1,imag=1) #‐>1+1i • Mod(): 絶対値 2を超えると発散してしまうらしい – 無限のチェックはいらない(is.infinite()) – setdiff(): 集合演算(差) – plot(): 複素数もplotで 7
  • 8. 複素数の 絶対値とは a<‐c() step=0.05 a<‐outer(seq(‐2,2,step),seq(‐2,2,step), function(x,y)complex(r=x,i=y)) 原点からの距離 d <‐ c() for(c in a){ 2 if(Mod(c) < 2) #⿊いところが絶対値が2未満 1 d<‐c(d,c) Im(d) 0 } -1 plot(d,pch=19,asp=1) -2 -3 -2 -1 0 1 2 3 Re(d) 8
  • 9. スクリプト1(複素数のリストを⽤意) forの⼆重ループを使わずに outer(1:9,1:9,"*") step=0.1 で九九 outer(1:9,1:9)でもOK! g<‐outer(seq(‐2,1,step),      seq(‐1,1,step), function(x,y)complex(r=x,i=y)) 1.0 dim(g) #‐> 31 21 0.5 length(g) #‐> 651 Im(a) 0.0 plot(g) -0.5 ⼀粒⼀粒発散するか確認 -1.0 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 9 Re(a)
  • 10. スクリプト2(マンデルブロ集合に含まれるか否か) • zの絶対値が2を超えるものをリストアップ m <‐c() #ここへリストアップ for(c in g){ z<‐0 #初期値は0とする(⼀般的なマンデルブロ集合) for(i in 1:100){#100回を超えて発散しないものをマンデルブロ集合とする z <‐ z^2 + c #漸化式 if(Mod(z) > 2){ #絶対値が2を超えると発散(マンデルブロ集合ではない) m<‐c(m,c) #リストに追加 break     #抜ける } } 絶対値が2を超えるとzは無限遠に⾶んでいく } 10
  • 11. スクリプト3(plotする) • mm<‐setdiff(g,m) #集合演算(差をとる) • plot(mm) 1.0 おぼろげながら 0.5 ⾒えてきた Im(g) 0.0 -0.5 1.0 0.5 Im(m) 0.0 -1.0 -0.5 -2.0 -1.5 -1.0 -0.5 0.0 Re(g) -1.0 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 Re(m) plot(m) この⼀粒⼀粒がマンデルブロ集合 11
  • 12. mandelbrot()として 定義する • mandelbrot<‐function(step=0.1){...}  #stepのデフォを0.1に – ステップ1,2,3を囲むだけ • おまけはありますが 12
  • 13. やっぱり   カラフル じゃないと...   mandelbrot<‐function(step=0.1,n=2){ g<‐outer(seq(‐2,1,step),seq(‐1,1,step),function(x,y)complex(r=x,i=y)) g<<‐g[Mod(g)<=2] #絶対値2以下のものだけにする #‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ m<‐c()#マンデルブロ集合でないもの(絶対値が2より⼤きいものを⼊れる) mc<‐c()#発散するまでの回数を⼊れる 発散した回を for(c in g){ z<‐0 #初期値 for(i in 1:100){ z <‐ z^n + c カウントして⾊づけ if(Mod(z) > 2){ m <‐c(m,c);mc<‐c(mc,i);break}}} #‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ #回数で⾊分け plot(m,pch=pch,xlab=paste("step:",step,"n = ",n), xlim=c(‐2,1),ylim=c(‐1,1),col = colors()[mc*30]) m<<‐m #永続化(関数の外でも使えるように) mc<<‐mc print(length(m)) } length(colors())#‐>657⾊ 13
  • 14. 1.0 0.5 デモ mandelbrot(0.03) Im(d) 0.0 -0.5 -1.0 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 step: 0.03 n = 2 14
  • 15. ちょっとかわいいマンデルブロ集合ですが い か > mandelbrot(0.03) が で n し Z k +1 = Z k + C ょ う おまけ(nを変えてみる) か > mandelbrot(0.03,11) ? Rらしくいろいろ遊べます 15
  • 17. 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 Im(d) Im(d) Im(d) Im(d) Im(d) 0.0 0.0 0.0 0.0 0.0 -0.5 -0.5 -0.5 -0.5 -0.5 -1.0 -1.0 -1.0 -1.0 -1.0 -2.0 n=1 -1.0 0.0 1.0 -2.0 n=2 -1.0 0.0 1.0 -2.0 n=3 -1.0 0.0 1.0 -2.0 n=4 -1.0 0.0 1.0 -2.0 n=5 -1.0 0.0 1.0 step: 0.1 n = 1 step: 0.1 n = 2 step: 0.1 n = 3 step: 0.1 n = 4 step: 0.1 n = 5 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 Im(d) Im(d) Im(d) Im(d) Im(d) 0.0 0.0 0.0 0.0 0.0 -0.5 -0.5 -0.5 -0.5 -0.5 -1.0 -1.0 -1.0 -1.0 -1.0 -2.0 n=6 -1.0 0.0 1.0 -2.0 n=7 -1.0 0.0 1.0 -2.0 n=8 -1.0 0.0 1.0 -2.0 n=9 -1.0 0.0 1.0 -2.0 n=10 -1.0 0.0 1.0 step: 0.1 n = 6 step: 0.1 n = 7 step: 0.1 n = 8 step: 0.1 n = 9 step: 0.1 n = 10 17
  • 18. 円の⼤きさは回数のlog たとえば2 mct<‐table(mc) plot(mct,col=colors()[30*as.integer(names(mct))]) 1.0 1500 発散するまで 0.5 の回数分布 1000 table(mc) Im(m) 0.0 500 -0.5 -1.0 0 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1 7 15 24 33 42 51 60 69 81 90 99 Re(m) mc 18
  • 19. たとえば3 plot3d()もおもしろい • 複素数をそのまま渡してもOK! – 3D表⽰ > library(rgl) > plot3d(m,mc,col=mc) 19
  • 20. ?complex でヘルプをみると   ... 更に、複素数値に対する初等的な三⾓関数、 対数関数、指数関数が使える。 – http://www.is.titech.ac.jp/~mase/mase/h tml.jp/temp/complex.jp.html  とある。 もちろん複素数に対する四則も 20
  • 21. 1.0 1.0 0.5 0.5 0.0 0.0 -0.5 -0.5 -1.0 -1.0 逆数 -1 0 1 2 3 -1.5 -1.0 -0.5 0.0 0.5 1.0 -0.5 0.0 0.5 1.0 1.5 逆数 3 sin() sin() cos() cos() 2 2 1 1 0 0 -1 -1 -2 -2 -3 10 tan() 5 0 5 10 log() 05 00 05 00 05 exp() 10 15 20 25 21
  • 22. まとめ • Rでマンデルブロ集合が何となく理解できる ようになるはず • zoom in しなくても楽しい • ⾊々と試してみて下さい – ジュリア集合(Z0を0以外、Cを固定)デモします – 解像度を上げる – (⾊|n)を変える – アニメーション(gifアニメーションなど) 22
  • 23. 参 考 • マンデルブロ集合の不思議な世界 – マンデルブロ集合の作り⽅ – あじさん • マンデルブロ集合のjavaアプレットあり • wikipedia マンデルブロ集合 • マンデルブロー集合ー2次関数の複素⼒学系⼊⾨ – 川平 友規(名古屋⼤学⼤学院多元数理科学研究科) – 平成24年1⽉10⽇ 23
  • 24. 謝謝 2 1 Im(setdiff(a, d)) 0 -1 -2 -2 -1 0 1 2 Re(setdiff(a, d)) 24
  • 25. Gallery 25
  • 26. 2 ジュリア集合で遊ぶ 1 Im(d) 0 -1 -2 -2 -1 0 1 2 step: 0.1 ri = -0.4-1.1i • ソースは次 > par(bg=1)#バックを⿊に > julia(step=0.1, n=2, col=30) • パラパラジュリア > for(i in 1:100)julia() • サイケジュリア 2 1 > for(i in 1:100) Im(d) 0 -1 + julia(col=sample(1:100,1))  -2 -2 -1 0 1 2 step: 0.1 ri = 0.9+1.5i 26
  • 27. julia<‐function(step=0.1,pch=19,col=30,n=2){ a<‐outer(seq(‐2,2,step),seq(‐2,2,step), function(x,y)complex(r=x,i=y)) a<<‐a[Mod(a) <= 2] ri<‐sample(a,1)#Zの初期値をランダムに選ぶ d<‐c() dc<‐c() for(z in a){ c<‐ ri zz<‐z for(i in 1:100){ zz <‐ zz^n + c if(Mod(zz) >= 2){ d <‐c(d,z) dc<‐c(dc,i) #何回⽬で発散したか break } } } #発散した回数で⾊分け plot(d,pch=pch,xlab=paste("step:",step,"ri = ",ri),xlim=c(‐2,2),ylim=c(‐2,2), col=colors()[dc+col]) d<<‐d dc<<‐dc } 27
  • 28. ジュリアサイコロ > par(bg=1,mfrow=c(2,3)) > for(i in 1:6)julia(n=i) 2 2 2 1 1 1 Im(d) Im(d) Im(d) 0 0 0 -1 -1 -1 -2 -2 -2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 step: 0.1 ri = 0.4-1.3i step: 0.1 ri = -0.1-1.6i step: 0.1 ri = -1.2+0.5i 2 2 2 1 1 1 Im(d) Im(d) Im(d) 0 0 0 -1 -1 -1 -2 -2 -2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 step: 0.1 ri = -1.6+2i step: 0.1 ri = 0+1.2i step: 0.1 ri = 0.1+1.3i 28
  • 29. マンデルブロ マスク mandelbrot(0.03)#解像度(マシンに合わせて) library(rgl) rgl.bg(col=1)#バックは⿊ plot3d(‐1i/tan(m),mc,col=heat.colors(100)[dc]) #無限ループで回す(⼿ぶらで)ESCでストップ。 i<‐0;while(1)rgl.viewpoint(i<‐i+1) 29