チラシの裏の設計書

プログラム開発、データ分析からロボット作りまでものづくり全般を思うがままに書き連ねたブログ。

データ分析関連のお勉強コンテンツ

courseraの機械学習講義についての日記を何度か書いていますが、courseraのようなMOOCと呼ばれるものをはじめ、社会人や学生が新たなスキルを身につけることを支援するサービスが最近どんどん出てきています。

自分もいくつか受講したり、どんなものがあるか調べたりしたのでまとめておきます。

主にデータ分析/PG系。

(MOOC/MOOCsはMassive Open Online Course(大規模オンライン講義)の略。らしい。)

  • gacco

gaccoは日本発のMOOCです。

統計に関する講義が多くあります。印象として丁寧な講義が多く、0から学習する人でも挫折しにくいレベルかなと思います。コースを修了するためにはテストを受講する必要がありますが、そこまで難しいという感じでもないです。(簡単に満点とれるわけでもないですが。)

受講したことある講義

・社会人のためのデータサイエンス入門

・社会人のためのデータサイエンス演習

・新規事業開発スキル

統計学Ⅱ:推測統計の方法

2017/4から「統計学Ⅰ」、7月からは「統計学Ⅲ」が開講されるようです。

 

  • Schoo

schoo.jp

こちらは有料の動画学習サービスです。無料でも一部の動画が見れたり、生放送を見ることができます。内容も多岐にわたっていて面白そうなものがたくさんあります

  • coursera

代表的なMOOC

www.coursera.org

・Machine Learning 受講中

日本語字幕あり。

 

ほかにも海外のものでは

  • edX
  • Udacity

www.edx.org

www.udacity.com

 

が有名だそうです。

例えば、グーグルがディープラーニングの講義動画をUdacityで配信していたりします。

blog.udacity.com

英語苦手すぎて全部見れてないのは秘密。

 

ほかにも、高専や技科大が中心となっているFisdomや

www.fisdom.org

CtoCの学習プラットフォームUdemy

www.udemy.com

 など、おもしろそうなところがありました。

 

プログラム系の学習サービスはさらに盛りだくさんです。

私は

のように動画で学んだり、実際に問題を解くコードをごりごり書いたりするところをたまに利用しています。が、習うより慣れろ派(非効率)なので気づいたら問題ばっかり解いてます。paizaは(いい意味で)ぶっとんだプログラムゲームがあるのでたまに遊んでいます。

ついでに実際にはまだ使っていませんが、調べていて面白そうだったところをいくつか。

prog-8.com

 

codeprep.jp

 

code.9leap.net

 

こういった学習サービスはビジネスモデルがどのようになっていくのかも含め、現在注目の分野です。

Coursera Machine Learning 2週目を終えて

自分用メモ書きです。引き続きMLコースを頑張っています。

当初は半分ぐらいまで進んだら日記を書こうと思っていたのですが、思った以上に濃い内容だったため自分の復習がてら内容と感想をできるだけ1週ごとに書いていこうかなと思います。

www.coursera.org

まず、2週目の率直な感想は「あ、これ大学の授業だ」でした。

もちろん無料の動画とはいえ、有名な大学教授の方がしっかりカリキュラムを組んでいるので当然といえば当然です。ただ、「手とり足とり教えてくれるセミナー」ではなく、「勉強してくること前提」「授業では60%しかわからなくても、資料あげるから40%は自分で埋めてこい」というぐらいのノリな印象です。いろいろと学生の頃の記憶がフラッシュバックしました。ほんとに。

 

ということで内容ですが、2週目は1週目に続いて重回帰の話です。

ただし、よくある「回帰ってこういう分布になんとなく線ひくんだよー」というような説明ではなく、大学の講義らしくしっかりと理論立てて説明してくれるので非常に勉強になります。

数値解析的な解き方(行列計算)と最適化的な解き方(最急降下法)を実際に数式やOctaveを使って解説してくれます。特に(機械学習コースなので)最急降下法を中心に学んでいくわけですが、コスト関数のグラフ化を見ながらどういう風にパラメータが最適化されていくのかというのを見てみたり、学習係数の大小による違いを見たりと、重回帰の中身の原理をしっかりと理解できる内容となっている印象です。

 

~~

あと個人的に納得したのが多変数で回帰するときに、各変数のスケールが違いすぎる場合(変数Aは-5~+5、変数Bは0~1000みたいな場合)収束が著しく遅くなるということと、その場合にスケールが大体合うように標準化するのがよいということでした。

