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

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

它适用于这样的数据

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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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