NumpyのMeshgrid関数

numpy.meshgridは以下のようにNumpy配列を生成します。 画像などの座標位置とか3次元グラフのX,Y軸の座標とかのIndexに使われるmeshgridを生成する。 つまり(0,0),(0,1)….(1,0),(1,1)….のようなデータを作るのにも使われます。 一つの例 $Z = X * np.exp(-X^2-Y^2) -1$ を通して、meshgridのイメージをつかむ。 import numpy as np x = np.mgrid[-2:2:0.2] # [-2, -1.8, -1.6, ... , 1.6, 1.8] y = np.mgrid[-2:2:0.2] X, Y = np.meshgrid(x, y) Z = X * np.exp(-X**2-Y**2) -1 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm fig = plt.figure(figsize=(20,15)) ax = fig.gca(projection='3d') plt.xlabel('X') plt.ylabel("Y") #surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,linewidth=0.1, antialiased=False) surf = ax.

TensorflowでLinear Regressionをテストする

線形回帰は $Ax= b$ の形でメトリックス方程式で表すことができる。ここで係数$x$を求めたい。 結果は $x = (A^T A)^{-1}A^Tb$ 二次元のデータを生成してTensorflowを利用して、問題を解決する。 以下ではA.shape = (100, 2), b.shape=(100,1) 最後にx.shape=(2,1)、xの中の要素はslope(傾き)とy intercept(y切片) import matplotlib.pyplot as plt import numpy as np import tensorflow as tf sess = tf.Session() x_vals = np.linspace(0, 10, 100) # 標準正規乱数 (平均:0.0, 標準偏差:1.0) に従う乱数を 100 件出力 y_vals = x_vals + np.random.normal(0, 1, 100) x_vals_column = np.transpose(np.matrix(x_vals)) ones_column = np.transpose(np.matrix(np.repeat(1, 100))) A = np.column_stack((x_vals_column, ones_column)) b = np.transpose(np.matrix(y_vals)) A_tensor = tf.constant(A) b_tensor = tf.

Word Cloud

ワインのレビューを使って、word cloudを作成する。 レビュー全体のword cloudを作る import pandas as pd from wordcloud import WordCloud import matplotlib.pyplot as plt % matplotlib inline df = pd.read_csv("data/winemag-data-130k-v2.csv", index_col=0) # 1個目のレビューのword cloud text = df.description wordcloud = WordCloud.generate(text) plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") plt.show() Fraceのレビューを作る frace_description = df[df.country == "France"].description text = ' '.join(frace_description) wordcloud = WordCloud().generate(text) # Display the generated image: plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") plt.show() 国別のword cloudを作って、レビューも違ってくることがわかる。

Jaccard係数

Jaccard係数は2つの集合に含まれている要素のうち共通要素が占める割合を表しています。 Jaccard係数が大きいほど2つの集合の類似度は高い $$ J(A, B) = \frac{|A \bigcap B|}{|A \bigcup B|} $$ Rで計算してみます > library('clusteval') > vec1 = c(1,1,1,0,0,0,0,0,0,0,0,0) > vec2 = c(0,0,1,1,1,1,1,0,1,0,0,0) > cluster_similarity(vec1, vec2, similarity = "jaccard") [1] 0.3269231

MNISTデータセットをT-SNEで可視化

scikit learnからMNISTデータセットを取得して、T-SNEを適応した後に描画する。 from sklearn.datasets import fetch_mldata mnist = fetch_mldata('MNIST original') type(mnist) sklearn.utils.Bunch ランダムに10000のデータを選択する import numpy as np np.random.seed(42) m = 10000 idx = np.random.permutation(60000)[:m] idx array([12628, 37730, 39991, ..., 3256, 14474, 41816]) Yはtargetで、1-9までの数値に当てはまる。 X = mnist['data'][idx] Y = mnist['target'][idx] MNISTを2次元のデータに変換するのは2分ぐらいかかります。 from sklearn.manifold import TSNE tsne = TSNE(n_components=2, random_state=42) X_reduced = tsne.fit_transform(X) 変換したテータを描画して、クラスタになっていることを確認する。 %matplotlib inline import matplotlib import matplotlib.pyplot as plt plt.figure(figsize=(13,10)) plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=Y, cmap="jet") plt.colorbar() plt.

Kubernetes PodのCapabilities

KubernetesにPodを作るとき,securityContextフィールドにコンテナの各種capabilitiesを追加,あるいは削除することができます. 例えば下のようなPodサンプルYamlファイルがあります. $ tee capabilities-pod.yaml <<-'EOF' apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: myshell image: "ubuntu:14.04" command: - /bin/sleep - "300" securityContext: capabilities: add: - NET_ADMIN <<---- これ EOF $ kubectl create -f capability-test-pod.yaml # Podを作る pod "mypod" created $ kubectl exec mypod -- capsh --print # コンテナのcapabilitiesの中にやはりcap_net_admin出てきた Current: = ...,cap_net_admin, ..., cap_setfcap+eip ... capsh --printコマンドはコンテナのcapabilitiesを表示させるコマンドです. そもそも Container Capabilitiesはなんですか? それを気になって,調べていました. Linux Capabilities Container Capabilitiesを説明する前にまずLinux Capabilitiesを知る必要があります. Linux Kernel 2.

逆伝播の仕組み

