サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
アメリカ大統領選
hamukazu.com
献本をいただいたので珍しく書評を書いてみる。 結論をいうと斬新なコンセプトのとてもいい本だと思う。対象読者は書名のとおり、これから独学でプログラマーをめざす人であろう。文系出身の人も含めてプログラミングの仕事に興味があるのだがどこから勉強を始めればいいかわからないという人にはお薦めである。そして自分の周りをみていると、最近そういう人は増えているように見える。 著者は大学で政治学を学んだアメリカ人であり、彼自身独学でプログラミングを学んでいて、そのノウハウが詰まっている。 序文にも書いてあるが、この本はPythonの解説をするがPythonを身につけることを主眼にしたものではない。最初に学ぶ言語はなんだっていいのだが、実際に言語の学習の部分を抽象化したまま話をすすめることはできないのでPythonを選択したというスタンスであろう。 Pythonの説明はある程度網羅的であり、これであるレベルま
(これは機械学習に必要な高校数学やり直しアドベントカレンダーAdvent Calendar 2016の18日目の記事です。) 最近大人の数学勉強し直しが密かなブームなようで、そのモチベーションとして機械学習が一役かっているようである。つまり、機械学習に興味をもち、その中身を理解したいから数学を勉強したいという人が私の周りでそれなりに観測されている。また、そのうちの多くは、高校や中学で習った内容にさかのぼって勉強しているようである。なので、機械学習の本などに出てくる公式について、高校数学の範囲を超えるものの、高校生に分かる範囲で証明しようと思った。思ったのだが、最近の高校の教育課程には行列が含まれてないと聞いて、いきなり気持ちが萎えた。 機械学習で出てくる数学はほとんどが線形代数なのだが、上記のような事情により、ここでは積分に関する公式を証明しようと思う。多変数の場合の変数変換ではヤコビアン
私のブログが引用されているこんな記事 (未解決)大規模疎行列のコサイン類似度 – studylog/北の雲 を見つけたので乗っかってみる。しかも、未解決って書いてあるし。 文書群データが疎行列\(A\)で与えられているとする。ここで、各行が文書を、各列が語を表しているとする。ここで文書間のコサイン類似度を総当りで計算したいものとして、その方法を示す。 \(A\)の各行をベクトルと見てL2ノルムで正規化したものを\(\tilde{A}\)とすると、コサイン類似度を示す行列は \[ \tilde{A} \tilde{A}^T \] で計算できる。 では\(\tilde{A}\)をどう計算するかだが、ブロードキャスティングを使ってインプレイスで求めるのがいいかと思う。以下にサンプルコードを示す。 from scipy.sparse import lil_matrix import numpy a
sciki-learnの最近傍法について scikit-learnにはk最近傍(K-Nearest Neighbor)を計算するNearestNeighborsというクラスがあるが、これはこんな感じで使う: >>> from sklearn.neighbors import NearestNeighbors >>> nn = NearestNeighbors(n_neighbors=3) >> x = np.array([[0,0],[0,1],[2,2],[3,3]]) >> nn.fit(x) earestNeighbors(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_neighbors=3, p=2, radius=1.0) >> distances, indices = nn.k
2年くらい前の記事だが、こんな記事が気になったので補足する。 俺の言語がこんなに遅いわけがない!? 〜C, Java, PHP, Python, Rubyによるプログラミング言語 速度比較〜 確かにスクリプト言語は遅い。ただし、C言語で一般的なアルゴリズムをそのまま使って計算したとしたら。 スクリプト言語にはスクリプト言語なりの流儀があり、慣れている人は違う方法で実装する。 ちょうどPythonについて、同じようなことを先日ソフトウェアジャパンというイベントでしゃべって来たのでこのスライドも参照されたい。 ここで改めてベンチマークをとってみたい。まずはPythonから。Pythonではこの手の数値計算をするのはNumpyというライブラリを使うのが普通である。Numpyで1からnが入った配列を用意し、そのメソッドsum()で合計を計算する。 結果の格納先になぜ辞書型を使うのかなど、気に入らな
最近bottleとgeventを使ってみて、とても便利でメカニズムも興味深いと思ったのだが、あまり日本語の解説がないようなのでここにまとめてみる。Pythonによるウェブアプリ開発で、レスポンス速度が重要なときに参考になるかと思う。 bottleとは? Pythonの軽量ウェブフレームワークである。使い方はとてもシンプルで、独自のテンプレートエンジンを持っている。詳細は本家のドキュメントを参照だが、その本家のドキュメントの最初のこの例を示せば大体の雰囲気はつかめるであろう。 from bottle import route, run, template @route('/hello/<name>') def index(name): return template('<b>Hello {{name}}</b>!', name=name) run(host='localhost', port
@beam2dさんの記事が面白かったのだが、これを読んでよくわからなかった人もそれなりにいるだろうという想定で、補足説明のつもりでこれを書いている。 いろんなところで話をするのだが、「数学≠数値計算」である。数学の知識と数値計算の知識はちょっと違う。方程式の解が解析的に解けて、やった解けた!と思っても、その値をコンピュータで計算して結果を出すまでにさらに工夫が必要なことがよくある。コンピュータ内部での数値表現の特性を理解した上で、コンピュータフレンドリーな数式にさらに変形しなければいけないことがある。 例1: Sigmoid関数の計算 機械学習でよく出てくるSigmoid関数 $$ \sigma(x) = \frac{1}{1+e^{-x}} $$ であるが、これは\( \lim_{x\to \infty} \sigma(x) =1 \), \( \lim_{x\to -\infty} \
色々とハマりつつも、Remark.jsとMathJaxを使ってプレゼン用スライドを作るのがとても便利なことに気づいたので紹介する。 HTML+JavaScriptでプレゼン用スライドを作る仕組みはいくつかあって、色々と試してみたが、最近はRemark.jsが便利だと思っている。Markdown形式を自動で変換してくれるというのと、配布資料用として印刷してもちゃんとレイアウトしてくれるところがよい。あと、デザインも変に凝らずにシンプルなところがよい。といってもRemark.jsでも、CSSをいじれば凝ったことはいくらでもできるようだが私はやらなない。 仕事柄どうしてもスライドに数式が多くなるので、その点MarkdownでTeX形式の数式を挿入できるのがとても嬉しいと思っていたのだが、色々といじってるとハマってしまった。以下それを説明する。 途中をすっ飛ばしてとりあえずRemark.js+Ma
EmacsのPython環境周りを最近整えたので自分のためのメモ。似たような情報は色々とネットに転がっているのだが、古いEmacs向けだったり、いろいろとやりすぎだったりというのもあったので、自分なりにシンプルにまとめてみた。 以下、Ubuntuでemacs24を使ってることを前提とする(Linuxならばそんなに変わらないかなと思うが)。python-modeとpackage.elはすでに入っているとする。python-pipがインストールされてて、~/.local/binにパスが通っていることも前提とする。 以下の順で説明する。 準備:package.elの設定 自動インデントの設定 yasnippetのインストール py-autopep8のインストール auto-completeのインストール elpyインストール flymake関連のインストール 動作デモ(動画) それぞれ独立なので
前回の記事で予告した記事が遅くなってしまった。申し訳ない。 ここでは、Pythonの疎行列ライブラリscipy.sparseについて、データの内部構造を説明する。内部構造を知らずにブラックボックスとして使いたい場合は前回の記事を参照のこと。 はじめに(あるいは前回記事のまとめのまとめ) scipy.sparseで疎行列を表すクラスは主に以下のものがある(他にもあるが、ここではとりあげない。これだけ知ってれば大体のことはできる。) lil_matrix csr_matrix csc_matrix 通常は、lil_matrixを用意してそこに値を詰めてから、csr_matrixまたはcsc_matrixに変換してから計算を行う。csr_matrixとcsc_matrixのどちらを使うかは以下のことから判断する。 演算はcsr同士またはcsc同士が高速 csrは行を取り出すのが高速 cscは列を
Pythonで疎行列を扱うライブラリであるscipy.sparseについて、自分がハマってきたところをまとめてみようと思う。とくに、行列よりもベクトルとして扱ったとき(つまり行または列の数が1のとき)の注意点をまとめる。 基本的なことばかりなのかもしれないが、日本語の情報は少ないので、それでも役に立てるかもと思いました。まあ自分の勉強ノートみたいなもんです。 基本 scipy.sparseで提供される疎行列の形式はいくつかあるが、ここではとくにCOO(COOdinate)形式、LIL(LInked List)形式、CSR(Compressed Sparse Rows)形式、CSC(Compressed Sparse Columns)形式について取り上げる。 それらの違いについて、詳細は本家のドキュメントを参照して欲しいが、すごく大雑把にまとめると、 CSR, CSC形式は、同じ型同士の掛け
今回は珍しく(?)初心者フレンドリーに書こうと思う。先日のPyCon JPでの発表で、Pythonで使える疎行列のライブラリ「scipy.sparse」について反響があったので、改めてここで使い方の基本をまとめてみることとする。そもそも、便利で使い方もそれほど難しくないのに、日本語の情報がほとんどないようなので敬遠されていることもあるかもしれない。ここでは、使い方の基本を解説する。 基本: 疎行列とは? 要素のほとんどが0であるような行列を疎行列と呼ぶ。そうではない普通の行列を、区別したいときには密行列と呼ぶ。疎行列では、非ゼロ要素だけを覚えておけば良いので、メモリ、計算時間ともに大幅な節約になる。特に非ゼロ要素の割合が小さい場合は、その節約は大きくなる。 特に機械学習の分野だと、計算過程で大規模な疎行列が必要になることがよくある。 使い方 scipy.sparseには、疎行列を表すクラス
先日PyCon JP(Python開発者のお祭り)で、登壇発表してきました。 そのときの資料がこちら 内容としては、NumPyを使って高速に計算するコツと、SciPyの中の特に疎行列の扱いについてです。 そしてビデオがこちら。 https://www.youtube.com/watch?v=VJwjzY6jdBY#t=293 Togetterでの反応 http://togetter.com/li/719865?page=23 を見ると、やはり難しかったという人もいるようですが、こういう内容の発表だとやはり全員にその場で理解してもらうというのは難しいと思うので、今後ブログ等で補完的な内容を発信していこうかと思ってます。
先日の記事「コンピュータが読めない数字」で、「コンピュータさん悪くない」って言ったが、どう悪くないかイマイチ伝わってない気がしたので、MNISTデータで個人的に納得できないものワーストを書き出してみようと思う。 これすべて数字なのだが、読めるだろうか。 正解は下をスクロールして参照。 答: 左から 9 7 3 2 9 5 4 (MNISTデータに付随している正解データによる)
Appleの新言語Swiftについて、Swift-jpという勝手に日本語化するプロジェクトが発足したようだが、結論からいうとこれには参加しない方がいい。 ここに、匿名で無責任な意見が並んでいるが、ここで実名でなんか言っておかないといけないと思った。 なぜ参加すべきではないかというと、 このプロジェクトに参加すると、将来訴えられる可能性があるから。 詳細はこちらの議論を参照。 著作権および翻訳権の侵害について · Issue #1 · swift-jp/swift-guide 想定問答 ツイートやはてぶコメントなどから考えた想定問答を以下にまとめてみる。 Q. 善意だからいいんじゃない? A. 善意なら悪いことしていいってことはないです。 Q. 部外者なら黙ってろ A. 部外者ですが、あまり考えずプロジェクトに参加して思わぬ訴訟リスクを負う人のことを心配してこの記事をかきました。 Q. じゃ
くだらないものばかり作ってないでたまには技術ネタを書いてみようと思う。 Python(とくにscipy.sparse)でx=0でf(x)=0となるようなユニバーサル関数fを疎行列のそれぞれの要素に作用させるにはどうすればいいだろうか。 x=0で0になるという点が重要で、その条件を満たす関数ならばもとの行列のsparsityをそのまま保存できる。つまり結果も疎行列になるはずだ。 Pythonにはユニバーサル関数という呼ばれる関数群があって、それは密行列については便利な機能で、例えば、密行列のすべての要素にtanhを作用させようとすると、次のようなコードで計算できる。 import numpy as np a=np.ones((3,3)) print a b=np.tanh(a) print b つまりユニバーサル関数は行列に作用させると各要素に作用する。以前に書いたfor文を書いたら負けとい
久しぶりのgrepネタ。今度はまだリリース版に入ってないコミットの話。 commit c50283a3a8d15d382691c447c3a1e1fde1c548fc “grep: fix bugs with -i and titlecase” 実はかなり前に見つけてたのだが、解説するのが遅くなった。全国のgrepファンのみなさん、ごめんなさい。 + grep -i no longer mishandles patterns containing titlecase characters. + For example, in a locale containing the titlecase character + ‘Lj’ (U+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J), + ‘grep -i Lj’ now matches ‘LJ’ (
επιστήμη・高橋晶著「C++テンプレートテクニック第2版」に推薦文を書かせていただきました。 そして、こちらが著者の高橋晶さんによる関連ブログです: C++テンプレートテクニック 第2版 を出します – Faith and Brave – C++で遊ぼう 献本もいただきました。著者の二人に感謝いたします。 以下推薦文です(本書に含まれている)。 私は5年くらい前まではC++を仕事で使っていましたが、現在はPythonやScalaなど他の言語を主に使うようになりました。テンプレートについてはもちろん、C++についての本を読むのは久しぶりで、色々と忘れていたことや、C++11の新しい機能などもともと知らなかったことなど、楽しく読ませてもらいました。 他言語のユーザから見ると、テンプレートというのはC++に特有な機能で自分にはあまり関係ないように見えるかもしれません。しかしメタプログラミン
先日の記事 いまさらgrepが10倍高速化したのはなぜか が思わぬ閲覧数を稼いでしまい、トルコ語の知識を日本に広めるのに大きな貢献をしたような気がしますが、みなさんいかがお過ごしでしょうか。 実は先日の記事を書いた時にはすでに2.18がリリースされてたのだが、今回は2.17のときと違って日本の大手メディアが取り上げてなかったので、ついつい見落としていた。しかし実は2.18でも大きな変更が!! リリースノート抜粋: grep -i in a multibyte, non-UTF8 locale could be up to 200 times slower than in 2.16. [bug introduced in grep-2.17] なんということでしょう。-iオプションでUTF8のときは2.17で10倍速くなっていたのだが、それ以外のマルチバイトロケールのときは200倍遅くなって
最近GNU grepコマンドの最新バージョンがリリースされ、速度が10倍になったとのアナウンスがあった。それを聞いて、なんであんな枯れた技術に10倍もの高速化の余地があったのだろうと不思議に思った人も多いだろう。 ニュース記事:grepコマンド最新版、”-i”で10倍の高速化 本家のリリースノート:grep – News: grep-2.17 released [stable] 今回のリリースでは正確には、マルチバイトロケールで、-iオプション(–ignore-case、つまり大文字小文字を区別しないオプション)をオンにした時の速度が10倍くらいになったそうだ。 なぜそんなに速くなったのか?逆を言えば今までなぜそんなに遅かったのか? そもそも、多くの日本人にとって「大文字小文字の区別」というと英語のアルファベットか、せいぜいフランス語とかドイツ語とかのアクサン記号・ウムラウトがついたものく
先に結論を言っておこうと思います。「リケジョ」って単語自体は現時点では差別語ではないと思います。しかしこのままま行くと将来差別語になってしまうのではと危惧しています。 例の小保方さんの研究成果に関係して、「リケジョ」は差別語じゃないかという話がネット上で賑わっているようなので、時流に乗ってみようと思いました。 震源地は、めいろまさんこと谷本真由美さんのこの記事のようですね: 一晩中泣き明かした30歳若手女性研究者と書く我が国にはゴシップ新聞しかないらしい ここでは小保方さんの研究成果の報道のあり方を批判しており、途中、『「リケジョ」という差別用語』というフレーズが繰り返し使われてます。 一方、これについて反論めいたものとして片岡英彦さんのコラム: 「リケジョ」は本当に差別用語なのか?「リケダン」や「草食男子」はどうかと、あえて言ってみる ここでは、大学での取り組みや講談社「Rikejo」マ
先日ありがたいマサカリを頂いたのを機に、numpyのブロードキャスティングについてあまり理解してなかったなと思い、改めてまとめてみることにする。以下自分の理解をまとめたものだが、一応初心者向け解説のつもり。わかってる人は読まなくていい。 解説 Numpyでは例えば、以下のように1次元配列とスカラー値の演算ができる。 >>> from numpy import * >>> a=arange(5) >>> a array([0, 1, 2, 3, 4]) >>> a*5 array([ 0, 5, 10, 15, 20]) こういうのをブロードキャスティングと呼ぶ。 これは、2次元と1次元の計算に限らず、また掛け算に限らず他の四則演算でも似たようなことができる。なので、以下足し算に限定して例示する。例えばこの場合。 >>> a=arange(10,130,10).reshape(4,3) >>
いまさら遅いだろというツッコミが来そうだが、やっとhttpsに対応した。いままでめんどくさくくてほうっておいたのだが、httpsにしないとGoogle Chromeがブロックするというので、重い腰をあげた。
転職してから1年とちょっとが経ち、Pythonをメイン言語としてからも同じくらいが経った。最近やっとnumpy/scipyの使い方のコツがわかってきたと思うので、マサカリ飛んでくるのを覚悟でなんか書いてみようと思う。 転職して初めてPythonを使ったというわけではない(実際wafのwscriptとかは書いたことある)が、まあでもほぼ初心者同然だった。学習曲線でいうとPythonはすごく良い言語だと思う。Python本体の言語仕様については、わりとすぐに覚えることができた。だが一方、numpy/scipyについては、そう簡単ではなく習得するにはそれなりに時間がかかったと思う。 ケーススタディ たとえば\(N\times M\)行列\(B\), \( M\times L \)行列\( C \), \( M \)次元ベクトル\(a=(a_k)_{1\leq k \leq M}\)が与えられて
こんなツイートがあった。 職場でさっき「ごめん。この画像2000枚くらいあるけど全部小さくリサイズしといて。今日それだけやっといてくれればいいから。終わらなかったらごめんけど残業してくれ。」ってDVD-R渡されたからPhotoshopのアクションとバッチで10分ほどで完了したんだけどもう帰っていいですか? — まつだい (@matsudai23) December 8, 2013 知識がないからそういう無駄な作業している人って沢山いるんだろうなあ、っていうのが大方の反応だったかと思う。 いや、そうじゃないだろ。私の意見はこれ。 それは相手が無知だっていうんじゃなくて、ポチポチクリックしながら作業するのが当然だと思われるようなポジションにいるからじゃないのかな。どっちにしろ、今日はもうなにもやらなくていいと思うけど。 — 氏名:加藤公一(はむかず) (@hamukazu) December
これ読んだ。 読むために生まれ:若いエンジニアへ 言っていることには異論はない。突貫工事を続けて長時間労働しても効率が良くないというのは確かにそうだ。しかしこれは、タイトルに反して若いエンジニアに向けたメッセージではなく、マネージャー層に向けたメッセージではないか。若いエンジニアを長時間こき使うっていうのはリソースの使い方としては最悪ですからね、ちゃんとマネージメントしましょうね、と言っているように見える。 突貫工事は確かによくない。でもある一定の割合で突貫工事は発生する。そして、若手エンジニアが突貫工事にアサインされることは多い。しかも若手は大抵自分で仕事を選ぶ権利はない。若手、特に新人が突貫工事/炎上案件に巻き込まれた時にできる最善の策といえば、1)きちんと貢献できるように、でも体は壊さない程度に働く、2)開発プロセスがちゃんとしているかどうか見極め、ダメだと思ったら積極的に改善点を指
@hamukazu 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567969 — 素数生成ボット(ベータ版) (@primenumber_bot) November 26, 2013 例えばこんなときに: RSA暗号の鍵ペアを手動で作りたくなったとき(公開でツイートするからセキュリティ筒抜けですけどね!) おしゃれな自作Tシャツのデザインに お守りに入れて魔除けに クリスマスに素数のプレゼントはいかがですか? 以下解説 これは有名なMiller-Rabinのアルゴリズムというのを使っています。大きな数の素数判定でもわりと高速に計算できます。Miller-Rabinのアルゴリズムについては、ウィキペディアの解説
(これは、Matt MightによるThe illustrated guide to a Ph.D.という文章の翻訳です。) 経緯の説明: 以前同じ文章を私が他所のブログで訳していましたが、反響が多く、様々なところからのリンクや多くのコメントを頂いていました。しかし当該ブログが閉鎖になってしまいましたので、また一から訳し直すことにしました。元データは消失していた状態で訳し直したので、文言は必ずしも前回の訳とは一致しません。また、前回の訳の後、原文の筆者が加筆をしているので、その分を加えて訳すことにしました。新規追加分の区切りには横棒を入れてあります。 私は毎年秋になると新しい博士課程学生数人に「博士号とは何か」を説明するようにしている。 言葉で表すのは難しい。 だから、絵を使うこととする。 博士号への絵付きのガイドとして、以下を読んで欲しい。 人類の知識すべてを含む円を考える。 小学校を卒
このページを最初にブックマークしてみませんか?
『はむかず! – 加藤公一のページ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く