White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

AtCoder Beginner Contest 110(ABC110)に参加しました

A,B,C完。Dは約数いちいち出してたらダメなのはわかりましたが・・?

 

A:

2桁 + 1桁の足し算の形になるので、2桁の数値の10の位に一番大きい値を持ってくればよし。

pythonのリストにA, B, Cを格納して、最大の要素をdeleteする形で取り除きました。

https://beta.atcoder.jp/contests/abc110/submissions/3251160

B:

首都も含めたx(とX)の最大値が y(とY)の最小値より少なればOK

・・ということに今更気づきました。

解いたときは愚直にx(とX), y(とY)を全部回して大小比較してました。

https://beta.atcoder.jp/contests/abc110/submissions/3253074

C:

アルファベットの種類を無視して頻度が一緒なら成立します。

なので各文字毎にdefaultdictで個数を数え、valuesだけ取りだしソートして一致判定をしました。

https://beta.atcoder.jp/contests/abc110/submissions/3254915

D:

バカ正直に約数を取りに行ったら、サンプルの段階でTLEしてました。

おそらく素因数分解を使うのでしょうが・・

 

python/scikit-learnのperceptronを使ってみた

 

仕事ではじめる機械学習

仕事ではじめる機械学習

 

 上の本を読んでいたらperceptronの紹介があったので、手元で動かしてみた。

gist.github.com

(5, 1), (1, 5)と中心を離して正規分布を生成してるので、100%分類できるだろうと思ったら一個だけハズレが出た。残念。

参考:

scikit-learnを使用したパーセプトロン – Python機械学習第三章学習メモ

Numpyのndarrayとmatrixでは*の結果が異なる

(この記事はQiitaからの転載になります。)

すごい初歩的な話なんですが・・

In [1]: import numpy as np

In [2]: H = np.matrix([[1, 2], [3, 4]])

In [3]: H * H
Out[3]:
matrix([[ 7, 10],
        [15, 22]])
In [4]: J = np.array([[1, 2], [3, 4]])

In [5]: J * J
Out[5]:
array([[ 1,  4],
       [ 9, 16]])

という感じに、np.matrixの*は行列の掛け算であるのに対し、np.arrayは要素毎の積(アダマール積)になってるんですね。np.arrayの方もnp.dotを使えば行列の掛け算になります。

In [6]: np.dot(J, J)
Out[6]:
array([[ 7, 10],
       [15, 22]])

np.powerっていう関数もあるんですが、これは単に要素毎のべき乗を取ってるようで、

In [8]: np.power(J, 2)
Out[8]:
array([[ 1,  4],
       [ 9, 16]])

In [9]: np.power(H, 2)
Out[9]:
matrix([[ 1,  4],
        [ 9, 16]])

とどちらも同じ結果になるのですが、行列のべき乗は関数ないんでしょうか? x >= 1 なら、

def matpow(A, x):
    B = A
    for _ in range(x - 1):
        B = np.dot(B, A)
    return B
In [14]: matpow(J, 2)
Out[14]:
array([[ 7, 10],
       [15, 22]])

で行ける感じもするんですが、ndarray用に作ってるのにmatとか付けるのがイケてなかったり、0乗や逆行列はどうすんだって問題もあります。

ちなみに ** 演算子はnp.matrixではnp.powerと違う挙動をします。

In [13]: H ** 2
Out[13]:
matrix([[ 7, 10],
        [15, 22]])

皆さんどうしてるんでしょうか?

これに対するコメント

  • numpy.matrixは使わない

  • ベクトルも明示的に行列(1行n列、もしくは、n行1列)として定義する

  • +、*、@を使う

AtCoder Beginner Contest 109(ABC109)に参加しました

C問題何回か間違えたけど解けた!

A:

Aが偶数もしくはBが偶数ならばCは必ず偶数になる。AもBも奇数ならCに奇数を選んで奇数にできる。

https://beta.atcoder.jp/contests/abc109/submissions/3152172

B:

i番目のW, W_iが過去のsetに含まれていない、かつW_iの最後の文字がW_i+1の先頭の文字と同じ場合はYes。そうでなければNo。最初dict.has_key()とか使おうと思ったけどpython3.4には無かった?(inが使えた。そもそもdictである必要すらなかった)

https://beta.atcoder.jp/contests/abc109/submissions/3154570

C:

最初は|X - x_i|の最小値が正解かと思ったけど、

1 4

1 7 11

みたいな時に成り立たないことがわかった。

それじゃあ最小公倍数かと思ってmath.gcd()を使ったのだけど、REが出てしまった。少し悩んだ結果、gcdは3.4までfractionモジュールの中にあるって事がわかり、手元のpython3.6環境と違うので自前でgcdを用意したら通った。

https://beta.atcoder.jp/contests/abc109/submissions/3159180

D:

問題の意味はわかったけど解き方がわからなかった。一筆書きでよかったのん(解説みながら)

【読了】エンジニアの知的生産術

 

 一回読み終えた。

軽い感想としては"土台となる部分は提供するから、あとは自分で考えてね"って感じか。印象に残った部分としては調査(種まき)・抽象化、パターン化(発芽)・検証(促進)のサイクルとか、タスクを達成可能なレベルまでに落とす、GTD(まず頭の中にあるもの全部書きだして、そこから優先度をつける)、KJ法、あたりか。()内間違ってるかも。参考文献の紹介の仕方は丁寧。

