現在、ロジスティック回帰の計算をnumpy、sympyを使用して追いかけながら学習しています。
以下が私が書いた交差エントロピー誤差を求める式です。
#説明変数をXとおく X = np.array([[2,2,1], [7,8,1]]) #クラスをtとおく t = np.array([1,0]) #sympyのSymbolを使用し重み変数を設定 w = np.array([w0, w1, w2]) #交差エントロピー誤差 Lw = 0 for i in range(len(X)): Lw -= t[i] * np.dot(X[i], w.T) - sym.log(1 + sym.exp(np.dot(X[i], w.T))) dLw = sym.diff(Lw, w[0])
プログラムを動かした結果、以下のようなエラーが表示されてしまいました。
AttributeError: 'ImmutableDenseNDimArray' object has no attribute 'as_coeff_Mul'
以前重回帰分析も同様の方法で学習したのですが、その時には各重みによっての微分がうまくできたので原因がわからない状態です。解決方法について教えていただけると助かります。よろしくお願いします。
上記コードについて、自然対数の乗数を先に計算して、それを当てはめていくという方法であればうまくいきました。
以下に作成したコードを示します。
python
1#説明変数をXとおく 2X = np.array([[2,2,1], [7,8,1]]) 3 4#クラスをtとおく 5t = np.array([1,0]) 6 7#sympyのSymbolを使用し重み変数を設定 8w = np.array([w0, w1, w2]) 9 10説明変数に対する各自然対数の乗数を計算 11e = [] 12for i in range(len(X)): 13 m = 0 14 for j in range(len(X[0])): 15 m += (X[i][j]*w[0][j]) 16 e.append(m) 17 18#交差エントロピーの第1項を計算 19Lw_1 = 0 20for i in range(len(X)): 21 Lw_1 -= t[i] * np.dot(X[i], w.T) 22 23#交差エントロピーの第2項を計算 24Lw_2 = 0 25for i in range(len(X)): 26 Lw_2 += sym.log(1+sym.exp(e[i])) 27 28#各項を繋げる 29Lw = Lw_1 + Lw_2 30コード
ただ、出力はできたのですが正しく計算が行われているのか疑問です。上記の記法でも問題ないのでしょうか?
大変アバウトな質問となってしまい申し訳ありません。
あなたの回答
tips
プレビュー