スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク | - | | - | - |

Qt案外使いやすいかも

ずっと敬遠していたGUIツールキットQt。

敬遠してたのは開発環境やら何やらごてごてしてるから。

もっと気軽にlibファイルだけリンクして使えるシンプルなものが好きなんだが。

でもちょっと使ってみると案外使いやすいかも。

QtCreatorも結構いい感じかも。

 

ちょっとWindows環境でGUIプログラム作る必要が生じていじっている。

QtCreator、ちょっと慣れるのに時間がかかったけど案外Visual Studioより使いやすいかも。

Linuxでも使ってみようかな。

ジャジャガッチ | C/C++ | 22:14 | comments(0) | trackbacks(0) |

小林泰三「セピア色の凄惨」読了

小林泰三「セピア色の凄惨」読了。

やっぱり小林泰三、安定して面白い。

ちょっと(かなり?)病んだり狂ったりした人たちの短編集。

気軽に読める長さだけど内容は暗くて面白い。

ジャジャガッチ | その他 | 22:09 | comments(0) | trackbacks(0) |

フィッティングで方程式を解いてみる(3)デノイズ

前回、前々回、フィッティングで方程式を解いてみた。

例が簡単過ぎてあまり面白みを感じない方もいそうなので、もう少し凝ったことをしてみたい。

 

今回は、記事タイトルに偽りありであるが関数の最小化をしてみたい。

フィッティングが二乗和で表される関数の最小化をしていることを利用して方程式を解いていたのだが、今回は方程式ではなく、関数の最小化問題を解いてみたいと思う。

 

今回行うのは簡単なデノイズである。

いま、あるデータ{Xi}がある。本来、データは滑らかでなければならないとする。この仮定の下でノイズを含まないデータの推定を行ってみよう。

デノイズ後の値を{ai}とする。滑らかさの指標として、

¥[
¥sum_i(a_{i+1}-a_i)^2
¥]

を用いる。これが小さければ滑らかである。最も滑らかなのは全ての点で同一の値を持つ場合である。これではデノイズ出来たとはいい難い。{ai}は{Xi}にそれなりに近い必要がある。そこで

¥[
¥sum_i(a_i-X_i)^2 + ¥lambda¥sum_i(a_{i+1}-a_i)^2
¥]

を最小化する{ai}を求めることにする。λは定数で、これを大きくすると、滑らかであるが元のデータとの乖離が大きくなる。

この関数は二乗和となっているので、フィッティング機能を利用して解くことが出来る。

 

フィッティング対象のデータは次のようなものを用意する。データの次元をNとする。

 

0 X[0]

1 X[1]

・・・・

N-1 X[N-1]

N 0

・・・

2N-2 0

 

最初のN行は

¥[
¥sum_i(a_i-X_i)^2 
¥]

の部分である。後半は

¥[
¥lambda¥sum_i(a_{i+1}-a_i)^2
¥]

の部分である。

 

フィッティング関数は

¥[
¥sum_{i=0}^{N-1}¥delta_{xi}a_i + ¥sqrt{¥lambda}¥sum_{i=N}^{2N-2}¥delta_{xi}(a_{i-N+1}-a_{i-N})
¥]

と定義する。これで元の問題をフィッティング問題として定義できた。

 

それではやってみよう。今回は問題が少し複雑で流石にGnuplotに手打ちでは辛いので、次のコードでテキストを生成してGnuplotで読み込んだ。

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <vector>
#include <random>
#include <cmath>
double M_PI = 3.14159265358979;
using namespace std;

