前提・実現したいこと
以下の画像のようなソフトマックス関数を実装したいです。
ただし、入力をx=x_1,x_2,...,x_D)^T(D×1行列)として考えています。
困っている詳細内容
画像のz_kを求める為のソフトマックス関数の定義は書く事ができました。
python
1def softmax(a): 2 u = np.exp(a) 3 return u/np.sum(u)
実際にこれを用いてipython上で実行してみると
In [1]: import numpy as np In [2]: def softmax(a): ...: u = np.exp(a) ...: return u/np.sum(u) In [3]: softmax([1,2,3]) Out[3]: array([0.09003057, 0.24472847, 0.66524096])
となり、かけている事がわかります。
次に、y_kの実装ですが以下のソースコードに合わせて実装する方法がイマイチ分かっていません。
ソースコード
学習データを作成する為のプログラム(makeGaussianData.py)
python
1import numpy as np 2 3def getData(nclass, seed = None): 4 assert nclass == 2 or nclass == 3 5 6 if seed != None: 7 np.random.seed(seed) 8 9 # 2次元の spherical な正規分布3つからデータを生成 10 X0 = 0.10 * np.random.randn(200, 2) + [ 0.3, 0.3 ] 11 X1 = 0.10 * np.random.randn(200, 2) + [ 0.7, 0.6 ] 12 X2 = 0.05 * np.random.randn(200, 2) + [ 0.3, 0.7 ] 13 14 # それらのラベル用のarray 15 lab0 = np.zeros(X0.shape[0], dtype = int) 16 lab1 = np.zeros(X1.shape[0], dtype = int) + 1 17 lab2 = np.zeros(X2.shape[0], dtype = int) + 2 18 19 # X (入力データ), label (クラスラベル), t(教師信号) をつくる 20 if nclass == 2: 21 X = np.vstack((X0, X1)) 22 label = np.hstack((lab0, lab1)) 23 t = np.zeros(X.shape[0]) 24 t[label == 1] = 1.0 25 else: 26 X = np.vstack((X0, X1, X2)) 27 label = np.hstack((lab0, lab1, lab2)) 28 t = np.zeros((X.shape[0], nclass)) 29 for ik in range(nclass): 30 t[label == ik, ik] = 1.0 31 32 return X, label, t 33 34 35if __name__ == '__main__': 36 37 import matplotlib 38 import matplotlib.pyplot as plt 39 40 K = 3 41 42 X, lab, t = getData(K) 43 44 fig = plt.figure() 45 plt.xlim(-0.2, 1.2) 46 plt.ylim(-0.2, 1.2) 47 ax = fig.add_subplot(1, 1, 1) 48 ax.set_aspect(1) 49 ax.scatter(X[lab == 0, 0], X[lab == 0, 1], color = 'red') 50 ax.scatter(X[lab == 1, 0], X[lab == 1, 1], color = 'green') 51 if K == 3: 52 ax.scatter(X[lab == 2, 0], X[lab == 2, 1], color = 'blue') 53 plt.show()
以下は先程の式を実装しようとしたプログラム
python
1import numpy as np 2import makeGaussianData 3import matplotlib.pyplot as plt 4 5K = 3 6X, lab, t = makeGaussianData.getData(K) #学習データの作成 7 8w = 0.02*np.random.rand(X.shape[0],K)-0.01 #パラメータの初期化 9b = 0.02*np.random.rand(K)-0.01 10 11def softmax(a): 12 u = np.exp(a) 13 return u/np.sum(u) 14 15y = b + np.sum((w.T @ X)) #y[k]の計算 16z=softmax(y) 17print(z.shape,z)
なお、学習データは以下のように表示できます。また、Xのshapeは(600,2)です。
自分ではwの定義がおかしいと思っていますがどうでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/30 00:05
2020/07/30 00:40
2020/07/30 01:19
2020/07/30 04:17 編集