投稿

8月, 2014の投稿を表示しています

Machine Learning (Andrew Ng) @ Coursera その5

Classification

binary classification problem

線形回帰は覚えたけど、これを分類問題に適用することはいい考えではない。
そこでロジスティック回帰が出てくる。

ロジスティック回帰は回帰というくせに分類問題に使われてて、
離散的な分類値に対して、0~1の値を取る関数を当てはめる。


Advanced Optimization

これまでは最急降下法を最適化アルゴリズムとして採用してきたが、
もちろんこれ以外にも最適化アルゴリズムが存在している。
例えば、
Conjugate gradient
BFGS
L-BFGS

と言った具合に。

ただ、数値計算のエキスパート出ない限りは直接実装するべきではない。
まずはライブラリ使うべき。
機械学習のライブラリを試していいライブラリを使ってまずは慣れる。
その中でいい実装悪い実装を見分ける。
Octaveはアドバンスドな最適化アルゴリズムが提供されているのでとりあえずはそれ使う。

optimset() と fminunc() をつかってアドバンスドな最適化を行う。
使い方としては、コスト関数の各パラメータに関する偏微分値とコスト関数値を返す関数を引数として渡すだけっぽい。


Multiclass classification

複数クラスの分類問題についての話。
複数クラスの教師セットを与えられた時は、one vs all(one vs rest) と呼ばれる分類問題を解くことになる。

A,B,Cに属するクラスは、Aと(B,C)に属するクラスで教師セットを分けて、
それらの決定境界を導出する。 
=> Aになる確率が求まる。

Bと(C,A)に属するクラスで教師セットを分けて、分類器を適用し決定境界を導出。
=> Bになる確率が求まる

Cと(A,B)に属するクラスで教師セットを分けて、分類器を適用し決定境界を導出。
=> Cになる確率が求まる

確率を比較して一番大きい物を採用すれば良い。



Machine Learning (Andrew Ng) @ Coursera その4

イメージ
自学自習でOctaveの設定変更してみた。
Octave起動するといろいろ設定がdefault臭してすごく効率が悪い。
こういったときは .bashrc ならぬ、 octaverc なるものがあるんですわ。
この設定ファイルは、パス的には以下になります。
( 私のインストール先はCドライブ直下なのでその辺は読み替えて下さい。 )
 C:\Octave\3.2.4_gcc-4.4.0\share\octave\site\m\startup


で、2つの欲望を叶えるためoctavercを書き換えます。

1つは、起動時から自分の作業ディレクトリに飛びたい
2つは、糞長いプロンプトをPython風に ">>" にしたい

夢を叶えるスクリプトは以下のとおり。

## System-wide startup file for Octave.
##
## This file should contain any commands that should be executed each
## time Octave starts for every user at this site.
cd D:\Octave # Move to working directory
PS1(">>") # Change prompt
全然難しくないですね。


Plotting Data


clear;
t  = [0:0.01:0.98];
y1 = sin(2*pi*4*t);
y2 = cos(2*pi*4*t);
plot(t,y1);
hold on; # hold figures to overlap plotting
plot(t,y2, "r");
xlabel("time");
ylabel("value");
legend("sin", "cos");
title("my plot");
close;
cd "data"
print -dpng "myPlot.png" # png is file format
cd ".."
figure(1); plot(t, y1);
figur…

Machine Learning (Andrew Ng) @ Coursera その3

イメージ
今回はOctave マンセーうぇえ~いって話。
機械学習やらパターン認識で、Java C++ Python numpy Rとか色々ありましたねぇ。 でもそれらって結構実装に時間食うよね?めんどいよね?PDCA回すの遅れるよね?
シリコンバレーではこういった問題にはとうの昔に気付いておりまして、 すぐにこういった言語で実装し始めるんじゃなくて、 まずはプロトタイピングとしてOctaveが使われておりまっせ。
まずクイックにPDCAを回す競争力の高い企業が集結したシリコンバレーでは、 アイディアの実証がサクッとできてカネがかからんやつがプロトタイピングとして好まれたわけか。
ちなみに、Matlabでもいいんだけどクソたけーよって話もある。 あと、Python numpyでもいいけど、構文ちょっとややこしいやんけ。
とかいう感じで他の言語を軽くディスった上で、今日はOctaveの素晴らしさを布教しようじゃありませんか。


以下、コマンドメモり散らし!

変数の取り扱い
>>1 ~= 2 ans =  1 >>1 && 0 ans = 0 >>1 || 0 ans =  1 >>xor(1,0) ans =  1 >>1 == 1 ans =  1 >>1 == 1 % this is a comment ans =  1
>> PS1(">>>") % prompt would be changed to >>>
>>a = 3; % semicolon suppressing input >>b = "hi"; >>a = pi a =  3.1416 >>disp(sprintf("2 dicimals: %0.2f", a)) 2 dicimals: 3.14 >>
>>format long >>a a =  3.14159265358979

行列の基礎的な取り扱い
>>A = [1 2;3 4; 5 6] A =
   1   2    3   4    5   6
>>v…