int main()
{

    FILE *fp = fopen("data.txt", "w");
    int N = 64;
    vector<double> val(N);
    std::mt19937 mt(0);
    std::normal_distribution<double> gauss(0, 0.1);
    for (int n = 0; n < N; n++)
    {
        val[n] = sin(2 * M_PI*n / (double)N) +gauss(mt);
        fprintf(fp, "%d %e¥n",n,val[n]);
    }
    for (int n = N; n < 2*N-1; n++)
    {
        fprintf(fp, "%d 0¥n",n);
    }
    fclose(fp);

    fp = fopen("macro.txt", "w");
    fprintf(fp,"d(i,j) = (i==j) ? 1 : 0¥n");
    fprintf(fp,"fit ");
    for (int n = 0; n < N; n++)
    {
        fprintf(fp,"d(x,%d)*a%d + ",n,n);
    }
    double lambda = 10;
    for (int n = N; n < 2*N-1; n++)
    {
        fprintf(fp,"%f*d(x,%d)*(a%d-a%d)", sqrt(lambda),n, n+1-N,n-N);
        if (n != 2 * N - 2) fprintf(fp," + ");
        else fprintf(fp," ");
    }
    fprintf(fp,"¥"data.txt¥" via ");
    for (int n = 0; n < N; n++)
    {

        fprintf(fp,"a%d ",n);
        if (n != N - 1) fprintf(fp,", ");

    }
    fclose(fp);

    return 0;
}

 

このコードは、オリジナルデータとしてsin関数を用意し、σ=0.1のガウスノイズを足し合わせてデータを生成している。

その後、Gnuplot用のコマンドを生成している。

具体的にはN=64, λ=1では次のコマンドを生成している。

