张量流线性回归不收敛到修正的cos

2024-04-29 11:00:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在tensorflow中实现多元线性回归(使用波士顿住房数据集),但似乎我的成本函数正在收敛,并且值错误(在我的例子中是24000)。我试着缩放功能,但还是没用。你知道我做错了什么吗?代码如下:

from sklearn.datasets import load_boston
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.cross_validation import train_test_split
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

rate = 0.000000011
epochs = 100
errors = []

def load_data():
    boston = load_boston()

    bos = pd.DataFrame(boston.data)

    output = pd.DataFrame(boston.target)

    return [bos, output]

xS, yS = load_data()

m = len(yS)

x_train, x_test, y_train, y_test = train_test_split(xS, yS, test_size=0.2)

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)

theta = tf.Variable(tf.zeros([len(xS.columns), 1]))
X = tf.placeholder(tf.float32, shape=[m, len(xS.columns)])
y = tf.placeholder(tf.float32, shape=[m, 1])
b = tf.Variable(tf.zeros([m, 1]))

model = tf.matmul(tf.transpose(theta), tf.transpose(X)) + b

cost = tf.reduce_sum(tf.square(y-model))/(2*m)

optimizer = tf.train.GradientDescentOptimizer(rate).minimize(cost)

init = [tf.global_variables_initializer(), tf.local_variables_initializer()]

with tf.Session() as sess:
    sess.run(init)
    for e in range(epochs):
        sess.run(optimizer, feed_dict={X:xS, y:yS})
        loss = sess.run(cost, feed_dict={X:xS, y:yS})
        print("cost at step", e, loss)
        errors.append(loss)
        if errors[len(errors)-1] > errors[len(errors)-2]:
            break

    theta_temp = np.array(sess.run(theta))
    b_temp = np.array(sess.run(b))

plt.plot(list(range(len(errors))), errors)
plt.show()
h = np.transpose(np.add(np.matmul(np.transpose(theta_temp), np.transpose(xS)), np.transpose(b_temp)))
print(r2_score(h, yS))

Tags: runtestimportlentfasnptrain
1条回答
网友
1楼 · 发布于 2024-04-29 11:00:14

大部分事情你都做对了。我将建议您对代码进行以下更改。在

model = tf.matmul(X, theta) + b

在学习率为0.001和epoch 1000的情况下尝试此操作,并请报告结果。在

在你的情况下你在做什么

model = tf.matmul(tf.transpose(theta), tf.transpose(X)) + b

你在犯错误。右侧的第一部分大小为(1,m),第二部分的大小为(m,1)。然后你得到了一些结果,因为广播,你并不期待。这就是为什么当学习率为0.01或0.1时,你会看到非常糟糕的结果。在

我的第二个建议是取消中断标准。在

if errors[len(errors)-1] > errors[len(errors)-2]: break

随机梯度是有噪声的。没有证据表明,如果你在梯度较小的方向上,你总是能降低成本(也许这对这个凸问题是真的,但我必须思考)。在

^{pr2}$

enter image description here

相关问题 更多 >