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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

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

Python

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

Q&A

2回答

1807閲覧

回帰分析の予測値の粒度を上げたい

yaju

総合スコア14

機械学習

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

Python

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

0グッド

0クリップ

投稿2018/03/27 14:14

たかしくんは八百屋へお使いに行きました。
リンゴ1個とミカン3個を買うと190円,リンゴ3個とミカン1個を買うと330円するようです。
リンゴ2個とミカン4個を買うといくらになるでしょうか?
TensorFlowコトハジメ 八百屋で勾配降下法

手動計算では、答えが90円と30円になるのですが、TensorFlowで組んだ場合に答えが99円と25円というように1円単位になります。
これを、TensorFlowで組んだ場合でも10円単位で答えが出るようにしたい場合、どのようにすればいいのでしょうか。

GradientDescentOptimizer(0.02) の値を(10.02) とすると逆に答えが出なくなってしまう。

予測値の粒度を上げるという表現がどうかと思ったのですが、言葉が思いつかなかった。

# coding: utf-8 # 必要なモジュールを読み込む import numpy as np import tensorflow as tf # 1. 予測式(モデル)を記述する # 入力変数と出力変数のプレースホルダを生成 x = tf.placeholder(tf.float32, shape=(None, 2), name="x") y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y") # モデルパラメータ a = tf.Variable(tf.zeros((2, 1)), name="a") # モデル式 y = tf.matmul(x, a) # 2. 学習に必要な関数を定義する # 誤差関数(loss) loss = tf.reduce_mean(tf.square(y_ - y)) # 最適化手段を選ぶ(最急降下法) train_step = tf.train.GradientDescentOptimizer(0.02).minimize(loss) # 3. 実際に学習処理を実行する # (1) 訓練データを生成する train_x = np.array([[1., 3.], [3., 1.], [5., 7.]]) train_y = np.array([190., 330., 660.]).reshape(3, 1) print("x=", train_x) print("y=", train_y) # (2) セッションを準備し,変数を初期化 sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) # (3) 最急勾配法でパラメータ更新 (100回更新する) for i in range(100): _, l, a_ = sess.run([train_step, loss, a], feed_dict={x: train_x, y_: train_y}) if (i + 1) % 10 == 0: print("step=%3d, a1=%6.2f, a2=%6.2f, loss=%.2f" % (i + 1, a_[0], a_[1], l)) # (4) 学習結果を出力 est_a = sess.run(a, feed_dict={x: train_x, y_: train_y}) print("Estimated: a1=%6.2f, a2=%6.2f" % (est_a[0], est_a[1])) # 4. 新しいデータに対して予測する # (1) 新しいデータを用意 new_x = np.array([2., 4.]).reshape(1, 2) # (2) 学習結果をつかって,予測実施 new_y = sess.run(y, feed_dict={x: new_x}) print(new_y) # 5. 後片付け # セッションを閉じる sess.close()

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

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

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

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

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

guest

回答2

0

今回のケースであれば、モデルとコスト関数を変えるといいかと思います。

まず、この問題の本質はリンゴ+ミカン×3=190とリンゴ×3+ミカン=330を満たすリンゴとミカンの値を求めることで、連立方程式を解くことを意味します。この場合、連立方程式を解くことはふたつの式の交点を求めることと同意なので、

リンゴ+ミカン×3-190=リンゴ×3+ミカン-330

と式変形します。表記を簡単するため、左辺をfunc1右辺をfunc2として更に式変形すると

func1-func2=0

となります。今回の問題はこのfunc1-func2をリンゴとミカンの値をオプティマイザーを使って更新して、限りなくゼロに近づけることということになります。
よって、モデル式はfunc1-func2になります。コスト関数はfunc1-func2がゼロに近づけることが目的なので、絶対値誤差でいいかと思います。もしかすると、今の二乗誤差でもうまくいくかもしれません。
この場合、説明変数は(1,3,3,1)、目的変数は0でいいかと思います。(モデル式の形に依存)つまり、訓練データを生成する必要はないということです。

アプローチ方法が連立方程式を解くというところから出発しているので、イメージとかなり違うと思いますが、リンゴとミカンの値は解析的に解いたものに近くなるはずです。

なお、単純に連立方程式の解を求めるのであれば、行列式を使う方法やscipyにある連立方程式の近似解を求める関数を使う方法もあります

投稿2018/03/27 20:49

R.Shigemori

総合スコア3376

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

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

yaju

2018/03/28 00:29

この問題はあくまで例題なので、訓練なく連立方程式を解くでも求められるんでしょうけど。 別の問題の時でも、似たようなことが出来る方法が分かればいいなと思ったのです。 絶対値誤差で試してみます。
guest

0

結果について四捨五入すれば良さそうですが。

カテゴリの場合も、小数で割合が出て、それの最大のインデックスを取っているので、同じことをやればいいと思います


python

1import numpy as np 2 3np.random.seed(0) 4 5a = np.random.randint(0, 300, size=(10)) 6print(a) 7# [172 47 117 192 251 195 9 211 277 242] 8 9b = np.round(a, decimals=-1) 10print(b) 11# [170 50 120 190 250 200 10 210 280 240]

python

1new_y = sess.run(....) 2 3new_y = np.round(new_y, decimals=-1)

投稿2018/03/27 14:22

編集2018/03/27 23:44
mkgrei

総合スコア8560

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

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

yaju

2018/03/27 14:30

すみません。回答内容が理解できないです。具体的にはどうすればいいのでしょう。
yaju

2018/03/27 14:55

Tensorflowの場合、new_y = sess.run(y, feed_dict={x: new_x}), decimals=-1) としても答えが四捨五入されないんですよね。単純な四捨五入ではないわけですよ。
mkgrei

2018/03/27 23:47

sessというのはtensorflowのセッションを管理するクラスのインスタンスなので、四捨五入しません。 numpy.roundを使えば四捨五入できますが、お望みの挙動ではないということでしょうか。
yaju

2018/03/28 00:16

sessのインスタンスに挟んでroundしたコメントはミスです、ごめんなさい。 new_y = np.round(new_y, decimals=-1) としても、Google Colaboratory で試してももらえば分かりますが、望みの挙動にはなりません。
mkgrei

2018/03/28 00:20

期待される挙動は10の位で出力されることですか? それとも、解析解(手計算)と同じ答えを得ることですか?
yaju

2018/03/28 00:30

目的は解析解(手計算)と同じ答えを得ることになります。
mkgrei

2018/03/28 06:20

そうすると整数問題になるので勾配が計算できなくなります。 整数問題は勾配法ではなくシンプレクス法で解くのが一般的ではないでしょうか?
yaju

2018/03/28 08:44

mkgreiさん、いろいろコメントありがとうございます。 勾配では計算ができないという結論であればそれでいいです。 勾配では計算は無理かどうかの判断すら自分には分からなかったのですから。 もともと素朴な疑問で10円単位でも予測値が分かればいいなーと思ってたのです。 出来るならそのやり方を知りたかったのです。
mkgrei

2018/03/28 08:58

10円単位でやるためには、金額に係る数をすべて10で割ってから、変数をすべて整数にすることで実現できます。 問題はその後で、整数型だと勾配計算のところでエラーが出てしまいます。 微小な量なので、妥当なふるまいであると考えます。 すべてを実数型にして、一部整数値へのキャストなども考えましたが、やはり勾配が消失してしまうようで、更新することができません。 後は、整数でもうまく更新量を計算するアルゴリズムを独自で実装することになるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問