Machine Learning (Andrew Ng) @ Coursera その2

第二回目の Machine Learning by Andrew Ng氏

今回は、線形回帰問題の解法として、最急降下法と正規方程式があるけど、
それらの特性について理解しようぜという話が主。


Feature scaling

最急降下法の収束スピードは各軸の値のスケールが近い方が速い。
スケールが揃っていないと、最急降下法における微分値が大きくなるケースが増えて(?)、
収束が遅くなる。
歪んだ楕円形を解消するため、各軸の数値をスケーリングすると収束特性が向上する。
この辺の数理的な背景については言及しないが、図的には納得の行く話。


覚えること:
 フィーチャーを同じ範囲に入るようにスケーリングすることで早く最急降下法が収束する。
 ( ⇔ より少ないイタレーション回数で収束する)

フィーチャースケーリングの一つとしては、Mean normalizationが便利
平均値で引いて、標準偏差でスケーリングするいわゆる標準化と呼ばれるよく知られた手法。


Gradient Descent in Practice Ⅱ

最急降下法が正しく動作していることのデバッギング方法は、
イタレーション回数を横軸とし、コスト関数の値をプロットすること。
コスト関数が凸で、ステップ長が十分小さければ単調減少するはず。

自動収束判定を行うには閾値を設定する必要があるけど、
それの決定は非常に難しい。
だから、割とコスト関数をプロットして大体の収束判定をグラフィカルに判断することも実務上はよくあること。

コスト関数が収束しないなーと思ったら、
単純に実装ミスか、イタレーションのパラメータ(ステップサイズ)が大きすぎるかを疑ったらよさげです。

収束には向かってるんだけど、コスト関数の収束が遅すぎるなぁと思った時は

こういうのも、図的なイメージが頭のなかに入っていれば、
コスト関数の挙動を見つつ何が原因かを相応できるんじゃないでしょうか。

Normal Equation

正規方程式の話は数学的な話はすっ飛ばして、
データが困難だったらこんな行列Xと教師セットから行列X,ベクトルyを当てはめて

