Japan.RでLTしてきた話

Japan.RでLTしてきた。 SparkRというのをつかってRからSparkを操作する話

全然準備してなくて、当日の早朝に頑張ったのは今になってみてみよく間に合ったな、と思わなくもない

その場では時間切れにより話せなかった裏話など

RDDはRのアレやこれやの操作が出来ない

まぁ当然だけど、ちょっとだけ期待はあった
いや、まだやり方を見つけていないだけかもしれない

RのデータフレームのようなノリでRDDを操作できれば
いろいろ捗るわけだが、やっぱそこは難しいのかね

あと現状だとmllibもそんなに使いやすい代物ではないで...

書き方について

Rだと文法上、Sparkでよくやるmethod chainな書き方が出来ないのがつらい
ほんとつらい

関数の戻り値を変数に入れずにそのまま次の処理の関数に渡せば関数型的な書き方は出来るが
やっぱそれだとどうしてもコードがすっきりしないしね

で、結局RでSparkいじれる意味あるの?

正直な話今のところない
Spark自体結構なメモリを使うのでMapReduceなどのIOベースより
扱えるデータサイズは限られる
なので、分散システムで一次加工したデータをRで扱う見たいなことをせずに
シームレスにその辺扱いたい要望にはそれほどマッチしないだろう

Rの弱点である扱えるデータサイズが小さかったり、速度が遅かったりといった点を補えるようになるには
やっぱRを使ってる感覚で操作できて、既存のライブラリとかとの親和性みたいな部分も確保できていないとそれほどメリットはない

現状でsparkで出来ることをscalaで書くのっていい感じだし

ここだけの話

というかこの話をしようと思った頃は個人的にsparkが熱かったのだけど、
sparkって1.0が出たあたりから盛り上がってるけど、言われてる程実力が伴ってない感も若干してる
結構メモリ喰うので、ハードウェア進化的なので将来的にはかなり使えるようになったと言われる系かもねって印象である

そんなわけで、若干個人的にsparkブームが下火になってきていた今日この頃なわけだが、
まぁ、あれだ

HiveをTezの上に乗っけてRはODBC経由でデータ取得の後、いろいろデータいじくればいいんじゃね?って思った

paragrach vectorに関して個人用に雑にまとめる

前置き

数週間前くらいちょっと話題になってた、Distributed Representations of Sentences and Documents (paragraph vectorってやつ)軽く読んでみた
非リアなので土日暇だから読んでみたけど個人的はそこまで刺さらなかったので、わりかし雑な理解しかしてない
2.Algorithmsの部分しか読んでないのであしからず

あと、word2vec やら、その元の 論文 やらは前提になってるっぽいが、その辺の知識は皆無である
故に間違ってる部分も多々あると思われるのでこの記事を見た人はあまり信用しないほうがいい

それと、基本的に私は英語が読めないのもあって結構間違って読んでる部分も多いかもしれない

なにかあればコメントで指摘いただけると修正するかもしれない(めんどくさがって放置する可能性も否定できない)

論文中にもそんなにないから数式はあまり使わない予定なのでその辺は安心してね☆
(MathJaxのモジュールを追加したのにうまく動かなかったなんて言えない。。。)

というわけで本題

word vectorとかの話

さて、前置きにword vectorのことわからんとか書いたが、前提知識として必要なので 結構しっかり触れてある

文章中の単語の並びも使うので、bag of wordsより俺TUEEEE!って話はAbstractやらIntroductionやらで触れているのだが、じゃあ何をするんだって話

例えば「ミク/さん/マジ」があったとき次に「天使」がくることを予測する
という話

文章中にその単語が確率をsoftmax関数を使って求める
文章全体での確率の積(対数の和)をとったきの値を最大化するように学習するようだ

実際には確率計算際に範囲kがあったり、1/Tで割ってたりする

softmaxでexpの中に入る関数はyは
y = b + Uh(w; W)
でbとUを学習で求めるようだ

Wは文書単語行列的なもの?っぽい
every word in mapped to a uqiue vecotr, represented by column in a matrix W.
と書いてあるのでたぶんそんな感じ