これは以前自分でパーセプトロンを組んだ時になんとなく感覚ではわかっていたことですがしっかりと現象と対策を理解できました。

~~

 

そしてOctaveの基礎的な使い方をレクチャーされたあと課題となりました。

(と、ここで「基礎的な使い方をレクチャー」とは書いたものの、これも覚えきれないぐらいの機能をレクチャーされたわけですが。。。)

課題は最急降下法で回帰をするプログラムの作成(穴埋め)です。

記述量自体は少ないですが、コスト関数や更新式周りをきちんと理解しないとできない内容です。

 

まだ序盤だと思って舐めていたら結構苦労しました。

特に自分の場合、つい先日ハトでもわかる単純パーセプトロン - チラシの裏の設計書というような内容がかなり近いものを勉強していて、Octaveも昔使ったことがあるというアドバンテージがあるにも関わらず課題でミス連発したりとなかなかボロボロでした。

2週目でこれって大丈夫かなぁと思いながらさぁ3週目いってみようー。

 

ということで、もしこの講義を受けようかと思って情報を探している方、

わりと気合を入れる必要がありますが、間違いなく「機械学習の基礎」が身に付きます。「機械学習のなんとなくのイメージ」ではなく学問としての基礎が身につく非常にいい講義ですので頑張ってみましょう。

 

CentOSにHadoopメモ

いろんなところにメモブログやメモwikiを作りすぎてアウトプット先が分散してしまっているので徐々にここのブログに集めていきます。

過去にCentOS7にHadoop(1系)をセットアップしたときの個人用メモなので、古かったり間違ってたりするかもしれませんが、記録として載せておきます。

 

javaインストール

rpm -ivh jdk-8u25-linux-x64.rpm
 
java -version
#うごくね
 
sudo rpm -ivh hadoop-1.2.1-1.x86_64.rpm --force
#依存性無視インストール、いいのかどうか。
 
#ファイルをなんか用意して
hadoop jar /usr/share/hadoop/hadoop-examples-1.0.4.jar wordcount input output
#ワードカウントを実行
 
/etc/hadoop/mapred-site.xml
#へ
<property>
<name>io.sort.mb</name>
<value>10</value>
</property>
 
#を追加。
 
#これで動いた。スタンドアロンモードだけど。
 
 
ここから擬似分散モードへ拡張
 
/etc/ssh/sshd_config
#の48付近
PermitRootLogin no
#へ
 
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
 
#> 追記:
#> RSAにしようね
#> ssh-keygen -t rsa
 
#パスワードなしでログインできるように
 
#再起動して有効に
systemctl restart sshd
 
 
hadoop設定再び
 
/etc/hadoop/core-site.xml
#にhdfs領域のパス書く
 
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/hadoop</value>
  </property>
 <property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:9000</value>
 </property>
 
#/hadoopにした chmod 777 にしとく
 
hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
 
mapred-site.xml
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
 
#そしたらhadoopデーモン起動(か再起動)
#初回は
/etc/init.d/hadoop-namenode format
#次回以降はフォーマットなし
 
#再起動用スクリプト作っとく
/etc/init.d/hadoop-tasktracker stop
/etc/init.d/hadoop-jobtracker stop
/etc/init.d/hadoop-datanode stop
/etc/init.d/hadoop-namenode stop
/etc/init.d/hadoop-namenode start
/etc/init.d/hadoop-datanode start
/etc/init.d/hadoop-jobtracker start
/etc/init.d/hadoop-tasktracker start
 
hadoop fs -ls #でエラーでないか
hadoop fs -put /var/log/dmesg input #でエラーでないか 追加されたか
#あ、だめかも
 
#hdfsユーザが作られてるのでまずパスワード設定
sudo passwd hdfs
 
hadoop fs -chmod 777 /  
#でだれでも書き込めるようにしておく
 
#(hdfsユーザじゃないとできないかも)
 
#ワードカウント実験用
hadoop fs -rmr output
hadoop jar /usr/share/hadoop/hadoop-examples-1.2.1.jar wordcount input output
hadoop fs -cat output/part-r-00* | sort -t $'\t' -n -k2,2 -r > out.csv
 
#単語出現数順に並べてローカルにもってきた。
at      10
not     9
root    7
Host    4
 
#こんな感じになってれば成功。
 
