🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

Q&A

解決済

2回答

1983閲覧

最小二乗法 tensorflow

uedayuya

総合スコア17

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

0グッド

0クリップ

投稿2019/10/30 13:20

編集2019/10/31 19:24

実現したいこと

多次元関数の予測を最小二乗法を用いて行いたいと考えています。

以下のコードのようにデータは入力400に対して出力1です

python

1 2import pandas as pd 3from sklearn.model_selection import train_test_split 4from sklearn.metrics import accuracy_score 5import numpy as np 6import tensorflow as tf 7 8# データの読み込み 9f_data = pd.read_csv("csv/4-5/potential4-5.csv", encoding="utf-8") 10 11# データをラベルと入力データに分離する (使うのは最後) 12y_data = f_data.loc[:,["angle"]] 13x_data = f_data.iloc[:, range(0,400)] 14x_train, x_test, y_train, y_test = train_test_split( 15 x_data, y_data, test_size=0.2, random_state=42) 16 17 18 19x = tf.placeholder(tf.float32, [None, 400]) #入れ物 20y_ = tf.placeholder(tf.float32, [None, 1]) 21 22W = tf.Variable(tf.zeros([400, 1]))#変数 23b = tf.Variable(tf.zeros([1])) 24 25#y = W*x+b 26y = tf.add(b, tf.matmul(x, W))#入れ物と変数で関数を作る 27 28loss = tf.square(y - y_)#(y-y_)^2 29losses = tf.reduce_sum(loss)#Σ(y-y_)^2 30train = tf.train.AdamOptimizer().minimize(losses) 31 32init = tf.initialize_all_variables() 33 34sess = tf.Session() 35sess.run(init) 36 37for epoch in range(50000): 38 #入れ物にデータを入れる 39 sess.run(train, feed_dict={x:x_train, y_:y_train}) 40 if epoch % 10000 == 0: 41 #入れ物にデータを入れる 42 losses_val=sess.run(losses, feed_dict={x:x_train, y_:y_train}) 43 print(epoch, losses_val) 44 45 46""" 47 pot1 pot2 pot3 pot4 ... pot397 pot398 pot399 pot400 480 6.770000e-13 2.310000e-09 3.000000e-06 5.808920e-04 ... 2.810000e-75 5.080000e-81 5.150000e-86 7.280000e-92 491 9.620000e-13 5.120000e-09 5.540000e-06 8.867230e-04 ... 4.560000e-76 6.020000e-82 4.080000e-87 3.880000e-93 502 1.060000e-12 5.890000e-09 6.370000e-06 1.019262e-03 ... 4.560000e-76 6.020000e-82 4.080000e-87 3.880000e-93 513 5.550000e-13 1.020000e-09 1.600000e-06 3.735150e-04 ... 4.560000e-76 6.020000e-82 4.080000e-87 3.880000e-93 524 5.550000e-13 1.020000e-09 1.600000e-06 3.735150e-04 ... 4.560000e-76 6.020000e-82 4.080000e-87 3.880000e-93 53.. ... ... ... ... ... ... ... ... ... 54594 1.430000e-36 8.270000e-31 6.640000e-26 7.450000e-22 ... 4.720000e-09 1.360000e-12 5.510000e-17 3.120000e-22 55595 4.860000e-37 2.820000e-31 2.270000e-26 2.540000e-22 ... 7.200000e-09 2.070000e-12 8.420000e-17 4.760000e-22 56596 4.860000e-37 2.820000e-31 2.270000e-26 2.540000e-22 ... 5.210000e-09 1.230000e-12 4.120000e-17 1.910000e-22 57597 1.630000e-37 9.440000e-32 7.580000e-27 8.510000e-23 ... 5.210000e-09 1.230000e-12 4.120000e-17 1.910000e-22 58598 1.630000e-37 9.440000e-32 7.580000e-27 8.510000e-23 ... 3.630000e-09 7.070000e-13 1.940000e-17 7.380000e-23 59""" 60

##問題
学びなおしてプログラムを組みました。
クロスエントロピーはクラス分類で使うものだったらしく間違っていたみたいです。
最小二乗法で傾きを出し、その傾きが0になるときのWを求めたいのですがこれでいいのでしょうか?

数学的に言えば誤差の2乗の和をWで偏微分したときに0になるときのWが求めたいものなのですが
tf.train.AdamOptimizer().minimize(losses)などをせずに地道に計算したほうがいいでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

記載のコードは2クラス識別のコードであって数値予測(回帰)ではありません。
加えていうと質問には「最小二乗でを用いて」となっていますが、コードはクロスエントロピー誤差の最小化が用いられています。

このあたりが期待した結果とならない要因と思われます

投稿2019/10/31 19:07

R.Shigemori

総合スコア3376

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

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

uedayuya

2019/10/31 20:01 編集

確かに数値の予測はこのコードだけではできないことはわかるのですが誤差が0の時のWに対して400x1のXをかけてあげれば予測できるのではないのでしょうか? クロスエントロピーについてまだ理解しきれていないみたいなので学ぼうと考えていますが、reduce_sumがいけないということでしょうか?
R.Shigemori

2019/10/31 20:33

編集されたコードを見た限り、問題ないと思います。実行してlossesがゼロに近づいていくような推移を示せば学習が進んでいることになります
guest

0

python

1x = tf.placeholder(tf.float32, [None, 400]) #任意の数(None)の400次元のデータ (None, 400) 2 3y = tf.layers.dense(x,units=1) # (None, 1)

です。

投稿2019/10/30 13:41

編集2019/10/30 13:42
qax

総合スコア622

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

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

uedayuya

2019/10/30 15:11

回答者さんの教えてくださった回答をもとにプログラムを書いてみたのですが、正答率が0になってしまいます。考えられる原因は2つあり、1つ目はtf.equal(tf.abs(y), tf.abs(y_))という考え方が間違っており、別のもの同士を比較している。2つ目は、角度を出力にしており、現在0~360のどれか1つを出力するので出力1としているが、0と1のリスト(例えば0ならば[1,0,0,・・・,0])に書き換えてtf.equal(tf.argmax(y,1), tf.argmax(y_,1))をするべき。のどちらかまたは両方だと考えてます。回答者さんの意見を聞かせていただきたいです。
qax

2019/10/30 22:12 編集

なぜ、yを別に生成しているのでしょう? yは入力データのラベルそのものであり、xから求めるべきものではありません。
qax

2019/10/30 23:47

ちなみに、 y_ = tf.layers.dense(x,units=1) と W = tf.Variable(tf.zeros([400, 1])) b = tf.Variable(tf.zeros([1])) y = tf.nn.softmax(tf.matmul(x, W) + b) はほぼ同じ意味を表します。
uedayuya

2019/10/31 17:19 編集

何度も質問してしまい申し訳ありません。 tf.layers.dense(x,units=1)がよくわからなかったので、学びなおして別のアプローチをとり、プログラムを書いてみました。losses_valが0になった時のWが入力に対して適切な出力をだすWになるということでよろしいでしょうか?また角度の0~360を正規化したほうがいいのでしょうか?
R.Shigemori

2019/10/31 20:35 編集

編集されたコードを見た限り、問題ないと思います。実行してlossesがゼロに近づいていくような推移を示せば学習が進んでいることになります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問