线性回归,梯度下降在某些值上不起作用

我已经实现了带有梯度下降的线性回归,但在需要得到递减函数或常数函数时它不起作用。

它适用于这样的数据

x_train = np.array([30,60,70,100])y_train= np.array([60,120,145,195])

在这里我需要得到递增的函数,像这里的f(x_train) ≈ 2*x_train=y_train,或者适用于这样的数据

x_train = np.array([30,60,70,100])y_train= np.array([30,60,70,100])

这里是f(x_train)=x_train=y_train,但它不适用于这样的数据

x_train = np.array([50,100,150,200])y_train= np.array([150,100,50,0])

递减函数f(x_train)=200-x_train=y_train 或常数函数f(x_train)=100=y_train

x_train = np.array([50,100,150,200])y_train= np.array([100,100,100,100])

import numpy as npimport matplotlib.pyplot as plt#doesnt work#x_train = np.array([50,100,150,200])#y_train= np.array([150,100,50,0])#workx_train = np.array([30,60,70,100])y_train= np.array([60,120,145,195])def model(x,w,b):    return x*w+b;def cost(y,y_hat):    return np.sum((y-y_hat)**2)learning_rate=0.000001def trainning_round(x_train,y_train,w,b,learning_rate):    y_hat=model(x_train,w,b)    print(cost(y_train,y_hat))    w_gradient=-2*x_train.dot(y_train-y_hat)    b_gradient=-2*np.sum(y_train-y_hat)    w-=learning_rate*w_gradient    b-=learning_rate*b_gradient    return w,bnum_epoch=200def train(X,Y):    w=0    b=0    #for plt    ar = np.arange(0, 200, 0.5)    def f(t):        return t*w+b    for i in range(num_epoch):            w,b=trainning_round(X,Y,w,b,learning_rate)            plt.plot(ar,f(ar))            plt.axis([0, 200, 0, 200])    plt.plot(X, Y, 'ro')train(x_train,y_train)plt.show()

我尝试了一些其他算法,但它们不起作用。提前感谢


回答:

我修改了一些部分。决定合适的学习率和迭代次数非常重要。这有些困难。所以我们使用像tensorflow这样的框架。

import numpy as npimport matplotlib.pyplot as plt#doesnt workx_train = np.array([50,100,150,200])y_train= np.array([150,100,50,0])#work# x_train = np.array([30,60,70,100])# y_train= np.array([60,120,145,195])def model(x,w,b):    return x*w+b;def cost(y,y_hat):    return np.sum((y-y_hat)**2)/y.sizelearning_rate=0.0001def trainning_round(x_train,y_train,w,b,learning_rate):    y_hat=model(x_train,w,b)    j = cost(y_train,y_hat)    # w_gradient=-2*x_train.dot(y_train-y_hat)    # b_gradient=-2*np.sum(y_train-y_hat)    w_gradient=x_train.dot(y_hat-y_train) / y_train.size    b_gradient=np.sum(y_hat-y_train) / y_train.size    print(w_gradient, b_gradient)    w=w-learning_rate*w_gradient    b=b-learning_rate*b_gradient    print(j, w,b)    return w,bnum_epoch=200000def train(X,Y):    w=2.1    b=1.5    #for plt    ar = np.arange(0, 200, 0.5)    for i in range(num_epoch):        w,b=trainning_round(X,Y,w,b,learning_rate)    plt.plot(ar,model(ar, w, b))    plt.axis([0, 300, 0, 200])    plt.plot(X, Y, 'ro')train(x_train,y_train)plt.show()

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注