質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2029閲覧

ロジスティック回帰のソフトマックス関数の実装について

takuya324232506

総合スコア7

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/29 14:53

前提・実現したいこと

以下の画像のようなソフトマックス関数を実装したいです。
ただし、入力を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の定義がおかしいと思っていますがどうでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

wの形状がおかしいように思えます。

w = 0.02*np.random.rand(X.shape[0],K)-0.01 #パラメータの初期化
ここでX.shape[0]を使っていますが、X.shape[1]ではないでしょうか?

投稿2020/07/29 16:51

編集2020/07/29 16:53
segavvy

総合スコア958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takuya324232506

2020/07/30 00:05

ありがとうございます。 しかし、上記の式ではwはK×D行列だと解釈しているのですがどうでしょうか?
segavvy

2020/07/30 00:40

解こうとされている問題がわからないので掲載コードからの想像なのですが、Dは2(=X.shape[1])ではないのでしょうか?
takuya324232506

2020/07/30 01:19

解こうとしている問題はmakeGaussianData.pyで作成したデータ(学習・テスト共に同じデータ)を使用して3クラスに分類するというものです。(学習には確率的勾配降下法) 今回のxは(ベクトル)x_n=(x_n,y_n)としてD×1行列で指定しています。 上記の式ではDは600(データ数)、Kは3(識別するクラス数)として考えているため、自分はwが600×3であると考えています。
segavvy

2020/07/30 04:17 編集

600個のデータがあり、そのそれぞれに対して、どのクラスに該当するのか?を推測する問題だと思います。つまり、1x2のデータが600個あり、y_kもそれぞれに対応した600セットが求められるのではないかと思います。 掲載コードから、入力層のニューロン数は2で出力層は3というニューラルネットワークを構築されているのかと思いますが、もしそうであれば重みwは2x3になるかと思います。 私の勘違いでしたら恐縮です。 出題元に確認いただくのが良いかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問