追加
mapとreduceの数を調整
mapred-site.xml
 
  <property>
    <name>mapred.map.tasks</name>
    <value>3</value>
  </property>
  <property>
    <name>mapred.reduce.tasks</name>
    <value>3</value>
  </property>
  <property>
    <name>mapred.tasktracker.map.tasks.maximum</name>
    <value>3</value>
  </property>
  <property>
    <name>mapred.tasktracker.reduce.tasks.maximum</name>
    <value>3</value>
  </property>
追記
 
R
#依存性やらなんやらでrpmいれれなかったのでtar.gzから入れてみる
#R-3.1.1.tar.gz を解凍して
/opt/R 
#で
./configure #実行してエラーになるので
./configure --with-x=no --with-readline=no
#して
make
#して
make install
 
#ふぅ。
 
 
        yum -y install vim-enhanced

CourseraのMachine Learningコースをがんばる

Qiitaを眺めているとCourseraというところで開講されているMachineLearingの講義が素晴らしいという記事が注目されていたので、その講義について調べてみました。

www.coursera.org

これはいわゆるMOOCとも呼ばれる大規模公開オンライン講義形式で行われているものです。

なかでもこの講義はスタンフォード大学の先生が機械学習の基礎から教えてくれ、機械学習を学びたい人には最適と言われているようです。

これは受けねば!と思いざっとカリキュラムを眺めてみましたが、一昔前にこれだけの内容を勉強しようと思うと独力ではなかなか難しく、大学なりで教わる必要がありました。それが今や超有名大学の講義がインターネットで見られる時代です。いいなぁ。。。いやいや、いいなぁじゃなくてその恩恵を受けねば。

 

ということで1週目から受け始めました。

(とりあえずブログで宣言しておけばドロップアウト抑止力になるかなと思い投稿)

 

まだ始めたばかりですが、現在の感想。

(かなり個人的感想だ、という前置きをしつつ、、、)

様々なところで「機械学習入門者はぜひ!」という感じで言われていますが

あくまで「前提としてある程度の数学知識や機械学習自体への興味があって」機械学習の基礎理論から学びたい、という人向けという印象です。

「なんか最近"機械学習"ってよく聞くからどんなものか知りたい」という意味での入門者はたぶん1週目でそっとブラウザを閉じる結果になるのでご注意ください。

 

あと、英語力があるとだいぶうれしいです。動画は日本語字幕もありますが、途中途中の問題や説明文は日本語がない場合も多々あります。

私は英語力がないのでグーグル翻訳片手に奮闘してます。

 

レガシーな人間のCSS関連メモ "rem"と"vh"

久しぶりにWebページ作成をすると、いろいろと時代に置いていかれているところがあって刺激になります。

ほんと進歩の速い分野です。

フロント系の方々にとっては常識かもしれませんが、とりあえずメモ。

 

  • "rem"という単位が導入されてた

ルートのfont-sizeを基準とした単位らしい。

html{font-size:10px}

と定義しておくと

p{font-size:1.5rem}

は10×1.5pxに対応するようです。

"em"のroot要素参照版なので"root em"→"rem"だそうな。

レスポンシブ対応などで効果を発揮しそうな予感です。

 

  • "vh","vw"という単位も導入されてた

これまた単位ですが、viewportに対して大きさを指定できるようです。

pxのような絶対値指定でもなく、%のように親要素に対する割合でもなく、見えている領域に対する指定ができます。

画像の表示などで便利そうです。

参考:【CSS3】最新の単位[vw][vh][vmin][vmax]の解説。 - ONZE

 

  • CSS直書きはもう古かった

これはなんとなくそんな気はしていましたが、直接CSSを記述するよりも変数が使えたりするメタ言語で書いてからCSSに変換するのが今や一般的なんでしょうね。

bootstrap4が使いたくて中身を除くとLESSも同封されていました。

また勉強しておかなくちゃ。。。

 

参考:CSSのメタ言語Sass(SCSS)、LESSの完全入門 - Qiita

 

 

ポートフォリオサイト(という名の自分の備忘録がわりのアカウントリスト)を作ろうとWebページ作成を始めたのでこういった発見がまだまだありそうです。

R言語のifelseを条件演算子的に使うときは注意

偉そうにR言語の入門記事を投稿したその日にやってしまったミスを紹介。

qiita.com

 

R言語でifelse()という関数があります。

ifelse(条件,真の時,偽の時) のような書き方をすることで条件に沿った方が戻り値として得られるというもので、ほかの言語でいう条件演算子のような使い方をしていました。

条件演算子: 条件 ? 真の時 : 偽の時 というやつ

 こういう書き方をした時に思わぬ動きをしました。

model <- ifelse(条件, modelA, modelB)

 やりたかったこととしては条件によりどちらのモデルを採用するかを決めるというもの。

modelA/Bの中身はlist構造でいろいろなものが詰め込まれています。

この書き方で条件がTrueの時、得られたのはmodelAの一部分になってしまいました。

これはmodelAのlistの一つ目(いわばmodelA1)だけが返ってきていたためでした。

 

なんだこの仕様はと思ったものの、よく考えればR言語は基本的にベクトルを扱うわけで、ifelseもこういった入力を想定しているわけです。

NewVec <- ifelse(c(T,F,F,F,T), c(1,1,1,1,1), c(2,2,2,2,2))

NewVecはc(1,2,2,2,1)となる

そう考えると、条件部分に一つしか真偽値が入ってなければ、一つだけしか返さないよというのも変な仕様とは言えないなと。

 

ifelse( 1==1, list(a=3, b=5), list(c=6, d=9,e=10))

↑で帰ってくるのは"3"のみ。

 

注意。注意。

Shinyアプリを配布できるようにするよ

既出情報ではあるんですが、日本語情報があまりないので英語拒絶症の人(主に自分)のためにまとめておきます。

 

☆やりたいこと

R言語のWebアプリが作れるフレームワークShinyで作ったアプリをR言語環境がない人に配布したい。

 

☆やること

配布可能なR環境の「Rポータブル」と「ブラウザ」と「Shiny起動バッチ」をセットで渡してあげるとうまく動くよ、という内容。

R環境まるまる送ってるだけじゃん、という突っ込みはなしで。

難しい設定をせずにダブルクリックしたら使える、ということに価値があるのだ!(たぶん)

 

☆情報源

www.r-bloggers.com

Tutorial: Packaging your Shiny App as an Windows desktop app

いわば、これらの素晴らしい情報の日本語訳なだけです。

 

☆手順

・各種リソースの配置

以下のスクリプトやファイルを任意のフォルダに配置します。

あとで使うのでlibrary置き場もメモしておきます。

App/

 ├ Shiny/

 │  ├ ui.R

   └ server.R

 ├ FirefoxPortable/

   └ FirefoxPortable.exe

 ├ R-Portable

     ├ R-Portable.exe

     └ App/

       └ R-Portable/

         └ library/

 

・Shinyアプリの作成

通常の開発環境でShinyアプリを作ります。

このとき、server.R側に一部追加します。

```R: server.R

shinyServer(function(input, output, session) {

  session$onSessionEnded(function(){
    stopApp()
    q("no")
  })

})

```

太字の部分を追加してRを終了させるコードを追加しておきましょう。

 

・ライブラリのコピー

Shiny実行に必要な以下のライブラリを上記のRポータブル内のlibraryフォルダにコピーします。

- shiny

- sourcetools

- htmltools

- R6

- xtable

- httpuv

- Rcpp

- jsonlite

- digest

- mime

 

・Rポータブルのダウンロード

sourceforge.net

ダウンロードして解凍しておきます。

 

・ポータブルブラウザ準備

情報元の例ではGoogle Chrome Portableを使っています。

ほかのブラウザでもできることを検証するために今回はMozilla Firefox, Portable Editionを使ってみます。

 

・Shiny起動スクリプト

Shinyをブラウザとポートを指定して起動します。

スクリプト自体はRで書きます。

```R: runShinyApp.R

.libPaths("./R-Portable/App/R-Portable/library")
# the path to portable firefox
browser.path = file.path(getwd(),"FirefoxPortable/FirefoxPortable.exe")
options(browser = browser.path)
shiny::runApp("./Shiny/",port=8888,launch.browser=TRUE)

```

・起動スクリプト

最後にShiny起動スクリプトをRポータブルで実行させる起動スクリプトを準備しましょう。

```VBS: run.vbs

Randomize
CreateObject("Wscript.Shell").Run "R-Portable\App\R-Portable\bin\R.exe CMD BATCH --vanilla --slave runShinyApp.R" & " " & RND & " ", 0, False

```

こちらも情報元のものをそのまま使わせていただきました。

 

・起動テスト

run.vbsをダブルクリックで、ブラウザが起動してShiny画面が出てくれば成功です。

f:id:stkdev:20170212004312p:plain

いい感じに起動できました。