d(i,j) = (i==j) ? 1 : 0
fit d(x,0)*a0 + d(x,1)*a1 + d(x,2)*a2 + d(x,3)*a3 + d(x,4)*a4 + d(x,5)*a5 + d(x,6)*a6 + d(x,7)*a7 + d(x,8)*a8 + d(x,9)*a9 + d(x,10)*a10 + d(x,11)*a11 + d(x,12)*a12 + d(x,13)*a13 + d(x,14)*a14 + d(x,15)*a15 + d(x,16)*a16 + d(x,17)*a17 + d(x,18)*a18 + d(x,19)*a19 + d(x,20)*a20 + d(x,21)*a21 + d(x,22)*a22 + d(x,23)*a23 + d(x,24)*a24 + d(x,25)*a25 + d(x,26)*a26 + d(x,27)*a27 + d(x,28)*a28 + d(x,29)*a29 + d(x,30)*a30 + d(x,31)*a31 + d(x,32)*a32 + d(x,33)*a33 + d(x,34)*a34 + d(x,35)*a35 + d(x,36)*a36 + d(x,37)*a37 + d(x,38)*a38 + d(x,39)*a39 + d(x,40)*a40 + d(x,41)*a41 + d(x,42)*a42 + d(x,43)*a43 + d(x,44)*a44 + d(x,45)*a45 + d(x,46)*a46 + d(x,47)*a47 + d(x,48)*a48 + d(x,49)*a49 + d(x,50)*a50 + d(x,51)*a51 + d(x,52)*a52 + d(x,53)*a53 + d(x,54)*a54 + d(x,55)*a55 + d(x,56)*a56 + d(x,57)*a57 + d(x,58)*a58 + d(x,59)*a59 + d(x,60)*a60 + d(x,61)*a61 + d(x,62)*a62 + d(x,63)*a63 + 1.000000*d(x,64)*(a1-a0) + 1.000000*d(x,65)*(a2-a1) + 1.000000*d(x,66)*(a3-a2) + 1.000000*d(x,67)*(a4-a3) + 1.000000*d(x,68)*(a5-a4) + 1.000000*d(x,69)*(a6-a5) + 1.000000*d(x,70)*(a7-a6) + 1.000000*d(x,71)*(a8-a7) + 1.000000*d(x,72)*(a9-a8) + 1.000000*d(x,73)*(a10-a9) + 1.000000*d(x,74)*(a11-a10) + 1.000000*d(x,75)*(a12-a11) + 1.000000*d(x,76)*(a13-a12) + 1.000000*d(x,77)*(a14-a13) + 1.000000*d(x,78)*(a15-a14) + 1.000000*d(x,79)*(a16-a15) + 1.000000*d(x,80)*(a17-a16) + 1.000000*d(x,81)*(a18-a17) + 1.000000*d(x,82)*(a19-a18) + 1.000000*d(x,83)*(a20-a19) + 1.000000*d(x,84)*(a21-a20) + 1.000000*d(x,85)*(a22-a21) + 1.000000*d(x,86)*(a23-a22) + 1.000000*d(x,87)*(a24-a23) + 1.000000*d(x,88)*(a25-a24) + 1.000000*d(x,89)*(a26-a25) + 1.000000*d(x,90)*(a27-a26) + 1.000000*d(x,91)*(a28-a27) + 1.000000*d(x,92)*(a29-a28) + 1.000000*d(x,93)*(a30-a29) + 1.000000*d(x,94)*(a31-a30) + 1.000000*d(x,95)*(a32-a31) + 1.000000*d(x,96)*(a33-a32) + 1.000000*d(x,97)*(a34-a33) + 1.000000*d(x,98)*(a35-a34) + 1.000000*d(x,99)*(a36-a35) + 1.000000*d(x,100)*(a37-a36) + 1.000000*d(x,101)*(a38-a37) + 1.000000*d(x,102)*(a39-a38) + 1.000000*d(x,103)*(a40-a39) + 1.000000*d(x,104)*(a41-a40) + 1.000000*d(x,105)*(a42-a41) + 1.000000*d(x,106)*(a43-a42) + 1.000000*d(x,107)*(a44-a43) + 1.000000*d(x,108)*(a45-a44) + 1.000000*d(x,109)*(a46-a45) + 1.000000*d(x,110)*(a47-a46) + 1.000000*d(x,111)*(a48-a47) + 1.000000*d(x,112)*(a49-a48) + 1.000000*d(x,113)*(a50-a49) + 1.000000*d(x,114)*(a51-a50) + 1.000000*d(x,115)*(a52-a51) + 1.000000*d(x,116)*(a53-a52) + 1.000000*d(x,117)*(a54-a53) + 1.000000*d(x,118)*(a55-a54) + 1.000000*d(x,119)*(a56-a55) + 1.000000*d(x,120)*(a57-a56) + 1.000000*d(x,121)*(a58-a57) + 1.000000*d(x,122)*(a59-a58) + 1.000000*d(x,123)*(a60-a59) + 1.000000*d(x,124)*(a61-a60) + 1.000000*d(x,125)*(a62-a61) + 1.000000*d(x,126)*(a63-a62) "data.txt" via a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9 , a10 , a11 , a12 , a13 , a14 , a15 , a16 , a17 , a18 , a19 , a20 , a21 , a22 , a23 , a24 , a25 , a26 , a27 , a28 , a29 , a30 , a31 , a32 , a33 , a34 , a35 , a36 , a37 , a38 , a39 , a40 , a41 , a42 , a43 , a44 , a45 , a46 , a47 , a48 , a49 , a50 , a51 , a52 , a53 , a54 , a55 , a56 , a57 , a58 , a59 , a60 , a61 , a62 , a63 

 

このコマンドを実行すればGnuplotがフィッティングを実行する。

さて、結果を見てみよう。

まず、最初は理想データとノイズ入りデータである。

ガタガタしている。

λ=1でやってみよう。

少し滑らかになったのがわかるだろうか。

さらにλ=10ならばより滑らかになる。

目的関数の値もきちんと減少していることを確認した。

 

どうだろう、一応それなりに実践的なことも出来ることを示せたわけだが。面白くない?

役に立つかというと役には立たないわけだけど。

コード書かなくても最適化問題が解けるわけだが、単純な例なら今はWolfram alpha等便利なものがいくらでもあるし、複雑なものになると結局コードでコマンド生成しないと辛いものが・・・。

でも面白いからいいんだ。

ジャジャガッチ | 数学 | 22:42 | comments(0) | trackbacks(0) |

フィッティングで方程式を解いてみる(2)連立方程式

前回、f(x)=cをフィッティングで解いてみたわけだが、今回は連立方程式でやってみる。

基本は前回と同じである。

解きたい方程式を

¥[
¥sum_j A_{ij}x_j = b_i
¥]