pinv(X'*X)*X'*y すればおk

って感じでした。
ちなみに最急降下法では教師セットの各入力変数のスケールが合ってなかったら揃えてたわけだけど、
正規方程式使う場合は別に微分してイタレーションし…

Machine Learning (Andrew Ng) @ Coursera その1

イメージ
Machine Learning
by Andrew Ng Machine Learning by Andrew Ng =>  https://class.coursera.org/ml-006


Coursera上に転がっている、Stanford大学のAndrew Ng先生の、
Linear Regressionの講義がこれまでに無いわかり易さで感動した。

線形回帰を説明するのに、多変数関数のベクトル微分や凸関数の理解が、
きちんとした理解のためには必要なわけだけど、

- 変数を絞る
- 具体的なデータをプロットして図的に説明する
- 凸関数・偏微分などの細かい事項はスキップ

といった気遣いのお陰で、回帰という問題を万人に(高校生レベルでも)わかるように説明されていた。

おそらく線形回帰の説明を日本の大学で受講すると私の経験上、
偏微分だー凸関数だー行列演算だー
が始まって本質と違う部分で挫折する人間(私)が量産されているはずなんですよ。

できるだけシンプルに、平易な言葉で説明することって
本質が何かを把握した人間にできる所業なのだとひしひしと感じた。



加えて、

基本的には線形回帰は正規方程式で数値的に陽に解けるわけだけど、
最急降下法でのイタレーション処理は、比較的大きなデータセットにおいてはスケールする点にも言及されていたり

講義の冒頭で、
シリコンバレーのエンジニアはOctaveを使ってサクッとプロトタイピングしてから、
C++等の静的型付け言語で書きなおしているとの話もあったり


で最高のコンテンツだと思いました。



話は変わるが、


MOOCとよばれるオンラインの教育コンテンツがこれほど良質だとは思わなかったので驚愕している。
おそらく普通に東大京大通うより効率いい気がしてる。
# 東大通ったこと無いけど。


気になってGoogle trendsでMOOCの主要どころのサービスを検索したところ、
インド・シンガポール・アメリカといったIT + 英語が強い国で人気っぽい。
残念ながら日本がない。。。
今の日本の大学生にもっと広まれば、自分とは比較にならんくらい賢い学生が量産されるのではなかろうか。
逆に、こういった流れに乗れなければIT分野でますます突き放されるのではなかろうか。


ちなみに最近日本語の字幕が出るようになったので、
英語非対応の脳味噌をお持ちの方…

dotinstall:: Ruby on Rails4 のメモ

#05 タスク管理アプリを作ってみよう

  390  rails new taskapp --skip-bundle

一度インストールしたgemのskip

  391  cd taskapp/
  392  emacs Gemfile

therubyracerのコメントアウトを消す。
gem 'io-console' を追記する

  393  rails s

サーバー起動させて動作確認

  396  rails g model Project title

モデル生成。
頭文字は大文字、単数形。

  397  rake db:migrate

DBに反映させる

#06 rails db/rails consoleを使おう

  398  rails db

sqliteのインタラクティブシェル開く

  399  rails console

irb開く

#07 Controllerを作ってみよう

  401  rails g controller Projects

コントローラ生成

  403  emacs config/routes.rb

ルーティングの編集。
resources :projects を追記

  404  rake routes

ルーティングの確認


#08 Projectsの一覧を表示させよう
  407  emacs app/controllers/projects_controller.rb
こんなの作る class ProjectsController < ApplicationController
  def index
    @projects = Project.all
  end
end
  408  touch app/views/projects/index.html.erb   409  emacs app/views/projects/index.html.erb
こんなの作る
<h1>Projects</h1>
<ul>
  <% @projects.each do |project| %>
  <li> <%= project.title %> </li>
  <% end %>
</ul>   410  …

今日もRails作業メモ

Ruby on Railsで簡単なブログアプリを作成。
 $ rails new sample_app_0819    # Projectを作成  $ cd sample_app_0819/
 $ emacs Gemfile     # gem 'therubyracer' 部分のコメントアウトを削除して gem 'io-console' 追加
 $ bundle exec rails g scaffold book title:string memo:text    # scaffoldでbook作成  $ bundle exec rake db:migrate    # データベースに反映  $ bundle exec rails s    # サーバー起動









クソな仕事を量産するエンジニアはマジで要らない子。

「開発が苦労してることなんてお客さんこれっぽっちも理解しないから、
ユーザーが求める価値を提供できなかったらそのエンジニアの仕事はクソだよ」




つっけんどんな言い方。





だけど響いた。




脳に、刺さった。




いつもこういうものの言い方をする先輩がいる。


言われた時はもうまじでガッペむかつく!!



3分言われた意味を冷静に考える。



反論のロジックを練る。




練る。



練る。



。。。なんも出てこない。



論理的に正しい。



はい、私がクソだ。









結局は実装とコストのトレードオフなんだけど、


エンジニアがマジで極限にギークだったら、


どれもこれもコストゼロに漸近して、



一瞬で価値提供できて、


会社ガッポガッポ。












付加価値が出せていない。



下位レイヤのせい、システムアーキテクチャのせい。


そんなエンジニア、まじで要らいない子。





結論!!




頑張ろう。



批判の中に、建設的な意見を入れよう。



いつも語尾は「できる」にしよう。

Ruby on RailsをEC2上で実行してみるの巻

動作環境の確認

blogアプリをGithubからcloneして鯖立てしてみる。
http://iti.hatenablog.jp/entry/2014/05/20/163244
記述通り実行したらちゃんとEC2上で動作しました。
実行環境が問題ないことがわかって安心。
スクラッチからRails
次に、スクラッチからRailsを実行してみたら以下のエラー発生。
$ bundle exec rails g scaffold book title:string memo:text /home/ec2-user/.gem/ruby/2.0/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:247:in `require': cannot load such file -- io/console (LoadError)
このエラーが出た時は、
gem install io-console してGemfileに gem 'io-console' を追記すれば良い。

参考URL:
http://stackoverflow.com/questions/23184819/rails-new-app-or-rails-h-craps-out-with-cannot-load-such-file-io-console

Scrapyでスクレイピングする話@ Pytexas2013

イメージ
スクレイピングをPythonでやるのに、
urllib2とかrequestとかbeautifulsoup組み合わせて実装するの面倒ですよね。
スクレイピーはそういったタスクを全部やってくれて、おまけにクローリングのスケジューリングとかもできてしまうフレームワークがあります、それがScrapy。

Githubに講演者がGithubにレポジトリあげてくれていた。
https://github.com/dmclain/scrapy-pytexas-2013




/spiders/talkspider_basic - parse a single page and yield a series of items
単純に1ページをスクレイプするscrapyのデモ。

PytexasItemは収集する要素のクラス。
データモデルを定義しています。

classPytexasItem(Item):# define the fields for your item here like:# name = Field()title=Field()time=Field()speaker=Field()description=Field()


TalkspiderBasicSpiderはクロールする際のスパイダーを実装します。
name, allowed_domains, start_url はクラスの要素で、
その名の通りスパイダーがクロールするドメインとかURLを指定します。
name is used for internally keeping track of なので内部的に利用されるクラスの要素です。



classTalkspiderBasicSpider(BaseSpider):

Ruby on Rails 入門 その1: 簡単なアプリを作成してみる

1. myapp プロジェクトを作成

$ rails new myapp DL is deprecated, please use Fiddle create create README.rdoc create Rakefile create config.ru create .gitignore create Gemfile create app create app/assets/javascripts/application.js create app/assets/stylesheets/application.css create app/controllers/application_controller.rb create app/helpers/application_helper.rb create app/views/layouts/application.html.erb create app/assets/images/.keep create app/mailers/.keep create app/models/.keep create app/controllers/concerns/.keep create app/models/concerns/.keep create bin create bin/bundle create bin/rails create bin/rake create config create config/routes.rb create config/application.rb create config/environment.rb create config/secrets.yml create config/environments create config/environments/development.r…