checkioが意外と楽しい

プログラミング言語は使わないと忘れるので、時間があるときにcheckioというサイトでコーディングの練習?をしています。

checkio.org

PythonJavaScriptが選べて、課題に挑戦してクリアすると、他の人が同じ課題のために書いたコードが見れて、あ、こんな風に書けば良いのねという勉強になって、何かと楽しい。もちろん?やっているのはPythonの方ね。

最近やったのは、こんな課題。

金額と硬貨の組み合わせが与えられていて、金額を支払うのに何枚の硬貨を使うのが最小か?というような問題。この手のアルゴリズムの問題をまともに取り組んだことなかったので、結構ドハマりして、ものすごい遅いコードを書いてなんとかクリアして、他の人の書いたコードを試してみたらサクッと動く。それを参考にして、自分なりにもう1回コードを書き直してみたのがリンク先ね。

恥をさらして、このアルゴリズムを理解するまでの苦節を残しておきます。

だいたい、どのコードを見ても金額+1個の箱を用意しているというのは共通していて、入っている数字も、一部Noneを使うか無限大(int('inf')を使っていることを除いて同じ。例えば、12円を1円玉、3円玉、5円玉の組み合わせで支払うと、箱はこんな感じで埋まって、最後の箱に入った4が最小のコインの数としての答えになっている。

f:id:deutschina:20180407101122p:plain

箱の中の数字が全体的にはカウントアップされているけど、8とか10みたいに前の箱から数字が減ってるところもあって、多分ここら辺にヒントがあるだろうなと思いつつ、正解として表示された内包表記でおしゃれに書かれたコードを分解して書き直しているうちにようやく理解。

8円の箱を例にすると、この箱に対して1,3,5円を順に当てはめようとしているんだね。

最初は1円。ここに1円を入れるということは、前のステップで7円地点にいたことになる。つまり、8円目を1円玉で払うと7円の時点で使っていた3枚に1枚プラスして4枚目のコインを使うことになる。

次に3円玉を使おうとすると、前のステップは5円だから、5円の時点の1枚プラスさらに1枚なので2が入る。5円玉も同じ要領で3円から1枚の追加で到達できるので同じく2となる。

言い換えると8円に到達するための最小のコイン数は、3円玉+5円玉または5円玉+3円玉の計2枚ということになる。1円玉だと4枚目投入になるのでダメ。というようなことを12円まで繰り返すと、問の答え(4枚)が得られるわけだね。

と、ここまで書いて、これって昔ちろっとかじった最短距離を求める問題に似ている、というか同じだねと気づく。

ということで、ボケ防止(早いかw)に時々取り組もうと思ってます。

エレガントな問題解決 ―柔軟な発想を引き出すセンスと技

エレガントな問題解決 ―柔軟な発想を引き出すセンスと技

アルゴリズムパズル ―プログラマのための数学パズル入門

アルゴリズムパズル ―プログラマのための数学パズル入門

Nokia Steel HRにしたよ

かなり以前にJowboneの活動量計を使っていたんだけど、この度Nokia Steel HRを使い始めたという話。

今回の導入に当たっては、大人の事情でFitbitなども検討したけれども、決め手になったのは、2010年から我が家はWithings(現Nokia)ユーザというのが大きい。

これで2010年からの体重がすべて記録されており、これに歩数と睡眠の記録がもれなく追加されて、1つのアプリ(Nokia Health Mate)の中で確認できるのは大きい。

これは体重の推移。見事な右肩上がりw

f:id:deutschina:20180306111356j:plain
体重の推移

続いては歩数の記録。これは1日分だけ表示しているけど、30分単位で歩数が確認できる。

f:id:deutschina:20180306111413p:plain
歩数

睡眠の記録。昼寝なんかの寝落ちも記録される。Jowboneのときは、これから寝るぜとボタンの長押しが必要だったのに比べると楽だね。

f:id:deutschina:20180306111400p:plain
睡眠

心拍数については、運動モード(時計のボタンを長押ししてスタート/終了)中は細かく計測してくれる。このグラフは、自宅から最寄りの数駅先まで歩いて行った時の記録。

最後にある心臓破りの坂で心拍数が上がっているなんていうのがよく分かる。

気になるバッテリーは3週間程度持つとのこと。商品到着の時点で71%ぐらい充電された状態だったので、そのまま充電せずに使い始め、使用10日目ぐらいに51%ぐらいまで減ったのでとりあえず充電。残量を気にせずに使えるのは良いけど、歩数と睡眠を記録するとなると、外す時間がお風呂に入るときぐらいしかないので、充電のタイミングをどうするかが課題?ただ、充電は結構速いので、例えば自宅やオフィスで着席している間に充電するみたいな感じで良いのかなと思ってます。

ということで、結構気に入っています。




ただね、コンセプト的にはこういうやつの方が好きなんだけど今回は見送り。

バンドにスマートウォッチの機能を持たせて、ヘッドを自由に変えられるなんて、初めて知ったときは感動したんだけど、個人的に見送った原因は3つ。

  • 活動量がNokia Healthと連係できない
  • Suicaが使えない
  • ヘッドは好きなものに変えられるのは素晴らしいが、自分が気に入っているヘッドには変えられない(形状の違い)

特にSuicaが使えるなら、iPhoneに縛られる必要がなくなるんだけどね。。。ま、今後に期待ですね。

機械学習のお勧め本

100%主観だけど、優勝はこの本だね。

 

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

 

 前の記事でも書いたけど、機械学習関連の本を何冊か手を動かしながらやってみて、この本が一番しっくり来ました。もちろん、ある程度機械学習に慣れ親しんだ後に出会ったからという多少の「バイアス」がかかった結果というのは否定しません。それでも、機械学習やろうと思っている人の少しでも背中が押せればということで、気に入ったところを書いてみようと思います。

 

対象となる人

読む人によってバックグラウンドが違うから、感じ方も様々なのは当たり前。なので、同じような感想を得られそうなのはこんな人かな?というのを書いておきます。

 

  • 数学は高校まで。微積分の授業で習ったことをうっすら覚えているが、テストの問題は解けないぐらいに忘れている
  • プログラミング言語に多少は慣れ親しんでいる。仕事ではフルに使わないが、簡単なコードは書ける。Pythonが分かればベスト
  • がっつり統計学は勉強していないが、学校で統計入門の授業を取った、もしくは実務でExcelなどを使ってそれっぽいことをやった。平均と中央値は違うよねみたいな話ならついていける

 

これ、お前のことじゃね?と言われれば、はいその通りですとしか言えない(笑)。前置きはこのぐらいにして、気に入ったところを書いていきます。

 

概要から入って詳細に進むスタイル

 細かい事は後で説明するからとりあえず動かしてみようぜてな訳で、かなり最初の方に、Scikit-learnのトイセットではないデータをダウンロードしてきて、それをPandasのDataframe使って加工して、数値とそれ以外に分けて、カテゴリはOne-hot encodingして、これをまた1つにマージして、最後はPipelineで一気に処理するみたいな。

 

前の本では最終章手前に出てきたのにもうPipelineとか出てきてマジか?と思ったけど、これを最初の頃にやって流れを押さえてあるから、後の方を読んでも、「今、ここを深掘りしてるのね」というのが分かって迷子にならないというメリットがありました。

 

後でディープラーニングに進むことを前提にしている

タイトル見れば書いてありますが、with Scikit-learn & Tensorflowとあるように、前半は主にScikit-learnを使って、後半でTensorflowが登場するという流れになっています。

 

ただ、後半になって話がガラって変わるのではなく、前半からちょいちょい伏線を張っています。お恥ずかしい話、Gradient Descent(GD)なんてニューラルネット以降じゃないと使わないと思っていたら、早くもLinear Regressionの段階で、Closed-formの式で最適なパラメータを求める以外にGDを使うアプローチもあるんだよという流れから、一気にBatch, Stochatic, mini-batchを紹介してくれています。ディープラーニングに入った後に、これらの概念がポンと入ってきてアワワとなるより、はるかに良いかなと思います。

 

ニューラルネットは計算量が多いので、ミニバッチとかSGDを使うという他の本の説明も正しいとは思うんだけど、この本の流れだと、あ、あのときやったやつねという感じで心のハードルが間違いなく下がると思う次第であり。。。ちなみにSoftmaxもLogistic Regressionのあとのところで、多少ねじ込み感があるものの登場しております。

 

だって、今の時代(2018年はじめ)だと、もうニューラルネットとかディープラーニングは避けて通れないわけで、後でそこにたどり着く前提で書いていてくれるのは、逆にありがたいよね。

 

おまけの充実度

最近の本では、Githubリポジトリへのリンクが書いてあって、最新の情報はGithubを見てねというのは 、もはや普通。ただ、この本の場合、オマケが相当充実してます。(ググれば出てくるけど)敢えてリンク張りませんが、線形代数の基本とか、matplotlib、numpy、 pandasの基本的な使い方まで丁寧に用意してくれています。

f:id:deutschina:20180118152440p:plain

 別の本を写経しているときに、このグラフの出し方を知りたいんだよ!というイライラがあったけど、この本に関しては基本的なところはこれらのファイルを見てねという感じでさらっと書いてあって、いざファイルを開いてみたら・・・結構なお得感。

特に、自分のように数学が結構ご無沙汰で、なんで行列とか出てくるの?みたいな人は、数学と線形代数のドキュメントを軽く斜め読みするだけでも、頭に入ってくる感じが全然違うと思います。

 

数式は多め

これは普通、ネガティブ要素なんだけど、この本に関してはポジティブに捉えて良いと思います。上に書いたオマケの数学と線形代数のドキュメントだったり、遠い昔の高校数学の記憶を頼りに読み進めてもなんとか追いつけるレベルなのと、特に前半は、式に対して丁寧に補足していたり、前の式とはここが違うんだよというのを書いてあるのが嬉しい。

 

本当に初期の頃は、ベクトルって書いてあるのに矢印じゃなくて、[1.2, 3.3, 5.0]みたいなリストになっていたり、縦横入れ替えるTransposeって何それおいしいの?レベルだったけど、式の要素とかの説明が相当丁寧だったので、繰り返しているうちに長い式を書くより行列計算にした方が簡潔に書けるんだねとか、行列を入れ替えるのはドット積を求めたりするのに要素数を合わせるためにやっているんだねというのが見えてくると、逆に「機械学習ってすごい難しい数学使っている訳じゃないんだね」というのが見えてくるから不思議。

 

こんな感じで、毎日楽しく手を動かしながら進めている(まだ進行形)訳なので、みんなも読んでみれば良いのにと思うのですが、ネガティブかもしれない要素についても書いておこうと思います。

 

この本、高くねーか?

自分が書籍版買ったときは、書籍版は6,000円しなかったと記憶しているものの、米ドルで49ドルぐらいなので、換算レート的にそこまでぼったくられている訳ではないと思います。高い安いという感じ方は人それぞれな訳で、高いと思うならもっと安い日本語の本を探せば良いのかなと思います。自分の場合は、いつでも見れるように書籍版を手に入れた後に、Kindle版も買ったので9,000円ぐらい払ったことになっているけど、別に高い買い物をしたという感覚はないですね。

 

ちなみに、書評を見るとKindle版の数式のレイアウトがひどいという指摘があるのですが、見た感じだと数式部分が画像になっていて、それが表示幅に合わせて拡大表示されているだけ。むしろ、Kindleの小さい画面でオリジナルサイズで表示されたら、数式の添え字とかが見えづらいと思うんですけどね。(←自分は老眼か?)

 

英語の本はちょっと

この本の著者の方、名前からしてフランス語圏の方だと思うんですけど、比較的平易な英語で書かれていると思います。Kindleなんて知らない単語を選択すれば勝手に辞書が出てくる時代ですからね、英語だからという理由で尻込みしてしまうのはもったいないような気がします。

 

※2018/5/6追記

この本の日本語版が出ました。

 

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

 

追記ここまで

 

それでも日本語がいいもん。という場合は、この本も良いと思います。自分も、この本は一通り終わらせました。

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

 

ただ、 scikit-learnの世界に閉じているので、理論的な部分がブラックボックス気味(数式を減らして概念を理解してもらおうという狙いだとは思いますが)なのと、後でニューラルネットワークをやるという意味では、つなぎの部分が少し弱いと感じました。例えば、この本の後にTensorFlow関連の本をやると、先ほどの自分のように、いきなりGDとかSoftmaxの話が出てきて、これってニューラルネット独自の概念なんだよねという勘違いをしてしまうかもしれません。

 

ということで、自分の場合はこの本がバイブルになりそうな勢いです。 

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

 

 

 

 

機械学習が近寄って来た

TwitterのプロフィールにMachine Learningと書いているものの、これまでは趣味の領域というか、本業とは関わりのないものだったんだけど、今年に入って急にMachine Learningの考え方が本業にも登場して来た感じがするので、久しぶりに独学で勉強を始めてみたという話です。

 

これまでやって来たこと

前も書いて来たような気もするけど、最初は自然言語処理に興味を持って、この本をやり始めたのは、このブログの過去記事にも残っているはず。

 

入門 自然言語処理

入門 自然言語処理

 

結局、最後までやりきる前に他のものに興味が移ってしまって記事的には中途半端になってしまったけど、この時学んだ内容のお陰で、 今年の学び直しにでは結構役立ったのも事実。(それと大学院の夏期集中で取ったファイナンスのための統計基礎とかも)

 

機械学習が向こうからやって来た

今年に入って、本業をしている時にもチラチラ機械学習というキーワードが聞こえて来る中、社内でもMLのワークショップ的なものが開催されると聞いて参加してみたら、これまでは業務時間外にコソコソ開くしかなかったJupyter Notebookを堂々と使って機械学習のデモをしていらっしゃる。

 

時代は変わったな。もう内職と呼ばなくていいんだな。という思いとともに、この波に乗れるもんなら乗っておこうというテンションが上がり、秋頃からまた機械学習の予習を始めてみようと手に取ったのがこちらの本。

 

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

 

 

ブログにはしていないものの、一通り手を動かしながら完走済み。scikit-learnというライブラリを使って機械学習の基本を学びましょうねというコンセプトの本。最近のディープラーニングブームを受けてなのか、本の帯に「ニューラルネットを学ぶその前に」と書いてあるのに釣られたというのは、ここだけの話だけど、これをやることで後から触る本の理解度が全然違ったのは事実。Githubに最新のソースがすべて載っているので、本の通りやっても動かんぞ?となったときは、そちらを見ながら微調整すれば何の問題もなし。

 

本の帯に従って(!?)、今度はDeep Learningを学ぼうと言うことで今度はこちらの本に挑戦。これもブログにしていないけど完走済みの1冊。 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

 

自分の場合、数学的な理論はよく分からない文系おじさんとしては、ライブラリを使いこなして、むしろどう使うかということろで勝負した方が良いのかなというところもあったので、進めながらやりたいのと少し違うかなと思っていたのは事実。でもね、後になって英語の本を読んだときに、これってどういうこと?というときに必ずこの本に立ち戻るんだよね。やっぱり、読んでおいて良かった1冊。
 

現在進行中のもの

Deep Learningの基礎の本を読んで、やっぱりライブラリを使うのに注力した方が良いかなと言うことで、TensorFlowの本を試してみることに。この本は現在進行中。 

Learning TensorFlow: A Guide to Building Deep Learning Systems

Learning TensorFlow: A Guide to Building Deep Learning Systems

 

最初Kindle版で読み始めて、結構良いかなと思って結局書籍版も買ってしまったという1冊。やはり算数も英語もイマイチ弱いおじさんとしては、時々意味が分からなくなり、ゼロから作るディープラーニングと行ったり来たりしながら進めてます。でも、丁寧に読むと結構分かりやすく説明してくれている事に気づきました。今は、ちょうどTensorBoardが出てくるあたりを熟読中。 

 

上の本を選ぶときにもう1冊候補になったのが、この本。結局買っちゃったんだけど。 

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

 

Pythonで始める機械学習でScikit-learnをある程度触っていたのと、amazon.co.jpの書評でボロクソに書いてあるのを見て、 まずはTensorFlow単体で扱っているものを選んだという流れになったわけです。ただ、Learning Tensorflowを半分ほど終わらせて、この次どうしようかなと言うときに、再びこの本が俎上に上がってきました。

 

確かに日本の書評の評価は低いんだけど、アメリカの評価は平均で4.7ぐらいある。そこで日本側のコメントをよくよく読んでみると、Kindleで数式のフォーマットが崩れるだとか、ソースコードすべてが載っていなくてGithub見るのが面倒だとか、6000円は高いだとか、本の内容と関係のないところでツッコミが入っている。そういう人は、手取り足取り至れり尽くせりの日本語の本を買えば良いじゃんという結論となり購入を決断。

 

2018年も機械学習

一応、今挙げた本を一通りこなしたら、何か自分で色々遊んでみようかなという事で、2018年も機械学習のお勉強は続けていこうかなという感じです。

 

この本も気になっている。

統計学が最強の学問である[数学編]――データ分析と機械学習のための新しい教科書

統計学が最強の学問である[数学編]――データ分析と機械学習のための新しい教科書

 

 

PythonユーザのためのJupyter[実践]入門

PythonユーザのためのJupyter[実践]入門

 

 

初めてジーニアスバーを使ってみた話

バッテリーがへたる

家のPCをMacに変えてから早10年。我が家で一番新しい一番新しいMBP Retina early 2013 が主力となっている訳ですが、最近バッテリー駆動時間がやたら短くなる?という現象に苛まれております。

 

いつもは書斎で電源ケーブルに繋がれているMBPを居間に持ってきてカタカタやり始めて、30分から1時間経って、調子が乗ってきた頃になると勝手にシャットダウンする時のテンションのダダ下がりと言ったら…

 

いつもなら、もう3年以上経つし、これは買い替えかなと衝動に走ってしまうところですが、嫁に「電池の問題でしょ?(=買い換えるとか馬鹿なの?)」という心温まる助言を受け、いろいろ調べることに。

 

DO IT YOURSELF!

Mac ノートブックのバッテリーについて - Apple サポート

 

これに載っているOptionキーを押しながらバッテリーアイコン🔋をクリックする方法で調べてみると、表示は"Service Battery"になっており、「今すぐ交換」とのこと。やはり、バッテリーの交換時期が来ている模様。

 

実は、2007年に買った我が家としては初代のMacbookでも、購入後3年ちょっとして、トラックパッドの下のボタンが押せなくなるという問題が発生し、裏蓋開けてみればバッテリーが膨張していたという事がありました。その当時は上海に住んでいて、まだアップルストアも上海にはなかった頃なので、自分でバッテリーを取り寄せて交換するしかなかった訳で。

 

という事は、今のMBPでも自分でやろうと思えばできるなという事で、調べてみるとやっぱりバッテリーだけ単体で売ってました。

 

 

なぜジーニアスバーへ?

普段なら、これをポチッと行く感じなのですが、よくよく考えると現在平日は出張中の身。貴重な週末をこの作業に割かれるのは少し勿体ない気がして、家からそう遠くないところにApple Storeもあるわけだし、たまにはジーニアスバーを使ってみるかということにしてみました。MBPのバッテリー交換は19,800円+税。高いといえば高いですが、1回ぐらい経験しても良いかなということで予約を取って渋谷のApple Storeに向かったのでした。

日曜の夜、普段なら絶対行かない時間帯に渋谷の街に降り立ち、アップルストアへ向かいます。スタッフに斯く斯く然々と話すと、2階のカウンターに通されます。まだ予約の時間まで少し時間があったので、 初期チェックをしてもらったところ、バッテリーも正常だという表示が出てきたので、内心「少し交換を焦りすぎたかな」と思った頃に担当の方が見えられました。

 

状況を伝えて、初期チェックでも問題がなさそうですねというところで、念の為、電源ケーブルを外して調べてみることになります。当初100%フル充電と表示されたところでみるみる数字が減っていき、1分ほどで96%まで下がる事を確認。 ま、最後まで直線的になくなるわけではないでしょうけど、単純計算で25分しかバッテリーが持たないとなると、やはりバッテリーに異常があると思うので交換した方が良いというアドバイスをもらいました。

ということで、だいたい3-5営業日、余裕を見て1週間程度の預かりとなり、我が家のMBPは入院することになりました。

 

こぼれ話

自分はPCを買う場合、CTOオプションがある場合は基本的にフル装備をする方向にしていました。これまでの癖で、CPUやメモリは毎年のように倍々ゲームで増えていく事が当然だったので、長く使うためには必要だと思っていたからです。なので、2013年3月に買ったこのMBPもCPUはi7 3.0GHz、メモリ8GBと当時にしては贅沢な?スペックだった訳です。

 

ふと買い換えが頭をよぎったときに、年末に支給された(これから3年間使う)会社のThinkpadのCPUも同じくi7だった事を思い出し、さすがに今買い換えるのは勿体なさ過ぎると気づいたのでした。ということで、バッテリー換装と相成ったMBPはあと3年ぐらいは使おうと思います。