ただ今の自分にすぐ適応できるかっていうと、そこまでの気力は・・って感じ。

一般的な自己啓発っぽさは無いんで読んで損は無いと思う。

 

少し(が数時間後か数日後か不明だけど)後になったらまた読み返してみる。

 

「エンジニアの知的生産術」を買った(2)

 昨日買った「エンジニアの知的生産術」を6章途中まで読んだので、軽く感想+メモ。

 まず4章では読むことに焦点を当てている。情報をみつけることと理解を組み立てることについて述べている。速く読むことと遅く読む場合の違いについても述べている。くり返し読むことと出力することは必要。自分は読んで気になった部分をメモしているが、この方法は役に立たないようだ。残念。

次に5章。これはそのままの引用になるけど、”考えがまとまらないという悩みを解決するために、まず書き出して十分な情報があるかを確認し、それから書き出したものを机の上で物理的にまとめていく方法を学びました”とある。具体的にはまず付箋に何でもいいから書いていってあとでKJ法でまとめ上げていく感じか。うちだとふせんを並べるのは場所的につらそう。モニタも24インチと小さいし・・まずはMac上で動くふせんアプリを探したほうがいいかな?

そして6章(途中)。アイデアの思いつくために有用な方法について、4つの方法が示されている。さらに情報収集の方法として言語化されていないものを言語化されたものに変換することを提案している。(次に磨き上げる方法について述べているがそれはまた後日)

 

今回読む時間を25分程度に区切り集中し、読んだページ数/時間で計測してみた。大体0.4ページ~0.7ページ/minでかなり遅いと思われる。しかもこれで余り頭に入ってないから残念な感じだ。夜間はTwitterのTLが画面横に並んでいてたまに目につくのが遅れる要因になるのだけど、それらがない昼間でも0.5ページ/min程度なので。1ページ3分の音読よりは少し早いか。

 

あとこの本に限ったことじゃないけど、"モデル"って単語の意味がわからなくなってきた・・誰か説明頼む。プラモデルもモデルだし、データサイエンスの分野でもモデリングって言葉もあるし。

 

以降メモ。

4章
本を読むことの目的。娯楽、情報を見つけること。理解を組み立てること
"本から得た材料と自分の経験などを組み合わせて構造化していく「理解を組み立てる」イメージのことを忘れてはいけない"
"読んでいない本について堂々と語る" 歴史の文脈で位置づけを知る。人から聞く。ざっと読む。
"4回読んでいます"
"「準備の大事さ」「段階的詳細化」「繰り返し読むこと」"
"「調査」では、表紙や裏表紙、目次などから情報収集をします。「キーワード探し」は、本を20ページごとに開いて、目に付いたキーワードをメモします。"
"質問を作る" "再度5〜15分程度、本を読みます" "文章を大きな塊ごとにざっと見て、必要そうだと思ったところを2〜3文だけつまみ食いする読み方です。""質問を作ることに集中します。"
"マインドマップを作る"
"読んだ本のページ数、かかった時間、主観的な理解度を記録す
ることで自分の理解力を把握し、得たい理解度に合わせて入力の速度をコ
トロールする"
"適切なバランスがわからなければ速い側に倒すとよいでしょう"
"見出しへの注目"
"書籍のタイトルやサブタイトルは、私は信用していません"
"図は注目に値します。"
"箇条書きも注目に値する"
"、「読みたいときに」「読みたいところから読む」の原則をしっかり守れ"

"本3冊に目を通す」と設定するなら、努力によって達成可能になります"
"時間を区切ってふせんに抜き書きを作る"
"一番のお勧めは復習のための教材を作ることを目的とすること"
"間隔を開けてくり返し読むことが重要"

 

5章 考えをまとめるには
"まずは5分間、レポートで言及するとよさそうな情報を思い付く限り書き出してみましょう"
"関係ありそうな情報を全部書き出します"
"質を求めてはいけない"
"100枚書く"
"多すぎる情報をどうまとめるか""並べて一覧性を高くする""関係のありそうなものを近くに移動"
"KJ法"
"グループ編成は主観的なものなのです"
分類はしない。

「エンジニアの知的生産術」を買った

昨日電子版を買って、3章まで読んだ。

1章では情報収集・モデル化・検証の学びのサイクルについて書かれていて、2章ではやる気が出ない状態をどうやって解決するかについて書かれている。また3章では脳の記憶について書かれていて、さらに繰り返すことが必要、繰り返すのもテストを行ったほうがよいと書かれている。

 

ちょっと最近の自分は乱雑に情報を眺めることとが多く、具体的な成果も上げられていない(ちょこっとatcoderをやってたりはするが)ので、この本を読んでなんか足しにできるようにする。現状検証やアウトプットが足りていないと思う(ので、こうやってブログに書くことでアウトプットしている)

 

本の内容としては別に"エンジニアの"とつけなくてもいい感じはあるが、いきなりPythonの話が出てきたりするのでエンジニア向きではあると思う。あと3章でいきなり脳の構造に行くのは話が飛びすぎ、とも思った。ただ自分が現状抱えているもやもや感を解消する助けにはなりそうだと思っている。

 

以下読んだときのメモ。