2016年9月22日木曜日

機械学習、深層学習、Pythonの本と論文

『Python 機械学習プログラミング』

Pythonのサンプルが多くて分かりやすい良い本だと思います。
サンプルコードを以下のGitHubのurlから取得できます。図や説明も読めます。

python-machine-learning-book


『Pythonで体験する深層学習』
買ったばかりでまだ読めてないですが、これも良さそうな本です。Pythonのサンプル・コードもいくつかあります。

『機械学習と深層学習』
機械学習だとライブラリが充実していることからPythonが使われることが多いですが、C言語でのコードがアルゴリズムの参考になります。

『深層学習』
深層学習の理論面で、非常に参考になります。実装用のコード等はありません。

『統計的学習理論』
機械学習の統計的な理論が詳しく説明されていて参考になります。数学のレベルがやや高いので初心者にはハードルが高いかもしれません。

『Python エンジニア養成読本』
Pythonの初心者がざっくりとPythonの全体像をつかむのに良い本だと思います。機械学習、深層学習とは直接は関係はありません。

『実践 機械学習システム』
図書館で借りてさらっと読んだ程度ですが、この本も良いと思います。コードはPythonです。

図書館で借りてさらっと読んだ程度ですが、この本も良いと思います。機械学習は関係ないです。Pythonの本。オライリーの本は全体に良い本が多いと思います。

《いくつかの論文》

"Deep learning" LeCun, Bengio, Hinton(2015)(pdf)
この分野を牽引してきた三人による"Nature"総括論文

"LONG SHORT-TERM MEMORY" Hochreiter and Schmidhuber(1997)(pdf)

"Learning to Forget: Continual Prediction with LSTM" . Gers, Schmidhuber, Cummins(1999)(pdf)

"Mastering the game of Go with deep neural networks and tree search" Hassabis et al.(2016)(pdf)
碁の世界チャンピオンを倒して一躍有名になったGoogleのAlphaGO

"Very Deep Convolutional Networks for Large-Scale Image Recognition" Simonyan and Zisserman(2015)

"Conversational Speech Transcription Using Context-Dependent Deep Neural Networks" Seide, Yu(2011)

2016年9月11日日曜日

Jupyter Notebookとmatplotlib

Jupyter NotebookはWebブラウザ上で実行できるPythonの環境を提供する。データ可視化のためのパッケージmatplotlibと組み合わせることでスムーズに実行結果を確認できる。

WindowsのAnacondaのメニューからJupyter Notebookを起動するとブラウザが自動起動し、http://localhost:8888/が表示される。


Newで新しいPython環境をブラウザ上に作る。


入力エリア「コードセル」にPythonのコードを入力し「Shift」+「Enter」で実行される。
 

matplotlibをNotebook上で描画するために、コードセルで次のmagic functionを実行する。

matplotlib inline

plot()関数にリストx,yを与え、show()関数でグラフを描画する。

 pyplot.style.use('ggplot')で別のスタイルのグラフを描画。スタイルには

  • dark_background
  • bmh
  • grayscale
  • ggplot
  • fivethirtyeight

がある。
random.randn()関数はNumPyの乱数生成関数の1つ。hist()関数はヒストグラムを作成。引数のbinsは区間の数。

なんと、Jupyter NotebookではLaTex記法で数式を記述できる。これはありがたい。「code」のところを「markdown」にする。


Pandas: Pythonのデータフレーム、データ加工

Pythonのデータフレーム、データ加工

Pandas

データフレームは行列のようなものと言えるが、行名と列名でデータにアクセスできる点が配列との違い。
カレントディレクトリに以下のsample1.csvファイルを作っておき、Pandasを使って読み込む。(カレントディレクトリは"%pwd"で分かる)

〈sample1.csv>
Team,Win,Draw,Lose
Japan,3,0,0
Iraq,2,0,1
Jordan,1,0,2
Palestine,0,0,3

------------------------------------------------
In [53]: import pandas
In [55]: df=pandas.read_csv('sample1.csv',index_col='Team')

(Pandasのread_csv()関数を利用してcsvファイルのデータを読み込む。第一引数に読み込むファイルパスを指定。index_colには行名として採用する列を指定)

In [56]: df  (読み込んだデータを表示)
Out[56]:
           Win  Draw  Lose
Team
Japan        3     0     0
Iraq           2     0     1
Jordan       1     0     2
Palestine    0     0     3