hに関しては具体的な数式は記載されていないが、 concatenation or averageとのことなので、その辺の計算しとけばいいんじゃないかな(適当)
あとsoftmaxじゃなくてhierarchical softmax使ったほうが早いよとか書いてある

学習はニューラルネットSGDつかって学習しろとさ

似た単語が空間上の近い位置に配置されて、そうじゃない場合は遠い位置に配置されるらしい

まぁ、この辺はもっと詳しい人たくさんいると思うんでそういう感じの人に聞いてください
この辺の記事とかみるといいのかも

んで、paragraph vectorって?

下記は論文中の図を引用させてもらった。

f:id:test1025:20140531225027p:plain

簡単に言うと図にあるように、
各単語だけではなく、パラグラフをそのままぶち込んだものも学習させてしまうようだ

すべてのパラグラフをmaxrixにいれて覚えておくことでそのなかでの
単語のコンテキストやトピックを失わないとのこと
PV-DM(Distributed Memory Model of Paragraph Vecotors)と呼ぶらしい

固定長の幅でパラグラフの長さを決めてスライドさせながら見ていけば
おなじコンテキストではおなじパラグラフを共有するけど、違う物には出てこないよね
んで、単語はかぶることもあるよね
ってことらしい

すでにわかってるparagraph matrixに対してはword vectorと一緒に同じ方法で計算しちゃって、
未知のパラグラフがきたらword vectorのパラメータを固定した状態で学習させるらしい

学習させた物は他のアルゴリズムの素性として使えるよ
とのこと

paragraph vectorの俺TUEEE!な所は他の手法ではラベル付けに十分なサイズの正解データが無くても
なんとかしてくれるらしい
n-gram modelより強いぜとかって話がアドバンテージとして書いてある

bag of wordsの生成

的なことも出来るっぽいことが書いてある
この辺ちゃんと読んでないです。ごめんなさい

その他

たぶんだいたいあってない気がする上にわかりづらく適当な説明になってますね。ごめんなさい・・・
まぁ、個人的メモなのでその辺はご愛嬌ということで

あと、3.Experiments以降を全く読んでないんで精度とかその辺のことはわかりません

面白そうだったら実装とかもしてみようかと思ったけど、個人的にそこまで刺さらなかったのでたぶんしないです

to 自分: はてなダイアリーから移住してきて最初の記事で数式がどうしていいかわからなかったのでその辺ちゃんと調べとくこと

退職しました

訳あって企業名は記載できませんが、1年半つとめた大手SIerを退職しました。
前職であるWeb企業からの転職ということで同じIT系とは言っても全く文化がちがい、
最初は戸惑うことも多かったわけですが、
サポートしていただいた同僚のおかげでなんとか一人前と自負できるところまでたどり着けた感謝と、
このような短い期間で退職する運びとなったことに申し訳なさを感じております。


今後についてですが、東北で復興支援を行いながら将来的には農業で生計を立てていく予定です。
これからお世話になる皆様、どうぞよろしくお願いします。




※この日記は4/1に書かれたものであり、実在する個人・団体・その他とはなんら関係ありません

ニコニコデータ研究会なるものでLTした話

これ -> http://atnd.org/event/E0024363

そんなにちゃんとデータ分析できてなかったり、なんちゃって統計、なんちゃって機械学習
みたいな感じでも、データを使って笑わせれば勝ちくらいのノリでLT枠に参戦してきた。

まぁ、発表に際してやったことは簡単な回帰くらいだが、
笑いが聞こえたり、面白かったといったコメントあったので勝ちとする

発表資料はこちら -> http://john-smith.github.io/nico_mote/

ちなみに実はこれ、以前に思いついて勢いだけで考えたものをやってみちゃった結果になってる
その時の資料はこちら -> http://john-smith.github.io/nico_mote/old/
※中身のない資料です。

そんなこんなでもうちょいちゃんと突き詰めてやるのもありかもしれないとか思ってるわけなので、
まずはオチを作るより先にちゃんとした分析でもしましょうか