やりたいことは簡単のニューラルネットワークの逆伝播の仕組みを計算することです。自分の中の整理のためでもあります。 もっともシンプルの例で、猫なのか、猫じゃないなのかを判断するただ一層のニューラルネットワークで、一枚の画像で訓練するとします。下の図で仕組みを表しています。 上の図では $x$ : 入力画像 $w$: 求めたい重み $b$: 求めたいバイアス $z$: 順伝播(Forward Propagation)の線形部分 $a$: $z$に対して活性化関数を適した後 $L$: 損失関数(Lost function) 砕けた言い方にするとニューラルネットワークの目的は損失関数を小さくして、その時に重み($w$)とバイアス ($b$) を求めるだけです。 猫であるかどうかを判断する2分類の問題は損失関数として、クロスエントロピー関数(Cross entropy)を使うことができます。下の形になっています。 $L(a, y) = −(ylog(a)+(1−y)log(1−a))$ $a$: 毎回訓練の結果を表しています。0.2, 0.6, 0.9などを値になります。 $y$: 実際ある画像は猫であるかどうかを示す値で、例えば0か1かになります。 $z$に活性関数(Activation Function)を適応する結果は$a$で、活性関数はシグモイド関数の場合、$a = \frac{1}{1+e^{-z}}$ です。 このネットワークの目的は$dW$ (重みの微分)と $db$(バイアスの微分)を求めることで、これらを求めたら下の式で少しずつ重み$W$と$b$を更新して、損失関数の値を小さくします。$\alpha$は学習率(Learning rate) $W^{[l]} = W^{[l]} - \alpha \text{ } dW^{[l]}$ $b^{[l]} = b^{[l]} - \alpha \text{ } db^{[l]} $ 目標がわかったので、これで$dW$を求めてみます。 $dW = \frac{d}{dW}{L(a, y)}$ 微分法の中で連鎖律があって、$dW$は下の形に書き換えることができます。 $dW = \frac{dL(a,y)}{da}\frac{da}{dz}\frac{dz}{dW}$ タスクをブレイクダウンして、求めると $da = \frac{dL(a,y)}{da} = (−(ylog(a)+(1−y)log(1−a)))‘$

Hello World With Keras

KerasでMNIST手書き数字を分類する。 from keras.datasets import mnist from keras import models from keras import layers from keras.utils import to_categorical import matplotlib.pyplot as plt (train_images, train_labels), (test_images, test_labels) = mnist.load_data() network = models.Sequential() # 最初の隠れ層は512を設定する, 活性化関数をReluを設定する network.add(layers.Dense(512, activation="relu", input_shape=(28*28,))) # 出力10個、0-9まで10個の出力あるから network.add(layers.Dense(10, activation="softmax")) network.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=["accuracy"]) train_images = train_images.reshape((60000, 28*28)) train_images = train_images.astype("float32") / 255 test_images = test_images.reshape((10000, 28*28)) test_images = test_images.astype("float32") / 255 # 整数のクラスベクトルから2値クラスの行列への変換します. # https://keras.io/ja/utils/#to_categorical categorical_train_labels = to_categorical(train_labels) categorical_test_labels = to_categorical(test_labels) # fit the model to its training data # the network iterate on the training data in mini-batches of 128 samples, 5 times over # each iteration over all the training data is called an epoch history = network.

(WIP)Pythonのメモ

分数を扱う In [1]: from fractions import Fraction In [2]: f = Fraction(3,4) In [3]: f Out[3]: Fraction(3, 4) In [4]: f + 0.26 Out[4]: 1.01 複素数 In [5]: a = complex(2,3) In [6]: a Out[6]: (2+3j) In [7]: a.real ## 実部 Out[7]: 2.0 In [8]: a.imag ## 虚部 Out[8]: 3.0

シグモイド関数の微分

シグモイド関数(Sigmoid function)は $f(x) = \frac{1}{1+e^{-ax}} (a > 0) $ の形をしている関数です。下の図で表しています。 値は(0, 1)の間にあるので、よく確率として使われています。例えば 0.7だったら70%の確率という意味をします。 ニューラルネットワークの中で、シグモイド関数はよくTrue/Falseの判定に使われています。例えば画像が猫なのか、猫じゃないなのかを判断する場合、0.7だったら、猫であると判定します。 このようなニューラルネットワークを実装する際に逆伝播(Back propagation)を実装する必要になります。その中の一部として、シグモイド関数の微分を求めることになります。 シグモイド関数の微分は 下の形をしています。これを方程式を使えば、Numpyでかなり簡単に実装できるようなります。 $$ f(x) = \frac{1}{1+e^{-ax}} (a > 0) \\ f(x)’ = af(x)(1−f(x)) $$ 上の方程式を導いてみると $$ (\frac{1}{1+e^{-ax}})’ = \\ \frac{-1} {(1+e^{-ax})^2} (1+e^{-ax}) = \\ \frac{-1} {(1+e^{-ax})^2} (e^{-ax})(-ax)’ = \\ \frac{-1} {(1+e^{-ax})^2} (e^{-ax})(-a) = \\ \frac{ae^{-ax}} {(1+e^{-ax})^2} = \ \frac{a}{(1+e^{-ax})} \frac{e^{-ax}}{(1+e^{-ax})} = \ \frac{a}{(1+e^{-ax})} \frac{1+ e^{-ax} -1 }{(1+e^{-ax})} = \ af(x)(1-f(x)) $$ $a = 1$の時に $f(x)’ = f(x)(1-f(x)) $ になります。