我已经实现了带有梯度下降的线性回归,但在需要得到递减函数或常数函数时它不起作用。
它适用于这样的数据
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()