読者です 読者をやめる 読者になる 読者になる

なんとな~くしあわせ?の日記

ClojureとかAWSの設定とかをメモする技術ブログ

Hadoop Hive用にDockerのイメージを作ってみた

動機

  • Hiveのテスト時にいちいちEMRを起動したくない

参考にしたもの

DockerとDocker Composeについては以下のサイト

qiita.com

Apache Bigtopについては以下のサイト

how i install bigtop 1.1.0 on ubuntu 16.04 · GitHub
Running various Bigtop components - Apache Bigtop - Apache Software Foundation

使い方

Windowsの場合はsudoいらない

$ sudo docker pull hiroyuking/docker-hiveserver2
$ sudo docker-compose -f docker-compose.yml up
$ sudo docker exec -it dockerhiveserver2_hiveserver2_1 /bin/bash

意外ににDockefileは簡単に書けるようだ。しかしADDやCMDという動的な処理は1ファイルにつき1回に制限されている。
この特性を理解すれば本番環境でDockerというのもいいかもしれない。

今のところよさげな特徴

  • 起動が早い
  • 共有が簡単
  • VMをパッケージ化できる

文系エンジニアだがCourseraの機械学習コースを修了した

動機

以下の記事をQiitaで見つけて、これはいいなと思い受講してみました。

qiita.com
qiita.com

感想

学習期間

  • 2月初旬に始めていたはずなのだが、結局終わったのは5月下旬。4ヶ月かかっている。
  • 本来3ヶ月で終わるべきだが補習授業みたいな感じで期間を延ばしてもらえる
  • Courseraの携帯アプリを使って電車とか布団の中でもできたのでそれはよかった

難しさ

  • 振り返るとWeek2とWeek5が鬼のように難しかった
  • プログラミング課題はOctave線形代数に慣れてくるとクリアできるようになった
  • 英語のリスニング力は字幕のおかげで必要なし
  • それよりもリーディング力がないとついていけないだろう

学習しとけばよかったものについては以下に
nantonaku-shiawase.hatenablog.com

学習内容の振り返り

文系エンジニアにとっては、とにかく「行列、線形代数」、「ニューラルネットワーク」の理解が突破のカギのように思います。

学び

  • 機械学習のモデルを作るときは「その判断に十分な情報がある状態で人間の専門家であっても判断できる」ことが必要である
    • 人みたいないわゆる人工知能はできないのは賢明な諸兄には周知の通りだろう
    • だが、どんな人でも容易に解答可能な事象*1であれば機械学習はこれを実行できる*2、これはいろいろなことの自動化につながるだろう
  • 機械学習の精度を上げるには正しい数学的アプローチも必要だが、データ量が一番大事
  • 機械学習の定義は明示的なプログラミングなしに処理を自動化すること

ちょっとまだ良さを語り尽くせない。人間と機械で得意なこと違うので、思わぬところがデータ次第で判断できたり自動化出来るはずだ。

今後

developer.hatenastaff.com

*1:画像が何を示しているか?とか

*2:データがあれば

*3:そして競プロへ…

AOJ - ITP1_7_D を解いてみた

ITP1_7_Dは、今自分の中でブームの行列の積の問題です。生で計算しないにしても、機械学習にも大いに関係があります。

AOJ - ITP1_7_D

行列の積 | プログラミング入門 | Aizu Online Judge
自分の回答

行列の積をプログラムに起こすと?

もし自分がJavaで行列計算をするのであれば、JAMA: Java Matrix Package を使う気がします。JAMAは見た感じちゃんとオブジェクト指向的な気がします。ちなみにJavaの行列計算は全体的にパフォーマンス悪めっぽいので実際の大規模データには向かないかもしれません。

しかし、今回は競技プログラミング的なWEBテストなのでライブラリは使えません、なので生の二次元配列を使います。

問題の内容

問題自体は2つの行列を単純に掛け算するのみです。インプットの例は以下、

1:数値n, m, lが与えられる

3 2 3

2:行列 A[n][m] が与えられる、縦の数がn, 横の数がm

1 2
0 3
4 5

3:行列 b[m][l] が与えられる、縦の数がm, 横の数がl

1 2 1
0 3 2

問題の解法

手計算だとわかるのですが、これをプログラム化するのに結構苦戦しました。

行列計算の参考リンク


行列同士を掛け算すると、外側の要素が答えの要素になります。

[行列の積]
●[m×n型][n×p型]=[m×p型]
積が定義されるためには,左の列数と右の行数が等しくなければなりません。

結果は,[m×p型]となります。

なので、解答を保持する行列C = A*bとおくと、

4:行列 C[n][l] を0で初期化する

0 0 0
0 0 0
0 0 0

5:行列 C[n][l]変数i,j,kを使って埋めます。

変数は以下の範囲で動きます、が最初は行列Cの出来上がりの構造を考えたほうがいいでしょう。

  • 0 <= i < n
  • 0 <= j < m
  • 0 <= k < l