あと、今回はR Presentationというのもで発表資料を作ったわけだが、
これは結構使いやすいかもしれない
細かいレイアウトどうすればいいかよくわかってないが

それと、私なんかのでどうでもいい発表より、他の方々のすばらしい発表が見たいよ!
って人はtogetterからたどってくれ -> http://togetter.com/li/639371

TokyoRの第36回R勉強会に行ってきました

珍しく勉強会参加報告。
これ -> http://atnd.org/events/47713

統計解析に特化した言語なので発表内容もその方面に偏るわけだが、
とは言ってもいろんなドメインがあって、手法もそのぶんいろいろあるので
よく聞く話から今まで全く知らなかったことまでいろいろ聞けて面白いものだ

あと、難しい話はしないので詳しく知りたい方はslideshareを見てください

というわけで内容まとめるよ

10分で分かるR言語入門 ver2.6

Rの文法やCRAN、お役立ちサイトなどの紹介
タイトルから分かるようにこれからRを始める人に向けた内容だった

10分しか話してない(実際の発表時間は計ってませんw)ので導入といった感じ

Rによるやさしい統計学 「第20章 検定力分析によるサンプルサイズの決定」

銀座で働くデータサイエンティスト( http://tjo.hatenablog.com/ )として有名なTJOさんの話

対立仮説が真であるときにどのくらいの確率で採用されるのかから始まり、

鉛筆の平均サイズが0.1mm違うってのに有意差があったとして、変えることにコストを払うだけの価値があるのか?
ってのを導入として例に上げ、Effective sizeというどの程度効果があるのかについてと、
どのくらいの効果を期待してるならどのくらいのサンプルが必要かってお話でした

knitrパッケージではじめる「R MarkdownでReproducible Research」

RPubsにも
http://rpubs.com/teramonagi/TokyoR36_Basic
http://rpubs.com/teramonagi/TokyoR36_Advanced

R Markdawnは
RStudioでおなじみknitrを使ってMarkdonwの中にRのコードをいれてそのままHTMLでレポートをかけちゃう
便利なやつ

詳しい機能紹介がされているのでRでコード書いてそのままレポートにしたいぜって方や
分析内容をまとめるてる途中で「あ、これ間違ってた。数値出し直さないと」ってことがよくある人は
読んでおくと幸せになれると思います。

あとMS Wordやtexでの提出が求められている場合の対処法も書かれているので、それらが好きな人は気をつけてくださいw

変態にRを与えた結果がこれだよ...9 RでSPADEとSNEを使って次元削減と可視化

坊主頭の変態が京都から来てなんか話してる・・・
とまずは書いておいたほうがいい気がしたので先に書いておく

相変わらずこの人は題材が面白い

SPADEが木構造のようなものを使った分類で、SNEはクラスタリングのようなもの?
内容は結構難しい話だったのでその場ではちゃんと理解できず・・・ちゃんとスライド見直して理解します。

あと、ニート卒業おめでとうございます。
本も楽しみにしてます。

EasyHTMLReport

R Markdownで作ったレポートをそのままメールで送れるライブラリを作った話
これでもうwordなんて必要なくなる!
さらにsimpleHTMLReportを使えばデータを関数に渡すだけでMarkdownすら書かなくて良くなる!

メールで報告おkな環境なら世の中がとても楽になる逸品かと

Rで学ぶ離散選択モデル

まさかの資料作成間に合わずw
後ほどちゃんとしたものを上げるとのことでしたので見つけたら追記します。

内容としては回帰分析の基礎的なことを説明した後、
mlogitパッケージで多項ロジットモデルをおこなう話でした。

ゲームパラメータの決定方法

ここからはLT大会での内容となります。

発表資料見つからず...

ゲーム中の強いレアモンスター2種類とそいつを倒す強さになるのにどの程度の課金が想定されるか
というのを例題

課金されればされるほどいいんだけどレアモンスター出しすぎるとゲームバランスが崩壊するので
シンプレックス法というのを用いて出現させる的の最大数などの制約がある状態で
課金額を最大にするには各レアモンスターの出現数をどう割り振ればいいかを求める話

linprogというパッケージでシンプレックス法を利用できるらしい

Rで見るサーモンの価格周期性

輪廻を続ける鮭の養殖業会に対して我々はなにか打つ手は無いのか

経済学のことは中学時代に習った需要と供給の曲線くらいしか分からないので、詳しいところまでは理解できなかったが、
そのような状態で価格分析する操作変数なるものを使うらしい

Rと確率分布

いろんな確率分布の紹介
分布同士の関連図が印象的

ZDNetでデータサイエンティスト講座を連載中とのこと
http://japan.zdnet.com/business-application/sp_14data_scientist/

Rで部分空間法

部分空間法というものをライブラリを使わずにRで実装した話
KaggleにあるDigit Recognizerをやってみるも結果はかんばしく無かったとのこと

パラメータチューニングなどはちゃんとやってないとのことだったので、
その辺をしっかりやると結果がどうなるのかが気になるところ

dplyrパッケージ徹底解説

検索結果のトップはこちら -> http://d.hatena.ne.jp/dichika/20140103/p1
発表内容のパッケージは予想外すぎてワロタw

RStanで作る人工データ

発表資料見つからず...

なぜ人工データを作るのかはたのしいからだそうですw
Stanというのを使って人工データを作る話なのですが、Stanを使ったことが無い(というかこの発表で初めて聞いた)ので
あまり理解できず・・・

MCMC法を使って独立ではないランダムサンプリングをするらしい

おしまい

以上となります。

総じておもったことはどうしても分析対象のドメイン知識が必要となる分野なので
やはり好きでやってることは強いなということでした。

iOSからOpenCVを使った話

iOSからOpenCVを使ってポッキーを認識させた話

初めての画像処理とOpenCV, 一年ぶりくらいのObjective-Cである。
xcodeのprojectの設定メニューのUIが変わっていたことに戸惑ったことから始まったのは内緒

まずはOpenCVを入れるて、xcodeから読み込めるようにするところから始めるわけだが、これは簡単

gemでcocoapodsを入れる

$  sudo gem install cocoapods

次にxcodeでプロジェクトを作成する
作成したプロジェクトトップのディレクトリなかにPodfileというファイルを作成し、下記を記述

pod 'OpenCV'

インストールコマンドを実行

$ pod install

あとは待つだけ。

次に、プロジェクトをxcodeで開く

$ open <project名>.xcworkspace #xcodeprojではないので注意

あとは読み込む。
ただし、C++を使う時はファイルの拡張しを".m"から".mm"に変えておく必要がある。

#import <opencv2/opencv.hpp>

UIImage <-> cv::Matの変換用のメソッドが用意されているので、
処理対象の画像をUIImageで読み込んで、cv::Matに変換してしまえば、
C++と全く同じようにOpenCVが扱える。
最後に出力する画像をcv::MatからUIImageに変換して出力すればよい。

それぞれの変換メソッドのシグニチャ

// UIImageからcv::Matに変換
void UIImageToMat(const UIImage* image, cv::Mat& m, bool alphaExist = false)

// cv::MatからUIImageに変換
UIImage* MatToUIImage(const cv::Mat& image)

んでポッキーをどう認識させるについて。
私は画像認識についてはド素人なので、
ネットでポッキーの画像を取得して、テンプレートマッチングさせた。

認識させる対象の画像に映るポッキーのサイズはカメラから取得される物のため、
スケールがわからない。
そのため、ポッキーの画像をスケールを変えながらスコアが閾値を超えたら矩形範囲を取得
という強引な手法をとった。処理速度はすこぶる遅い。

実際のコードは

//ポッキーの位置を探す画像
UIImage *img = [UIImage imageNamed:@"hoge.jpg"];
cv::Mat src_img;
UIImageToMat(img, src_img);

//ポッキーの画像
UIImage *pp = [UIImage imageNamed:@"pp.jpg"];
cv::Mat pp_img;
UIImageToMat(pp, pp_img);

// ポッキーの画像が小さいと問答無用でスコアが高くなるので、大きいスケールから順にスコアを計算する
for (int i = 200; i > 0; i--) {
        CGFloat scale = i * 0.01;
        CGFloat scale_x = pp.size.width * scale;
        CGFloat scale_y = pp.size.height * scale;
        if (scale_x >= img_scale.size.width || scale_y >= img_scale.size.height) continue;
        UIGraphicsBeginImageContext(CGSizeMake(scale_x, scale_y));
        [pp drawInRect:CGRectMake(0, 0, scale_x, scale_y)];
        UIImage *pp_scale = UIGraphicsGetImageFromCurrentImageContext();
    
        //cv::Matの画像
        cv::Mat pp_scale_img;
        UIImageToMat(pp_scale, pp_scale_img);
    
        //マッチング
        cv::Mat result_img;
        cv::matchTemplate(src_img, pp_scale_img, result_img, CV_TM_CCOEFF_NORMED);
    
        //スコア取得
        cv::Rect roi_rect(0, 0, pp_scale_img.cols, pp_scale_img.rows);
        cv::Point max_pt;
        double maxVal;
        cv::minMaxLoc(result_img, NULL, &maxVal, NULL, &max_pt);
        
        if (maxVal >= 0.55) { //閾値0.55はだいたい良さそうな結果が出た値
            //サイズ設定
            roi_rect.x = max_pt.x;
            roi_rect.y = max_pt.y;
    
            //ポッキーの位置を矩形表示
            cv::rectangle(src_img, roi_rect, cv::Scalar(0,0,255), 2);
            break;
        }
}

// 枠線を入れた画像をUIImageに変換
UIImage *result = MatToUIImage(src_img);

ものぐさな私はデフォルトで初期画面であるUITableViewControllerの背景に結果画像を出力させて動作確認していたので、
謎の線が入っているが、結果はこんな感じである

まだまだド素人だが、画像認識もなかなか楽しそうである。

偏差値のあんな話

言われてみれば確かにそうなんだけど、言われるまでそんなこと意識しなかったわw
って話が最近あった

受験をしたことがある人なら、「偏差値」というものをご存知だと思う。
この、偏差値の上限と下限はいくらなのかって話

100点満点の試験で受験生の得点が正規分に従っていて、奇跡的に
平均が50点、標準偏差10点となるような結果になったとすると
たぶん点数がそのまま偏差値になる(と思う)

では、偏差値は最大100で最小0なのだろうか?否!
正規分布の取りうる範囲は-∞ ~ +∞なので、
ものすごく頑張らなければマイナスの偏差値を取ることも夢ではない

一度その発想に至ってしまったらやってみたくなるのが人の性
えーと・・・平均50, 標準偏差10の正規分布ということで、

{f(x) = \frac{1}{sqrt{2 * \pi * 10^{2}}}exp(-\frac{(x - 50)^{2}}{2 * 10^{2}})}

で計算じゃなくて、標準正規分布から10をかけてプラス50すればいいのか?たぶん

{f(x) = (\frac{x - \overline{x}}{s} * 10) * 50}

がマイナスになればいいのか
(μとかσが数式上で「?」ってなってしまった・・・tex形式っぽいので\muや\sigmaで行ける気がするが知ってる人いたら教えてください)
test:{\mu \sigma} 行けた

で面倒なので極端な値でこいつらを計算する(Rでやってます)

> user <- sample(95:100, 999 , rep=T) #設定1:999人は95点から100点のあいだのどれか
>user <- c(user, 0) #設定2:1000人目は0点
> summary(user)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   96.00   98.00   97.46   99.00  100.00 
> mean <- mean(user)
> mean
[1] 97.456
> sd <- sd(user)
> sd
[1] 3.531364
> hensa <- ((user - mean) / sd * 10) + 50
 hensa[1000]
[1] -225.9727

みんな95〜100点をとれる1000人が受けた試験で0点をたたき出したら
無事、偏差値は-226となった

ちなみ、このやり方を利用すると世紀の大天才も作り出せるので面白い