chainer以外でのcupyの使用について
アドベントカレンダー8日目です。
今日はcupyについて書いていきたいと思います。
速度比較
今回は、0~300000000までの配列を生成し、それをシグモイド関数に通します。その時の速度を以下の3つで比較します。
- pythonのrangeとmath.exp
def sigmoid(x): temp = x.copy() for i,x in enumerate(x): temp[i] = 1/(1+math.exp(-x)) return temp start = time.time() x = list(range(300000000)) sigmoid(x) print(time.time()-start)
- numpyのarangeとnp.exp
def numpy_sigmoid(x): return 1/(1+np.exp(-x)) start = time.time() x = np.arange(300000000) numpy_sigmoid(x) print(time.time()-start)
- cupyのarangeとcupy.exp
def cupy_sigmoid(x): return 1/(1+xp.exp(-x)) start = time.time() x = xp.arange(300000000) numpy_sigmoid(x) print(time.time()-start)
実行結果
何秒かかったか以下に示します。
80.69074440002441
- numpy
5.5577309131622314
- cupy
0.0005419254302978516
numpyを使うことでかなり早くなってますね。
cupyは異次元です*2。
jupyter notebookのextensionのgist-itについて
アドベントカレンダー7日目の内容です。
今回は、jupyter notebookのextesionにあるgist-itについて書いていきます。
Jupyter notebook extensionsについて
jupyter notebookの拡張機能です。
ソースコードを畳めたり、autopepが使えたりします。
インストールはこちらから。
github.com
gist-it
あっという間にgistにソースコードを上げられます。
githubよりも気軽に、ブログにソースコードを埋め込むときにも使いやすいです。
前回の記事でのソースコード埋め込みにも使用しています。
jupyter notebookのextesionsで有効化すると、ここにボタンが出ます。
gistへの上げ方
さっきのボタンをクリックすると、こんな感じの画面が出ます。
よくわからなければ、何も入力せずに右下のGist itを押しましょう。
するとこんな緑の表示が出るので、リンクをクリックしましょう。
リンクに飛ぶとこんな感じで公開されています。
ブログへの貼り方
ブログに貼りたい際には、先程の画像の右上のEmbedのところをコピーしてブログにそのまま貼ります。
こんな感じに表示されます。
楽にコードを共有できて、jupyterを使っててブログを書くときには便利なのでおすすめです。
matplotlibで円グラフを描画する
アドベントカレンダー6日目です。
adventar.org
matplotlibで円グラフを描画する
pythonで円グラフを描画したくて、matplotlibを使いました。
その際にいろいろいじって試したりしたのでそれについて書きます。
ソースコードは以下にあります。
描画の準備
使うライブラリのimport
%matplotlib inline import matplotlib.pyplot as plt import numpy as np from collections import Counter
データの準備
1000までの乱数を生成し、それを10倍し、int型に変換することで0~10の整数を1000個作成します。
ary = np.random.rand(1000) ary *= 10 ary = ary.astype(int)
数値の出現回数を数え、それを出現回数順に並び替えます。
count = Counter(ary) ranked_data = count.most_common()
ラベルとデータを切り分けます。
labels = [x[0] for x in ranked_data] values = [x[1] for x in ranked_data]
ここまでがデータの準備でした。
使用した機能
- plt.axis('equal')
図が楕円になるのを真円に直す
- plt.figure(figsize=(5,5), dpi=100)
図のサイズを指定、dpiを変える
- plt.title('pie')
図のタイトルを指定
- plt.savefig("pie.png",bbox_inches='tight')
図の保存、きれいにできるようにする
- plt.subplots_adjust(left=0, right=1.2)
凡例を作るためのスペース作成
- plt.pie(values, startangle=90, counterclock=False, autopct='%.1f%%', pctdistance=1.15)
円グラフのスタート位置を指定、データを大きい順に、割合表示、割合の表示位置指定
まとめ
円グラフも描画するだけなら一瞬ですが、きれいに描画するのは色々大変です
gitlabのissue templatesについて
アドベントカレンダー五日目です。
adventar.org
今日はgitlabのissue templatesについて書いていきます。
issue templatesについて
issue templateがあると、templateを選択してissueを書くことが出来ます。
今回はBugというテンプレートを追加しました。
選択するとテンプレートがDescriptionに表示されます。
issue templatesの追加方法
まず、トップディレクトリに .gitlab/issue_templates を作成します。
あとは、テンプレートの名前を決めてmdファイルを作成し、
中身をマークダウンで記述、コミットするだけでそれ以降テンプレートが選択できるようになります。
まとめ
とても簡易にissueのテンプレートを作成できて、
issueが見やすくなるのでお薦めです。
scikit-learnのconfusion matrixとclassification reportについて
アドベントカレンダー四日目です。
昨日に引き続き、scikit-learnの話をしていきましょう。
confusion matrix
必要なライブラリのimport
前回同様numpyと、
訓練データとテストデータを分ける train_test_split、
学習に使うデータの load_digits、
SVM、
新たにconfusion matrixとclassification reportを読み込みます。
import numpy as np from sklearn.cross_validation import train_test_split from sklearn.datasets import load_digits from sklearn import svm from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report
データの取得と分割
同じ流れですが、学習に使うデータを読み込み、次にデータを分割します。
digits.dataでデータが、digits.targetでラベルがとれます。
digits = load_digits() X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)
学習と評価
とりあえず学習します。
clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)
そして、未知データを分類します。
predict_label = clf.predict(X_test)
confusion matrixの表示
confusion matrixを表示します。
これを見ることで、正しいラベルにどれくらい分類されたかが確認できます。
こちらのサイトが参考になるので見てみてください。
混同行列(Confusion Matrix)
print(confusion_matrix(predict_label, y_test)) [[40 0 0 0 0 0 1 0 0 0] [ 0 39 0 0 0 0 0 0 2 0] [ 0 0 47 0 0 0 0 0 0 0] [ 0 0 0 45 0 0 0 0 0 0] [ 0 0 0 0 44 0 0 2 0 0] [ 0 0 0 1 0 42 0 0 0 0] [ 0 0 0 0 0 0 43 0 0 0] [ 0 0 0 0 0 0 0 42 0 0] [ 0 3 0 1 0 0 0 0 53 2] [ 0 0 0 1 0 1 0 1 1 39]]
classification report
今度はclassification reportをみてみましょう。
予測結果の評価に使います。
F値 - 機械学習の「朱鷺の杜Wiki」
print(classification_report(predict_label, y_test)) precision recall f1-score support 0 1.00 0.98 0.99 41 1 0.93 0.95 0.94 41 2 1.00 1.00 1.00 47 3 0.94 1.00 0.97 45 4 1.00 0.96 0.98 46 5 0.98 0.98 0.98 43 6 0.98 1.00 0.99 43 7 0.93 1.00 0.97 42 8 0.95 0.90 0.92 59 9 0.95 0.91 0.93 43 avg / total 0.96 0.96 0.96 450
まとめ
いい感じの関数がscikit-learnだと一瞬で使えてすごいですね。
今度はこれを図で描画したいですね。
scikit-learnのSVMを使ってみた
アドベントカレンダー三日目です。
出かけてて投稿できなかったので同日投稿です。
最近scikit-learnのSVMを使ってみたので、それについて書いていきます
必要なライブラリのimport
今回は、
いつも通りnumpyと、
訓練データとテストデータを分ける train_test_split、
学習に使うデータの load_digits、
あとはSVMを使います。
import numpy as np from sklearn.cross_validation import train_test_split from sklearn.datasets import load_digits from sklearn import svm
データの取得と分割
学習に使うデータを読み込み、次にデータを分割します。
digits.dataでデータが、digits.targetでラベルがとれます。
digits = load_digits() X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target)
学習と評価
最初は何も考えずにデフォルトのまま学習を行います。
わかりやすくするために、明示的にrbfを指定しています。
clf.fit(x,y)で学習が行われます。
clf = svm.SVC(kernel='rbf')
clf.fit(X_train, y_train)
次に、clf.predict(X_test) のようにすることで、未知のデータに対して分類を行います。
今回は、精度の平均を出すために、labelと比較してmeanを使っています。
np.mean(clf.predict(X_test) == y_test)
>>> 0.51555555555555554
別のカーネルを使う
svm.SVCのカーネルを違うものにして、同じように精度を見てみましょう。
clf = svm.SVC(kernel='linear') clf.fit(X_train, y_train) np.mean(clf.predict(X_test) == y_test) >>> 0.96444444444444444
このように精度が大きく変化しました。
まとめ
SVCにも膨大な引数があるので、使う際にはドキュメントを一度見てみましょう。
sklearn.svm.SVC — scikit-learn 0.21.dev0 documentation
あと、scikit-learnはお手軽ですごい。
numpyのよく使う関数について
アドベントカレンダー二日目です!
みなさんnumpyつかってますか?使ってなければめちゃめちゃ使っていきましょう!
今日は自分がよく使うnumpyのメソッドについて書いていきます!
まずはimportからします。
import numpy as np
- array
numpy配列を作成する。
>>> np.array([2,3]) array([2, 3])
- arange
numpyの等差数列を作成する。
引数は開始位置、終了位置、差。
>>> import numpy as np >>> np.arange(10) array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(2,10) array([2, 3, 4, 5, 6, 7, 8, 9]) >>> np.arange(2,10,2) array([2, 4, 6, 8])
- ndim
numpy配列の次元数を表示する。
>>> ary = np.arange(9) >>> ary.ndim 1 >>> ary = ary.reshape(3,3) >>> ary array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> ary.ndim 2
- shape
numpy配列の大きさを返す。
>>> ary = np.array([[10,1],[2,3]]) >>> ary.shape (2, 2)
- reshape
numpy配列の形状を変換する。
>>> ary = np.arange(9) >>> ary.shape (9,) >>> ary.reshape(3,3) array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> ary.reshape(3,3).shape (3, 3)
- concatenate
numpy配列の結合を行う。
>>> ary1 = np.arange(1,4) >>> ary2 = np.arange(4,7) >>> np.concatenate((ary1,ary2)) array([1, 2, 3, 4, 5, 6])
- exp
入力された配列を指数関数を計算し返す。
>>> np.exp(1) 2.7182818284590451 >>> np.exp(np.arange(10)) array([ 1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01, 5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03, 2.98095799e+03, 8.10308393e+03])
- log
logを計算して値を返す。
>>> np.log(2) 0.69314718055994529 >>> np.log(np.arange(3,7)) array([ 1.09861229, 1.38629436, 1.60943791, 1.79175947])
- dot
numpy配列の内積を返す。ゼロディープでも使われてるやつ。
>>> x = np.arange(0,1,0.1) >>> w = np.arange(0,0.5,0.05) >>> np.dot(x,w) 1.4250000000000003
- ceil
値を切り上げて返す。
>>> ary = np.arange(0,3,0.0001) >>> ary array([ 0.00000000e+00, 1.00000000e-04, 2.00000000e-04, ..., 2.99970000e+00, 2.99980000e+00, 2.99990000e+00]) >>> np.ceil(ary) array([ 0., 1., 1., ..., 3., 3., 3.])
- max
与えられた配列から最大の値を返す。
>>> ary = np.arange(9) >>> ary.max() 8
- min
与えられた配列から最小の値を返す。
>>> ary = np.arange(9) >>> ary.min() 0
- mean
与えられた配列の平均値を返す。
>>> ary = np.arange(9) >>> ary.mean() 4.0
- tolist
numpy配列をlistに変換する。
>>> ary = np.arange(9) >>> type(ary) <class 'numpy.ndarray'> >>> type(ary.tolist()) <class 'list'>
- savetxt
配列をファイルで保存する。
>>> ary = np.arange(9) >>> np.savetxt('test.out',ary) >>>
- loadtxt
ファイルから配列を読み込む。
>>> ary = np.loadtxt('test.out') >>> ary array([ 0., 1., 2., 3., 4., 5., 6., 7., 8.])
- random.rand
指定されたshapeの乱数を生成する。
>>> np.random.rand(10) array([ 0.44287235, 0.21692152, 0.84455927, 0.54022887, 0.52577192, 0.9950084 , 0.67096636, 0.98974568, 0.13367928, 0.06666172]) >>> np.random.rand(2,4) array([[ 0.00915183, 0.46581703, 0.94042928, 0.68478671], [ 0.86354656, 0.18085582, 0.35303269, 0.75925584]])
- argmax
配列の最大値のindexを返す。
>>> ary = np.random.rand(10) >>> ary array([ 0.55867085, 0.8495954 , 0.11821661, 0.54879808, 0.66047148, 0.94979863, 0.68124201, 0.3366241 , 0.78051136, 0.46966003]) >>> np.argmax(ary) 5
- argmin
配列の最小値のindexを返す。
>>> ary = np.random.rand(10) >>> ary array([ 0.24730975, 0.21440767, 0.45433659, 0.70008046, 0.1456813 , 0.71550809, 0.07497271, 0.20736947, 0.98423264, 0.66670651]) >>> np.argmin(ary) 6
これくらいです!
皆さんも積極的に使っていきましょう。