In [57]: df['Win']  (列名を指定したデータ表示)
Out[57]:
Team
Japan        3
Iraq         2
Jordan       1
Palestine    0
Name: Win, dtype: int64

In [60]: df[['Win','Lose']]  (複数の列名を指定したデータ表示)
Out[60]:
           Win  Lose
Team
Japan        3     0
Iraq         2     1
Jordan       1     2
Palestine    0     3

In [61]: df[df.Win >=2]  (指定列の値によるデータの絞り込み)
Out[61]:
       Win  Draw  Lose
Team
Japan    3     0     0
Iraq     2     0     1

In [62]: df.sum(numeric_only=True)  (データの合計)
Out[62]:
Win     6
Draw    0
Lose    6
dtype: int64

In [63]: df.to_json('sample.json',orient='index')  (JSON形式でのファイル出力)

-----------------------------------------------------------
クロス集計

以下のsample2.csvを読み込む

date,item,price
2016-09-01,apple,300
2016-09-01,apple,300
2016-09-01,orange,250
2016-09-02,orange,240
2016-09-02,orange,240
2016-09-02,banana,260

In [64]: df2=pandas.read_csv('sample2.csv')

(アイテム、日付ごとに価格を合計)
In [73]: df2.pivot_table(index=['date'],columns='item',aggfunc=[sum])
Out[73]:
              sum
            price
item        apple banana orange
date
2016-09-01  600.0    NaN  250.0
2016-09-02    NaN  260.0  480.0

(レコード数を合計)
In [74]: df2.pivot_table(index=['date'],columns='item',aggfunc=[len])
Out[74]:
             len
           price
item       apple banana orange
date
2016-09-01   2.0    NaN    1.0
2016-09-02   NaN    1.0    2.0


Pythonの数式処理用パッケージ SymPy

SymPyは数式処理の機能を提供

In [43]: import sympy

In [44]: x,y=sympy.symbols('x y')

In [45]: expr=2*x+y

In [46]: expr
Out[46]: 2*x + y

In [47]: expr.subs([(x,2),(y,3)])
Out[47]: 7

In [49]: expr-y
Out[49]: 2*x

数式展開
In [50]: sympy.expand((x+y)**2)
Out[50]: x**2 + 2*x*y + y**2

微分
In [51]: sympy.diff(x**2+2*x+1,x)
Out[51]: 2*x + 2

積分
In [52]: sympy.integrate(3*x**2+2*x,x)
Out[52]: x**3 + x**2

Pythonのデータ分析系パッケージ NumPyとSciPy

Pythonのデータ分析系パッケージ
多次元配列、線形代数の計算などを行うNumPyをAnacondaのIPythonで扱う。
AnacondaからIPythonを開くとこんな感じ

In [1]: import numpy (NumPyをインポート) In [2]: numpy.array([1,2,3]) (1×3のベクトルを作成) Out[2]: array([1, 2, 3]) In [3]: numpy.array([[1,3],[2,4]]) (2×2の行列を作成) Out[3]: array([[1, 3], [2, 4]]) In [4]: a=numpy.array([[1,3],[2,4]]) (aという2×2の行列を作成) In [5]: a[0][1] (aの0行1列の要素を抽出) Out[5]: 3

-------------------------------------------------
NumPyのstd()関数で標準偏差を求める。

In [6]: score=numpy.array([80,70,75,82,90])

In [7]: numpy.std(score)
Out[7]: 6.7409198185410872

-------------------------------------------------
NumPyのcorrcoef()関数で相関係数を求める。
In [8]: x=numpy.array([1,2,3,4,5])

In [9]: y=numpy.array([1,3,3,4,5])

In [10]: numpy.corrcoef(x,y)
Out[10]:
array([[ 1.        ,  0.95940322],
       [ 0.95940322,  1.        ]])



-------------------------------------------------
SciPyを使う。SciPyのeuclidean()関数を使ってユークリッド距離を求める。

In [11]: import scipy

In [12]: from scipy.spatial import distance

In [13]: x=[1,2,3]

In [14]: y=[1,2,4]

In [15]: distance.euclidean(x,y)
Out[15]: 1.0

-------------------------------------------------
SciPyで最近傍探索を行う。

In [16]: from scipy.spatial import KDTree

In [17]: x,y,z=(1,1,2),(5,3,7),(2,5,1)

In [18]: label=('x','y','z')

In [19]: tree=KDTree((x,y,z))

In [20]: tree.data
Out[20]:
array([[1, 1, 2],
       [5, 3, 7],
       [2, 5, 1]])

In [21]: new_data=(4,5,1)

In [22]: d,n=tree.query(new_data)

In [23]: print('分類結果は{0}です'.format(label[n]))
分類結果はzです

In [24]: print('距離は{0}です'.format(d))
距離は2.0です

2016年9月10日土曜日

Python はじめの一歩

機械学習のライブラリが充実しているようなのでPython(Windows版)を始めてみることにする。





Python HOWTO

科学計算に特に推奨したいPythonディストリビューションとしてContinuum AnalyticsのAnacondaがある。Anacondaは営利目的での使用を含め、完全に無償のエンタープライズ向けのPythonディストリビューションである。データサイエンス、数学、工学に不可欠なPythonパッケージが1つのユーザーフレンドリなクロスプラットフォームディストリビューションにまとめられている。IPython、Jupyter Notebookなども含まれる。

Anaconda

数式処理用パッケージ
Sympy

データフレーム、データ加工
Pandas

-------------------------------------------------------------------------
ブロック構造をインデントで書くPython、慣れないとやり辛い。慣れるといいんだろうけれど。

Pythonの関数定義、こんな感じ。関数を書き終わったときは改行を入力。
>>> def add(a,b):
... return a + b
...
>>> add(1,3)
4


-------------------------------------------------------------------------
FizzBuzz.pyというPythonファイルを作成し、Windowsのコマンド・プロンプトから実行。

def fizzbuzz(num):
return num

print(fizzbuzz(4))

これは、ただ「4」を表示するだけ。for分で1から100を表示。

def fizzbuzz(num):
return num

for num in range(1,101): 
print(fizzbuzz(num))

-------------------------------------------------------------------------
Pythonが検索するパスは「sys」をimportして「sys.path」と入力すれば確認できる。それに例えばDドライブのmypythonというディレクトリを追加したい場合
>>> import sys
>>> sys.path.insert(0,'D:\\mypython')

-------------------------------------------------------------------------
ディレクトリの作成と移動
>>> import os
>>> os.mkdir('spam')
>>> os.chdir('spam')
>>> os.getcwd()
'D:\\mypython\\spam'
>>> import sys
>>> sys.exit(1)


-------------------------------------------------------------------------
時間に関するライブラリはtimeとtimedate

>>> import time
>>> now=time.localtime()
>>> time.strftime('%Y-%m-%d %H:%M:%S',now)
'2016-08-11 18:25:17'

>>> import datetime
>>> now=http://datetime.datetime.now()
>>> now.isoformat()
'2016-08-11T18:28:01.281138'

>>> nextyear=datetime.datetime(2017,1,1)
>>> delta=nextyear-now
>>> delta.days
142
>>>

-------------------------------------------------------------------------
mathは数学関数、randomは疑似乱数のライブラリ。itertoolsはイテレータ生成関数、shutilは高レベルなファイル操作、jsonはJSONエンコーダとデコーダ。

-------------------------------------------------------------------------
Pythonは標準ライブラリに加えて便利なサードパーティ製パッケージも提供されている。それらはPyPIというサイトで情報共有されている。なおPyPIの読み方はパイピーアイ。


-------------------------------------------------------------------------
サードパーティ製パッケージをインストールするには、pipコマンドを使用する。
パッケージをインストールするときには、virtualenvコマンドを使用して独立したPython環境を構築することをお勧め。

-------------------------------------------------------------------------
一度Pythonを抜けて
D:\mypython>pip install virtualenv
Collecting virtualenv
Downloading virtualenv-(中略)

Successfully installed virtualenv-15.0.

virtualenvで独立した環境を構築しようとするとエラーが表示される。

OSError: Command D:\mypython\env\Scripts\python.exe - setuptools pip wheel failed with error code 1

anaconda3のライブラリに関するメッセージも表示されるが、詳細は今のところ不明。そのうち分かるでしょ。



-------------------------------------------------------------------------
Python用の統合開発環境PyCharm(Windows版)のダウンロード



PyCharm Professional版は有償で、30日間のトライアル期間がある。Community版は無償だが機能制限がある。
PyCharmをインストール

PyCharmで「print('hello world')」というPythonのコードを実行し、下の出力画面に「hello world」を表示させる。


-------------------------------------------------------
AnacondaからIPythonを開くとこんな感じ
%pwd でカレントディレクトリを表示
-------------------------------------------------------
Pythonのデータ分析系パッケージ