とする。

次のようなデータを用意する。

0 b0

1 b1

2 b2

・・・

 

フィッティング関数は

¥[
f(x;¥{a¥}) = ¥sum_j A_{ij}a_j¥delta_{xi}
¥]

とする。aが推定するパラメータ、δはクロネッカーのデルタである。

フィッティングすれば

¥[
 ¥sum_i(¥sum_j A_{ij}a_j-b_i)^2
¥]

を最小とする解が求まる。これにより元の方程式の解が求まる。

具体的にやってみよう。

x+y=3

2x-y=0

を解いてみる。明らかに解はx=1, y=2である。

”data.txt”として

0 3
1 0

を用意する。

クロネッカーのデルタを定義する。

d(i,j) = (i==j) ? 1 : 0 

後は上で述べたようにフィッティング関数を定義してフィッティングすればよい。

 fit d(x,0)*a+d(x,0)*b+2*d(x,1)*a-d(x,1)*b "data.txt" via a,b

はい、求まった。

ジャジャガッチ | 数学 | 23:17 | comments(0) | trackbacks(0) |

フィッティングで方程式を解いてみる

実に半年ぶりのブログ更新。

Fallout4やったり、ウィッチャー3やったりしてた。

あんまり家でガッツリ趣味やる時間がなくて放置していた。

会社ではいろいろ面白いことやってるんだけどそれをここに書くわけにはいかないし。

趣味やるくらいなら英語やらねばというのもある。ここしばらく英語は勉強してなくて、3月に入ってから勉強を再開した。

 

本題。

今日は以前ふと思いついたことを実際にやってみることにした。

それは・・・、フィッティングを使って方程式を解くこと!

さて、どういうことをするかは後で説明することにして思い出話から。

高校の数学では、基本的に解析的に解けない方程式は出てこない。

しかし、大学に入ると解析的に解けない方程式のオンパレード。

ここで面食らうわけだが、大学1年生のときに先生にいいことを教わった。

グラフソフトでグラフ書けば数値解簡単に求められるよ、と。

例えば

x^2 -2x = -1

を考えよう。

この数値解はグラフソフトでy=x^2-2xとy=-1をプロットして交点の座標を読み取ればいい。

この例は解析的に解けるが、解析的に解けない方程式も同じだ。

 

さて、ここからが本題。

同じグラフソフトを使って解を求めるならフィッティング機能使えないかな?

グラフソフトにはフィッティング機能がついていることがある。

例えば僕が愛用しているGnuplotは

fit a*x "data.txt" via a 

と入力すれば直線フィットが出来る。

与えたデータに最も近くなるようにパラメータを推定してくれるわけだ。

これを利用して方程式を解けないだろうか。

 

フィッティングは次のようなことをしている。

対象のデータを{xi,yi}としよう。これをパラメータ{a}の関数fでフィッティングするとは

¥[
¥sum_i (y_i-f(x_i;¥{a¥}))^2
¥]

を最小化する{a}を求めることに他ならない。

 

それではこれを利用して方程式を解いてみよう。

ここでは

g(a) = c

をaについて解くことにする。cは定数である。

Gnuplotではデータは2点以上必要である。

次のようにデータを用意する。

0 0

1 c

フィッティング関数は

f(x;a) = g(a)*x

とする。

するとフィッティングすることにより求まるパラメータaは

¥[
(g(a)¥times 0-0)^2 + (g(a)-c)^2
¥]

を最小化するものとなる。これはg(a)=cである。

つまり数値解が求まる。

 

さて、x^2-2*x = -1をこの方法で解いてみよう。

"data.txt"として

0 0
1 -1

を用意する。

fit (a**2-2*a)*x "data.txt" via a

を実行すれば

はい、ばっちしa=1が得られました!

いや、だから何?なんだけど(笑)

役に立たなくても面白いものは面白いじゃない?

ジャジャガッチ | 数学 | 22:39 | comments(0) | trackbacks(0) |

世の中は進んでいる

lineスタンプ、Tシャツ販売、元手ゼロ。
世の中は進んでるなあ。
プリントTシャツなんて画像さえあればいいので、在庫ゼロでネットショップが始められる。
僕はSuzuriというサービスを利用したけど他にもいくつか選択肢はある。
最近はクラウドソーシングとかいう、ネットで気軽に副業出来るようなサービスもあるし、職を失ったとしても在宅でバイト代くらい稼げる気もする。
調べてみると電子書籍は元手ゼロで出版出来るらしいし、紙の本にしても5000円程度で出来るらしい。次は本書いてみたいな。
何の本がいいかな、と考えてみたのだが、高校数学の本とか書きやすそうだと思って書き始めた。
高校数学が実際に研究開発の現場でどのように役立っているか具体例を挙げながら解説するような本を書きたい。
出版までいかなくても、子供に数学質問された時に使える資料になるしね。
ジャジャガッチ | その他 | 23:56 | comments(0) | trackbacks(0) |

Lineスタンプ作ってみた

lineスタンプ作ってみた。
あと調子に乗ってTシャツも作ってみた。誰でも買えるよ!
自分で注文してみた。↓
買ってくれたら雀の涙ほどのおこづかいになります。
でも振込手数料越えるほど売り上げるとは思えない(笑)
ジャジャガッチ | その他 | 23:06 | comments(0) | trackbacks(0) |

pythonでオイラー法

ここんとこちょこちょこpython書いてて、少しずつ自由が効くようになってきた。まだまだだけど。

書かないと忘れちゃうのでオイラー法でも。

 

import numpy as np
import matplotlib.pyplot as plt
f = 1.0

N = 1000
x = 0.0
dx = 0.001
for n in range(N):
    if n%100==0:
        plt.plot(x,f,'.',c='blue')
    #print(f)
    f = (1.0+dx)*f
    x += dx
X = np.arange(0,1,0.01)
Y = np.exp(X)
plt.plot(X,Y)
plt.show()

 

 

コンパイルがいらないのでvimを閉じないで気軽に実行できるのがいいね。

グラフも簡単に書けるし!

ジャジャガッチ | python | 22:48 | comments(0) | trackbacks(0) |

ディープラーニング、1週間ほどいじってみた感想

子どもが生まれる前は自由研究と称して夏休みにしょうもないことをしていたが、流石に幼い二児の父となると自由研究なんてしている余裕はない。

でも何もしないのも寂しいので、自由研究というには程遠いが前から気になっていたディープラーニングをかじってみることにした。

少し前にニューラルネットをC++で自作して、何となく分かった気になったのでフレームワークを使ってもう少し実践的にやってみることにした。

 

最初にgoogleのTensorFlowを試してみたが、ちょっと敷居が高いので断念。

 

次にH2O.aiというやつがコードなしで使えるという話を聞いたので試してみた。

しかし高次元のベクトル推定のようなことをしようと思うと不便なので、やっぱりコードは必須かな、ということでKerasを試してみることにした。

これが素晴らしい。とっても簡単にネットワークを組むことができる。

 

取り敢えず手書き数字のデータ(MNIST)10000個を使って、オートエンコーダ、ディープでないニューラルネット、ディープなニューラルネット(畳み込みニューラルネット)を試してみた。

ディープでないニューラルネットでは正答率64%程度だったものがディープラーニングでは98%以上まで改善した。

色々出来そうな準備は出来たので、ハイパーパラメータをいじったりして遊びたい。

 

勉強していて思ったことをいくつか挙げておく。ただし一週間いじっただけのにわかなので間違ったことを書いているかもしれない。

 

* 手書き数字認識(MNIST)は初めの一歩には敷居が高い

