stMind

about Tech, Computer vision and Machine learning

MediumのBack channelが面白い

特にSteven Levyの記事が良いです。

Webで読めるニュース記事というよりは、キーパーソンのインタビューやニュースになった事象の裏側の話がまとめられた内容で、 なんとなく本に近い感じがしました。

今のところ、6つの記事が公開されてます。

Twitterのマネタイズの話も面白いです。

Twitterはユニークユーザの増加は諦めていて(完全に諦めてはないと思うけど)、ユーザが増えなくても収益をあげられるように、 テレビとか他のウェブサイトとか、Twitter以外の場所に拡散したTweet(Off-Twitter)から収益を得るモデルを構築しているんだとか。 であれば、最近Twitterのユーザ数の伸びがなくなって成長が止まったというニュースがあったけど、実はTwitter内部ではそれほど 問題視してないのかもしれないですね。

英語で、しかも一記事が長文なので(4500単語くらいある)、全部読むのはかなり大変ですが...

Pylearn2 and Theano on python3

TL;DR

  • bleeding-edgeなTheanoであればpython3で実行可能

installation

書いてある通りのコマンドを実行すれば良い。numpyとscipyをアップグレードするときはno-depsオプションを外す。

$ pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git

Pylearn2はTheanoインストール後にinstall instructionに書いてあるコマンドを実行すれば良い。

$ python setup.py develop

tutorial

チュートリアルが出来るかどうかを確認します。

  1. データセット作成
$ python make_dataset.py

pylearn2/scripts/tutorials/grbm_smdで実行します。 実行完了すると、cifar10_preprocessed_train.pklというファイルが出来ます。

  1. モデルの学習
$ python ../../train.py cifar_grbm_smd.yaml

scriptsフォルダにパスが通してあればtrain.pyで実行出来ます。 実行完了すると、cifar_grbm_smd.pklが出来ます。

  1. 学習結果の確認
$ python ../../show_weights.py cifar_grbm_smd.pkl

結果が視覚的に確認出来ます。

f:id:satojkovic:20141214214531p:plain

アーセナルらしさとDNA

20141206-170340-8

ネスレカップ 国際女子サッカークラブ選手権2014

後半からでしたが、アーセナルレディースの決勝戦を見てきました。
残念ながら0-2で負けてしまったんですが、随所に素晴らしいプレーがあって良い試合でした。

アーセナルらしさ

ベンゲル監督が直接レディースにプレーを教えているということはないとは思いますが、やってるサッカーはボスの目指すコレクティブなプレーそのもので、ボスの哲学がここまで浸透してるのかとちょっとした感動を覚えました。Boring boring Arsenalは過去の話、今やコレクティブなパスサッカーはアーセナルのDNAとなっているのだと思いました!

それに、後半開始からバー直撃を含む猛攻で完全なるハンドのペナルティを取ってもらえず、さらにはその流れのカウンターで逆に相手にPKを献上してしまう始末...
さらにさらに、猛攻を仕掛けて今度こそという完全なるファールのペナルティはまたしても見逃しで万事休すというあるあるな展開は、見ていてちょっと笑ってしまいそうな感じでした:D

新宿御苑の紅葉 2014

もう終わりに近づいている感じではあったけど、見事な紅葉でした。

イチョウ

辺り一面が黄色で美しい。

f:id:satojkovic:20141128142555j:plain

朱色、緑、黄色と組み合わせが美しい。

f:id:satojkovic:20141128144325j:plain

パノラマ

水面に写る紅葉が美しい。

f:id:satojkovic:20141128151602j:plain

他にも

吸い込まれそう。

f:id:satojkovic:20141128143419j:plain

動き出しそう。

f:id:satojkovic:20141128151320j:plain

golangでHoG

TL;DR
  • imageパッケージで低レベルに画素アクセスすることでHoGを計算出来る
  • ただし、画素単位で画像を扱う処理を書くのは大変
  • OpenCVgolang bindingsはあるが、まだまだ発展途上(HoGは含まれてない)

golangでbinary tree

Code as Art: Binary tree and some generic tricks with golang

golangでbinary treeを作る!というので読んでみると、理解しやすかったので、実装もトレースしてやってみた。

目標

「intやstringなど特定の型ではなく、任意の型を扱えるbinary treeを実装する」となってました。

実装

データ構造体とコンストラクタ関数の定義

まずは、binary treeの構造体型を作ります。このとき、nodeは空のインタフェース型にします。

type BinaryTree struct {
    node  interface{}
    left  *BinaryTree
    right *BinaryTree
}

この型に対するコンストラクタを作ります。

func New() *BinaryTree {
    tree := &BinaryTree{}
    tree.node = nil
    return tree
}
Insert関数

binary treeのノードを作成するInsert関数を作ります。Insert関数の動作は、

  • treeと新しいnodeのデータを受け取る
  • treeが空であれば新しいnodeをこのデータから作成
  • treeが空でなければ現在のnodeの値と新しいnodeの値と比較
    • 新しい値の方が大であれば、再帰的に辿って右側に追加
    • 新しい値の方が小であれば、同じように再帰的に辿って左側に追加
func (tree *BinaryTree) Insert(value interface{}) {
    if tree.node == nil {
        tree.node = value
        tree.right = New()
        tree.left = New()
        return
    } else {
        if value < tree.node {
            tree.left.Insert(value)
        } else {
            tree.right.Insert(value)
        }

    }
}
関数型を使う

シンプルに実装できたように見えますが、これを実行するとエラーになります。

prog.go:24: invalid operation: value < tree.node (operator < not defined on interface)
 [process exited with non-zero status]

空のinterface型のvalueとBinaryNode型のtree.nodeを比較するオペレータは無効であるというものです。
intやstringやユーザ定義の型はどのように比較すれば良いのか?
そこで、最初のBinaryTree型に新しく関数型のフィールドを加えます。

type BinaryTree struct {
    node    interface{}
    left    *BinaryTree
    right   *BinaryTree
    lessFun Comparable
}

type Comparable func(c1 interface{}, c2 interface{}) bool

Comparableは、c1とc2の二つの空のinteface型に対して、c1がc2より小ならtrue、そうでなければfalseを返す。 binary treeを作る人は、どの型のtreeであるかを知っていて、比較の方法も知っているので、それを定義してコンストラクタで初期化します。 (ここは、オリジナルのエントリーとは記載の順番を入れ替え)

intの場合。

func compare(x interface{}, y interface{}) bool {
    if x.(int) < y.(int) {
        return true
    } else {
        return false
    }
}

それに合わせてNewとInsertも修正して完成です。

func New(compareFun Comaparable) *BinaryTree {
    tree := &BinaryTree{}
    tree.node = nil
    tree.lessFun = compareFun
    return tree
}

func (tree *BinaryTree) Insert(value interface{}) {
    if tree.node == nil {
        tree.node = value
        tree.right = New(tree.lessFun)
        tree.left = New(tree.lessFun)
        return
    } else {
        if tree.lessFun(value, tree.node) == true {
            tree.left.Insert(value)
        } else {
            tree.right.Insert(value)
        }

    }
}

TL;DR

  • interface{}と関数型を使うと、任意の型に対するbinary treeを作ることが出来る