エントロピーのコンセプトを簡単に説明してみる

情報理論におけるエントロピーとかいう、微妙に分かりづらい、わかったような気になるヤツを、自分用に軽くコンセプトをメモる。

今回は「自己情報量とは何か」まで。

ある事象(なんでもいい。誰かが転んだ、誰かが宝くじで当てた、誰かがサイコロで1を出した)が起きる時、その事象が起きる確率がある。
例えば、「友達がサイコロで1を出した」という事象について考えてみる。
正直なはなし、どうでもいい事象だ。しかし、
例えば、「友達が宝くじで1等を出した」という事象について考えてみると、
先程よりも、どうでもよくない事象だ。だが、
例えば、「友達がサイコロで一桁の数字を出した」という事象は、
まったくもってどうでもいい事象だ。
このような「大事な情報かどうか」を数学的に判断したいと、昔のヒトが思ったわけだ。
その方法は至って簡単で
例えば事象の起こる確率$P_{(x)}$(以降、生起確率という)が
$$P_{(x)}=\frac{1}{6}$$
ならば、その事象が大事な情報かどうかは、その逆数を見ればいい
つまり、「情報の大事かどうかを表す度合い」を$I'_{(x)}$とすると、
$$I'_{(x)}=\frac{1}{P_{(x)}}=\frac{1}{\frac{1}{6}}=\frac{6}{1}=6\tag{1}$$
と言った具合。「その情報の重要度は6です。」という風に言うことができるようになった。
じゃ他の例でもやってみよう。友達が宝くじで1等を当てたとしよう。
宝くじ1枚買ったときの当選確率は0.000005%だそうだ。
ということは生起確率$P_{(x)}$は
$$P_{(x)}=\frac{5}{100000000}$$
だから「情報の大事かどうかを表す度合い」の$I'_{(x)}$は
$$I'_{(x)}=\frac{1}{P_{(x)}}=\frac{1}{\frac{5}{100000000}}=\frac{100000000}{5}=20000000\tag{2}$$
となる。
ところで、全く「大事じゃない」情報「情報の大事かどうかを表す度合い」0になるはずだ。
やってみよう。
「サイコロを振ったら整数がでた」という情報は、全く大事ではない。だってサイコロを振って整数が出ることはわかりきったことだから。だから「情報の大事かどうかを表す度合い」は0にならなければいけない。
実際に計算してみる。
「サイコロを振って整数がでる」ことの生起確率$P_{(x)}$は
$$P_{(x)}=\frac{1}{1}$$
であるから、
$$I'_{(x)}=\frac{1}{P_{(x)}}=\frac{1}{\frac{1}{1}}=\frac{1}{1}=1\tag{3}$$
あるぇ、0じゃないぞ、となる。まったく価値のない情報の「大事度」が1なのはおかしい
どうしたものか。
そこで、昔のエライ人達は、対数とか呼ばれるものを使うことにした。$log_a B$とかいうやつ。
このときaの部分は「底」と呼ばれる数値で、情報理論で「大事度」を求めるときには$a=2$にし、Bの部分は「真数」と呼ばれる数値で、ここに$I'(x)$を入れてやればいい。この
$$log_2I'_{(x)}$$
のことを「自己情報量」といい、$I_{(x)}$と表す。
実際にやってみよう。
(1)の場合
$$I_{(x)}=log_2I'_{(x)}=log_2 6=2.58496250072\tag{1'}$$
(2)の場合
$$I_{(x)}=log_2I'_{(x)}=log_2 20000000=24.2534966642\tag{2'}$$
(3)の場合
$$I_{(x)}=log_2I'_{(x)}=log_2 1=0\tag{3'}$$
これが、自己情報量。
最後の数値はどうやって計算したかって?
「電卓」
式さえ作れたら、後は電卓がやってくれる。
というわけで、
$$I'_{(x)}=\frac{1}{P_{(x)}}$$
$$I_{(x)}=log_2I'_{(x)}$$
から、自己情報量を出すための式はこうなることがわかる。
$$I_{(x)}=log_2I'_{(x)}=log_2\frac{1}{P_{(x)}}$$

問題
すべての面が同じ確率で出るサイコロがある。友達がそのサイコロを振った所、「偶数」だったという。この事象の自己情報量はいくらか?
スポンサーサイト

sparkとかいうのをちょっと触ってみる その3

前回の続き
最終回。のつもり。
今回の記事ではspark用語"RDD""DAG"についてちょっと解説しておわり。
まずは
RDDってなんじゃ
ということなんだけど
RDDっていうのは変更されないアイテム。
ただし、
代入されない。
これがRDDの特徴。
RDDには実際のデータの代わりに、「これから代入する」という情報が、保存されている
たとえば
val raw = sc.textFile("./sample_transaction.csv")
と書いた時、みんながいつも使ってる言語なら
変数rawのために用意されたメモリ上にsample_transaction.csvの内容が代入される。
けど、sparkでは
val raw = sc.textFile("./sample_transaction.csv")
と書いた時、
「変数rawに、sample_transaction.csvの内容を代入しますよ」という動作が保存される。
このような情報を保存した変数が、RDDってやつらしい。つまり、いちいちアクセス速度の遅い補助記憶装置からデータを取ってこないで、なにかしらアクションを実行するときに初めて持ってくる。

DAGっていうのは、そのRDD同士の依存関係を保存してるグラフのことをいう。
例を挙げて説明してみる。
sample.csvのなかに"100"という数値データが入っていて、それをhogeという名前のRDDに読み込んでいる。そこに
hogehoge = hoge * 2
という処理をする。このときhogehogeは200ではなく、「hogeを2倍した数値」という処理内容が入っている。さらに
hoge3 = hogehoge + 2;
をした時、hoge3は「hogehogeに2を足した数値」になっている。
つまり、hoge3は、「hogeを2倍にした後、2を足した数値」ということになる。このような依存関係のグラフのことをsparkではDAGと呼ぶ。
こうして、いくつかのRDDと、ひとつのDAGが出来上がったあと、reduceByKeyなどをするときに初めて数値計算が行われる。
このように、計算順序を先に作り上げた上で後から演算する様子のことを「遅延評価」というらしい。
DAGを見ることで変数同士の依存関係が明らかになるため、対故障性もいいんだとか。

sparkはこのへんで終わり。ちなみにこの記事は当blog内100番目の投稿らしい。

sparkとかいうのをちょっと触ってみる その2

前回からの続き。
今回やること
1.csv読み込み
2.データ整形
3.集計
4.コンソール出力
5.ファイル出力
適当なcsvファイルを用意しておく。
今回用意したcsvファイル内容はこれ↓

id,transaction_id,name,quantity,price
1,t1,商品1,5,100
2,t1,商品2,3,150
3,t2,商品3,10,210
4,t2,商品4,2,1050
5,t2,商品5,40,80
6,t3,商品6,150,30
7,t3,商品1,10,100
8,t4,商品4,5,1050

この内容で
sample_transaction.csv
とかいうcsvファイルを作った。
作ったディレクトリと同じ場所に移動しておく。
そしてsparkを起動する。私は
spark-shell
で起動した。

sample_transaction.csvを読み込むコマンドはこう
sp1.png 
val raw = sc.textFile("./sample_transaction.csv")
rawという変数(ほんとは変数ではないけど)にsample_transaction.csvの内容が代入できた。

次に、ヘッダを取得しておく。後で取り除くために。
sp2.png 
val head = raw.first()
これで、変数headにcsvファイルのヘッダが代入できた。

ここで、transaction_id,quantity*priceという構成の新しいデータを作りたいとすると、こうすればいい
sp3.png 
val temp = raw.filter(_!=head).map(row=>{
val fields = row.split(",")
(fields(1),fields(3).toInt*fields(4).toInt)
})
これで、tempの中に目標のデータが集まった。

.take(n)を使えば、変数の中身を見れる。
sp4.png 
take(5)なら、上から5行。

最後に、transaction_idごとに集計したければ
sp5.png 
val summary = temp.reduceByKey((x,y)=>x+y)
で、OK。

今作ったsummaryの中身を表示してみる。本来ならデータ数が莫大な可能性があるのであんまりしないほうが良いそうだ。
sp6.png 
summary.foreach(println)
これで中身がどうなってるかわかる。

最後にファイル出力だが、sparkは出力にファイル名ではなくディレクトリ名を指定するらしい。その中に出力されたファイルが入ってる。summaryをresultディレクトリに出力する。
sp7.png 
summary.saveAsTextFile("./result")
これで
sp8.png 
無事resultフォルダ内に出力結果が保存された。

sparkとかいうのをちょっと触ってみる

申し訳ないけど今回の記事はmac向けです。
apache-sparkなるものをインストールして起動してみるまで
Homebrewをインストールしてない人はインストールすること。(適当なリンク)
sparkはterminalからbrewでインストールできる。
こんな感じで↓
spark2.png 
brew install apache-spark
すると、私の場合こんな風に怒られた
spark3.png 
java1.8を入れろということだったのでjava1.8をブラウザからインストールしたが、何も変わらなかった。
仕方なくエラー文を読むと、「これコピペインストールできるよ❤️」なる文言があったのでそのまま貼り付けて実行した。
spark4.png 
brew cask install caskroom/versions/java8
無事インストールされた。brewいっぱいちゅき❤️。
javaが無事インストールされたら、
もう一度
brew install apache-spark
すれば、sparkがインストールできるはず。
spark5.png 
spark-shell
と打ち込むと
spark1.png 
みたいな画面がでてくるので、これで起動できた。
この起動のしかただと、scalaなる言語をつかうことになる。
scalaで起動したあと、閉じ方がわからなかったので、私は
control+c
で、インタラクティブシェルを閉じた。
pythonなる言語を使ってsparkを使いたいなら、
spark7.pngpyspark
と打てばpythonで動かせる。
pythonのほうの終了方法は、
>>>exit()
と打つだけ。

直交座標と角度の話 その1(三角関数)

ちょっと前に、方眼紙(マス目の紙。方眼紙にx軸y軸をつけたもののことをこれから直交座標とか言うことにする)と角度の相性が悪い話をちょっとした。
だけど、傾きが1とか、傾きが-2とかじゃなくて、30度って言いたい時って結構ある。
たとえば均等に放射状に線を書きたい時。
スクリーンショット 角度をキレイに指定するとき傾きはキレイに指定出来ない
これがとっても嫌なので、直交座標と角度の関係をどうにかしたい。
そのどうにかする奴が、三角関数と呼ばれる奴らだ。
(だいたい、そういう「みんなが使いたさそうなシステム」は、昔の偉い人たちがイイものを用意してる。)
三角関数っていうのは高校に入ったら習うんだけども、その高校で習う三角関数のうちまずは一つ。
tan(角度)から始めよう。
いきなりtan(角度)とかいう呪文が飛び出て来たが、怖がることはない。だいたい、+とかxとかと同じものだと思ってほしい。ただし、足し算や掛け算とは違い、人間が計算することは少し難しい
というわけで計算方法を教える前に、まずtanとは何かというお話。
tan(角度)は「タンジェント」と読む。tangentの略記だ。んで、
tan10°とは、
こんな直線傾きのこと↓
無題
tan30°とは、
こんな直線傾きのこと↓
無題1
で、この「x軸と直線のなす角度」のことを「仰角」というので、これからは仰角という言葉を使ってく。そっちの方が短くで効率的だし。
つまり、仰角60°の直線の傾きはtan60°と書くことが出来るし、仰角135°の直線の傾きはtan135°ということができるわけ。
じゃあ、問題。

問題.
仰角20°、y軸と3で交わる直線の傾きと切片はそれぞれいくら?
無題 
答え 傾きはtan20°、切片は3。わかった?

でだ。
たとえば「傾きtan30°だよ」って誰かに言われて、その直線が書けるかというと、中々難しい。
tan30°という式が、実際にいくらかという計算がとてもめんどくさいからだ(この文を見て、tan30°はOOだよ、と即答できる人は、こんなブログを読んでないはず)。tan30°がいくらかという問題は、プログラマにとってどうでもいい問題で、そんなものはパソコンに計算させればいいだけの話だ。
ちなみに、tan30°という式は0.57735026919だそうだ(グーグル先生に「tan30°」と入れれば出てくる)。
つまり、仰角30°の直線の傾きを伝えるために、「傾き0.57735026919の直線」ではなく「傾きtan30°の直線」とスマートにいうことができるわけ。





プロフィール

すぺくとる

Author:すぺくとる
ウディタ・Unity・UE4などなど。
MUGEN関連製作物等々は下の方の”星屑の倉庫”に置いてあります。好きに持って帰っていいですよ。
改変転載は要相談ということで。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
カウンター
現在の閲覧者数
現在の閲覧者数:
カーソルに数字を入れるだけでページジャンプできますよ~

Presented by Asondara Nakamada. hen Game
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR