当前位置: 首页 > 后端技术 > Python

Python实现线性回归的简单回归

时间:2023-03-25 23:01:49 Python

首先定义一个基本回归类作为各种回归方法的基类:;"copycode")classRegression(object):"""基本回归模型。模拟标量因变量y和自变量X之间的关系。参数:------------n\_iterations:float算法将调整权重的训练迭代次数。learning\_rate:float更新权重时将使用的步长。"""def\_\_init\_\_(self,n\_iterations,learning\_rate):self.n\_iterations\=n\_iterationsself.learning\_rate\=learning\_ratedefinitialize\_weights(self,n\_features):"""随机初始化权重\[-1/N,1/N\]"""极限\=1/math.sqrt(n\_features)自我。w\=np.random.uniform(-limit,limit,(n\_features,))deffit(self,X,y):#为偏置权重插入常数X=np.insert(X,0,1,axis=1)self.training\_errors\=\[\]self.initialize\_weights(n\_features\=X.shape\[1\])#对n\_iterations进行梯度下降foriinrange(self.n\_iterations):y\_pred\=X.dot(self.w)#计算l2损失mse=np.mean(0.5\*(y-y\_pred)\*\*2+self.regularization(self.w))self.training\_errors.append(mse)#l2损失的梯度w.r.twgrad\_w=-(y-y\_pred).dot(X)+self.regularization.grad(self.w)#更新权重self.w-=self.learning\_rate\*grad\_wdefpredict(self,X):#为偏置权重插入常数X=np.insert(X,0,1,axis=1)y\_pred\=X.dot(self.w)returny\_pred;《复制代码》)说明:初始化时传入两个参数,一个是迭代次数,一个是学习率initialize_weights()用于初始化权重。fit()用于训练。需要注意的是,对于原始输入X,需要在前面添加一个item作为偏置项。predict()用于输出预测值。接下来是简单的单线回归,继续上面的基础:;"复制代码")classLinearRegression(Regression):"""线性模型.Parameters:----------n\_iterations:float算法调整权重的训练迭代次数。learning\_rate:float更新权重时将使用的步长。gradient\_descent:booleanTrue或false取决于训练时是否应使用梯度下降。如果为false,则我们使用最小二乘法进行批量优化。"""def\_\_init\_\_(self,n\_iterations=100,learning\_rate=0.001,gradient\_descent=True):self.gradient\_descent\=gradient\_descent#没有正则化self.regularization=lambdax:0self.regularization.grad\=lambdax:0super(LinearRegression,self).\_\_init\_\_(n\_iterations=n\_iterations,learning\_rate\=learning\_rate)deffit(self,X,y):#如果不是梯度下降=>w的最小二乘近似ifnotself.gradient\_descent:#In为偏置权重插入常量X=np.insert(X,0,1,axis=1)#通过最小二乘法计算权重(使用Moore-Penrose伪逆)U,S,V=np.linalg.svd(X.T.dot(X))S\=np.diag(S)X\_sq\_reg\_inv\=V.dot(np.linalg.pinv(S)).dot(U.T)self.w\=X\_sq\_reg\_inv.dot(X.T).dot(y)else:super(LinearRegression,self).fit(X,y);“复制代码”)这里,使用了两种方法进行计算。如果指定gradient_descent=True,则使用随机梯度下降算法进行训练,否则使用标准方程法进行训练。最后是使用:;"复制代码")importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.datasetsimportmake_regressionimportsyssys.path.append("/content/drive/MyDrive/learn/ML-From-Scratch/")frommlfromscratch.utilsimporttrain_test_split,polynomial_featuresfrommlfromscratch.utilsimportmean_squared_error,Plotfrommlfromscratch.supervised_learningimportLinearRegressiondefmain():X,y\=make\_regression(n\_samples=100,n\_features=1,噪音=20)X\_train,X\_test,y\_train,y\_test\=train\_test\_split(X,y,test\_size=0.4)n\_samples,n\_features\=np.shape(X)model\=LinearRegression(n\_iterations=100)model.fit(X\_train,y\_train)#训练误差plotn=len(model.training\_errors)training,\=plt.plot(range(n),model.training\_errors,label="TrainingError")plt.legend(handles\=\[training\])plt.title("ErrorPlot")plt.ylabel('均方误差')plt.xlabel('迭代')plt.savefig("test1.png")plt.show()y\_pred\=model.predict(X\_test)mse\=mean\_squared\_error(y\_test,y\_pred)print("均方误差:%s"%(mse))y\_pred\_line\=model.predict(X)#Colormapcmap=plt.get\_cmap('viridis')#绘制结果sm1=plt.scatter(366\*X\_train,y\_train,color=cmap(0.9),s=10)m2\=plt.scatter(366\*X\_test,y\_test,color=cmap(0.5),s=10)plt.plot(366\*X,y\_pred\_line,color='black',linewidth=2,label="Prediction")plt.suptitle("LinearRegression")plt.title("MSE:%.2f"%mse,fontsize=10)plt.xlabel('Day')plt.ylabel('TemperatureinCelcius')plt.legend((m1,m2),("训练数据","测试数据"),loc='右下角')plt.savefig("test2.png")plt.show()if\_\_name\_\_=="\_\_main\_\_":main();"复制代码")使用sklearn库生成线性回归数据,然后拆分成训练集和测试集mean_squared_error():defmean_squared_error(y_true,y_pred):"""返回y_true和y_pred之间的均方误差"""mse=np.mean(np.power(y_true-y_pred,2))返回mse结果:均方误差:532.3321383700828