→手書き数字認識はディープラーニングではHello world的な位置付けらしく、どんなフレームワークでも大抵初めの一歩として取り上げられている。ただ、フレームワークのチュートリアルを効率的に進めるためか、学習データを拾ってきて一次元ベクトルにしてみたいな泥臭い作業は単純なメソッドで隠蔽されていたりする。泥臭い作業が隠蔽されているため、どういう形でデータがやりとりされているのがピンと来なかった。これでは実際に使う時困るだろうということで、学習データのダウンロード、画像化、ベクトル化を自分の手で行った。最初の一歩としては手書き数字のような高等な例ではなく、ふたつの正規分布から数値を乱数で取り出し、分類するような例の方がわかりやすいと思った。H2O.aiではまず始めにこれをやった。

 

* 畳み込みニューラルネットの説明がわかりづらい

→単純な全結合ネットのときはニューロン同士の接続の重みを最適化するという話だったのに、次に出て来る畳み込みニューラルネットでは急にフィルタを最適化するみたいな話になっていてわかりづらかった。フィルタとか畳み込みとかいうのはちょっと高等な理解の仕方で、低級な理解の仕方としてはある層のニューロンと次の層のニューロンを距離に依存する形で重み付けするという感じになると思う。その後にフィルタとか畳み込みという話が来ていればわかりやすい気がする。全結合ネットから話が飛びすぎている感があった。

 

* 学習データの用意が大変

→全く未知の問題を学習データなしで解くのは無理で、解きたい問題があったとき、既に解けているパターンを大量に用意できないと正しく学習できない。例えば、自分の好みの女の子かどうかを判定したいと思ったら、あらかじめ自分の好みの女の子とそうでない女の子の画像を大量に用意し、それぞれを好き/嫌いで分類しておく必要がある。これがキツい。シミュレーションで生成出来るようなものならいいんだけど。

 

*何故Python

→何故かディープラーニングではpythonが主流。普通数値計算はC/C++ or Fortranなので戸惑った。仕方ないのでpythonを勉強しながらやることにした。vim scryptもpythonで書けるらしいし覚えても損はないか。

 

ディープラーニングは今のところほぼブラックボックスでなんかふわふわしている技術な感じがする。ブラックボックスというのは、問題が解けたとしても何故解けたかどのようにして解いたかがわからないということだ。文字認識ならどういうところに注目すればよいのかというところが結局よくわからないまま。わからないけど分類できるという。まさに人工知能、目の前に機械仕掛けの脳があり、こちらから質問をして答えてもらうというイメージを持っている。ここが将来改善されることを期待する。今のままディープラーニングに傾倒しすぎると、地に足のついた技術が疎かになり、ディープラーニングの限界が見えてきた時に後悔することになりそう。僕はディープラーニングを研究する予定はないので、あくまでツールとして補助的に使っていければと考えている。

ディープラーニング自体の勉強はほそぼそと継続予定だが、同寺並行でビッグデータ収集の方法についても検討する予定。

 

ジャジャガッチ | コンピュータ | 22:52 | comments(0) | trackbacks(0) |

FightCode

FightCodeというブラウザゲームをやってみた。

javascriptでロボットの行動をプログラムして戦うゲーム。

そうそう、僕がイメージしてたのはこういうやつ!昔あったカルネージハートというゲームもこういう感じらしくて気になる。

 

たとえばこのコードは砲塔を一度ずつ回しながら索敵して視線上に敵がいたら射撃、再度砲塔回転に戻るというもの。


//FightCode can only understand your robot
//if its class is called Robot
var Robot = function(robot) {

};
var n = 1;
Robot.prototype.onIdle = function(ev) //アイドル時
{
    var robot = ev.robot;
     robot.rotateCannon(n);
 };

 

Robot.prototype.onScannedRobot = function(ev) //視線上に敵がいたとき
{
    var robot = ev.robot;
    robot.fire();
};
 

次のように変えると

 

Robot.prototype.onScannedRobot = function(ev) //視線上に敵がいたとき
{
    var robot = ev.robot;
    robot.fire();

    n = 0;
};
 

敵がみつかったら砲塔回転完全にやめて連射する。でもたぶんその後敵見失ったら絶望。

 

これ面白いぞ。

ジャジャガッチ | コンピュータ | 23:13 | comments(0) | trackbacks(0) |
1/57PAGES | >> |

06
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH