読者です 読者をやめる 読者になる 読者になる

メモランダム!!

自分用の端書のため,他の人が読めるようには書いていません.悪しからずm(_ _)m

ランダム関数について

numpyランダム関数を色々使ってみました.

まずはインポート

In [1]: import numpy as np


random()は0から1までの値が得られる

In [10]: np.random.random()
Out[10]: 0.45226808024834264


引数を入れると,入れた数字分の乱数が得られる

In [12]: np.random.random(5)
Out[12]: array([ 0.93385679,  0.6383795 ,  0.20373784,  0.76812241,  0.42309771])


範囲指定は出来ないみたいです

In [13]: random.uniform(1,100)
Traceback (most recent call last):


random.uniformで値を指定できるみたいです

In [14]: np.random.uniform(1,100)
Out[14]: 8.543481477277378

In [17]: np.random.uniform(2,5)
Out[17]: 2.2877891814898934


引数を入れないとrandom()と同じなんですかね?

In [15]: np.random.uniform()
Out[15]: 0.4615576165499794


範囲を指定して,個数も指定できるみたいです

In [18]: np.random.uniform(2,5,3)
Out[18]: array([ 4.67283745,  2.26006292,  4.18645001])

Jupyterでmatplotlibのメイリオを使うとしたらエラーが出た

表題のような現象が見られたので,次のように書き換えてみた

import matplotlib
import matplotlib.pyplot as plt

plt.style.use('ggplot') # ggplotを使う
matplotlib.rc('font', family='sans-serif')

移動平均を計算しようとすると「FutureWarning: pd.rolling_mean is deprecated for Series and will be removed in a future version, replace with ・・・」と出て来る


FutureWarning: pd.rolling_mean is deprecated for Series and will be removed in a future version, replace with ・・・


stackoverflow.com

特定の行・列を残す:Python,Numpy

Pandasで条件を指定して行・列を抜き出すやつが有ると思います.正式名称は分かりませんが,df[val>0]みたいなやつです.Numpyのarrayでおんなじことが出来るか試したので,メモ書きしておきます.

まずはこんな感じで配列を作ります.そして1個飛ばしで列を獲得できるかやってみます.

In [31]: import numpy as np

In [32]: a = np.array([[ 0,  1,  2,  3],
    ...:            [ 4,  5,  6,  7],
    ...:            [ 8,  9, 10, 11],
    ...:            [12, 13, 14, 15]])

In [33]: label = np.array([ 0,  1,  0,  1])

In [34]: mask = (label == 1)

まずは一個飛ばしで列を獲得してみます.
f:id:shu10038:20170411165227j:plain

In [35]: a[:,mask]
Out[35]: 
array([[ 1,  3],
       [ 5,  7],
       [ 9, 11],
       [13, 15]])


続いて一個飛ばしで行を獲得してみます.
f:id:shu10038:20170411165210j:plain

In [36]: a[mask,:]
Out[36]: 
array([[ 4,  5,  6,  7],
       [12, 13, 14, 15]])


それでは,一個飛ばしで行と列の両方を獲得するにはどうやるのでしょう?
f:id:shu10038:20170411165244j:plain

In [37]: a[mask,mask]
Out[37]: array([ 5, 15])

これだと上手く行かないので,次のように書いてみました.

In [38]: a[:,mask][mask,:]
Out[38]: 
array([[ 5,  7],
       [13, 15]])

Pythonでargmaxとかargmin

タイトルにはargmaxとargminについて書いてあるみたいですが,本記事ではargmaxのみです.argminも使い方は同じなので書いてません.
まずは配列を用意します.

In [8]: import numpy as np

In [9]: a = np.array([[1,2,3],[4,5,6],[7,8,9],[2,8,2]])

あとはご覧の通り

In [10]: a.argmax(axis=0)
Out[10]: array([2, 2, 2], dtype=int64)

In [11]: a.argmax(axis=1)
Out[11]: array([2, 2, 2, 1], dtype=int64)

In [12]: a.argmax()
Out[12]: 8

sum()とsum(1)は何が違うのか??:Python,NumPy

全部足すか列ごとに足すかの違いでした~

In [46]: import numpy as np

In [47]: A=np.array([[  2,4,6.],
    ...:  [  4,8,12.],
    ...:  [  6,12,18.]])

In [48]: A.sum()
Out[48]: 72.0

In [49]: A.sum(1)
Out[49]: array([ 12.,  24.,  36.])

カーネル関数の使い方:scikit-learn

Pythonのscikit-learnのカーネルを使ってどういう出力が出るのかをいろいろ試してみたので,メモ書きしておきます.いやぁ,今までJavaで一生懸命書いてましたが,やっぱりPythonだと楽でいいですねー.

もくじ

最初に注意する点

使い始めてつまずいた所.一次元の配列だとエラーが出るみたいです.

import numpy as np
from sklearn.metrics import pairwise

x = np.array([1, 1]) #([[1, 1]])じゃないとだめ

print(pairwise.rbf_kernel(x))

と書くと,

DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.

と言う具合に「データとしての1次元配列の受け渡しは0.17で廃止されました」と言われます.なので,ベクトルを使う場合はコメントに書いたみたいに明示的に列が一次元であることを書かないと駄目みたいです.

線形カーネル

カーネルAPIの入出力関係を確認するために,まずは線形カーネルから試してみたいと思います.(線形カーネルは検算が簡単そうなので..)
リファレンスはこちら
sklearn.metrics.pairwise.linear_kernel — scikit-learn 0.18.1 documentation

まずは簡単な例から

リファレンスを見ながら単純な例を試しみました.

import numpy as np
from sklearn.metrics import pairwise

x = np.array([[1, 1]])
y = np.array([[2, 2]])

print(pairwise.linear_kernel(x,y))

カーネルの計算式は次の通り.
{k\left( x,y \right) = \mathbf{x}^T \mathbf{y} }
内積を計算しているので,出力は4になるはずです.

出力結果
[[ 4.]]

と狙い通りになりました.

データが多次元だったら

実際のデータって {\left(1,2   \right),\left(3,4   \right),\left(5,6   \right), \dots }みたいに,点が沢山入っているわけです.
ではデータが多次元の場合はどうなるでしょうか??

import numpy as np
from sklearn.metrics import pairwise

x = np.array([[1, 1],[2, 2],[3, 3]])

print(pairwise.linear_kernel(x))

と書くと出力結果はこうなります

出力結果
[[  2.   4.   6.]
 [  4.   8.  12.]
 [  6.  12.  18.]]

これって例えば {\mathbf{X}=(\mathbf{x}_1,\mathbf{x}_2,\mathbf{x}_3) }とあったら,上の行は {\mathbf{x}_{1}^T\mathbf{x}_1 }{\mathbf{x}_{1}^T\mathbf{x}_2 }{\mathbf{x}_{1}^T\mathbf{x}_3 }と計算しているみたいで,上から二段目の行は {\mathbf{x}_{2}^T\mathbf{x}_1 }{\mathbf{x}_{2}^T\mathbf{x}_2 }{\mathbf{x}_{2}^T\mathbf{x}_3 }と計算しているみたいです.3行目も同じようです.

ガウシアンの動径基底関数

ドキュメントは下記の通り

動径基底関数はなんぞや?という話は次の通り

実際に使ってみるとこんな感じです.

import numpy as np
from sklearn.metrics import pairwise

x = np.array([[1, 1]])
y = np.array([[2, 2]])

print(pairwise.rbf_kernel(x,y))

と書くと

[[ 0.36787944]]

 {k\left( x,y \right) =exp\left( -\gamma \left\| \mathbf{x}-\mathbf{y} \right\|  \right) 
}

物の本を読むと{ \gamma ={ 1 }/{ 2{ \sigma  }^{ 2 } } 
}らしいのですが,このライブラリの場合はなにもしないと{ \gamma ={ 1 }/{ (\mathbf{x}の要素数) } 
}らしいです.なので{ exp\left\{ { -1 }/{ 2 }\left( { 1 }^{ 2 }+{ 1 }^{ 2 } \right)  \right\} =0.36787944\cdots  
}





きょうはこんな感じで