1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 利用梯度下降法求解一元线性回归和多元线性回归

利用梯度下降法求解一元线性回归和多元线性回归

时间:2018-11-16 23:53:57

相关推荐

利用梯度下降法求解一元线性回归和多元线性回归

文章目录

原理以及公式【1】一元线性回归问题【2】多元线性回归问题【3】学习率【4】流程分析(一元线性回归)【5】流程分析(多元线性回归)归一化原理以及每种归一化适用的场合一元线性回归代码以及可视化结果多元线性回归代码以及可视化结果总结

原理以及公式

【1】一元线性回归问题

原函数是一元函数(关于x),它的损失函数是二元函数(关于w和b)

这里介绍两种损失函数:平方损失函数和均方差损失函数

【2】多元线性回归问题

X和W都是m+1维的向量,损失函数是高维空间中的凸函数

【3】学习率

学习率属于超参数(超参数:在开始学习之前设置,不是通过训练得到的)

可以选择在迭代次数增加时减少学习率大小.

下图是学习率正常或较小、稍大、过大的迭代图。

【4】流程分析(一元线性回归)

过程分析:

1、加载样本数据x,y

2、设置超参数学习率,迭代次数

3、设置模型参数初值w0, b0

4、训练模型w, b

5、结果可视化

流程图:

【5】流程分析(多元线性回归)

归一化原理以及每种归一化适用的场合

线性归一化:适用于样本分布均匀且集中的情况,如果最大值(或者最小值)不稳定,和绝大数样本数据相差较大,使用这种方法得到的结果也不稳定.为了抑制这个问题,在实际问题中可以用经验值来代替最大值和最小值

标准差归一化适用于样本近似正态分布,或者最大最小值未知的情况,有时当最大最小值处于孤立点时也可以使用标准差归一化

非线性映射归一化,通常用于数据分化较大的情况(有的很大有的很小)

总结:样本属性归一化需要根据属性样本分布规律定制

过程分析:

加载样本数据area,room,price

数据处理归一化,X,Y

设置超参数学习率,迭代次数

设置模型参数初值W0(w0,w1,w2)

训练模型W

结果可视化

一元线性回归代码以及可视化结果

#解析法实现一元线性回归 # #Realization of one variable linear regression by analytic method#导入库import numpy as npimport matplotlib.pyplot as plt #设置字体plt.rcParams['font.sans-serif'] =['SimHei']#加载样本数据x=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])y=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])#设置超参数,学习率learn_rate=0.00001#迭代次数iter=100#每10次迭代显示一下效果display_step=10#设置模型参数初值np.random.seed(612)w=np.random.randn()b=np.random.randn()#训练模型#存放每次迭代的损失值mse=[]for i in range(0,iter+1):#求偏导dL_dw=np.mean(x*(w*x+b-y))dL_db=np.mean(w*x+b-y)#更新模型参数w=w-learn_rate*dL_dwb=b-learn_rate*dL_db#得到估计值pred=w*x+b#计算损失(均方误差)Loss=np.mean(np.square(y-pred))/2mse.append(Loss)#显示模型#plt.plot(x,pred)if i%display_step==0:print("i:%i,Loss:%f,w:%f,b:%f"%(i,mse[i],w,b))#模型和数据可视化plt.figure(figsize=(20,4))plt.subplot(1,3,1)#绘制散点图#张量和数组都可以作为散点函数的输入提供点坐标plt.scatter(x,y,color="red",label="销售记录")plt.scatter(x,pred,color="blue",label="梯度下降法")plt.plot(x,pred,color="blue")#设置坐标轴的标签文字和字号plt.xlabel("面积(平方米)",fontsize=14)plt.xlabel("价格(万元)",fontsize=14)#在左上方显示图例plt.legend(loc="upper left")#损失变化可视化plt.subplot(1,3,2)plt.plot(mse)plt.xlabel("迭代次数",fontsize=14)plt.ylabel("损失值",fontsize=14)#估计值与标签值比较可视化plt.subplot(1,3,3)plt.plot(y,color="red",marker="o",label="销售记录")plt.plot(pred,color="blue",marker="o",label="梯度下降法")plt.legend()plt.xlabel("sample",fontsize=14)plt.ylabel("price",fontsize=14)#显示整个绘图plt.show()

多元线性回归代码以及可视化结果

#解析法实现多元线性回归#Realization of multiple linear regression by analytic method#导入库与模块import numpy as npimport matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D#=======================【1】加载样本数据===============================================area=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])room=np.array([3,2,2,3,1,2,3,2,2,3,1,1,1,1,2,2])price=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])num=len(area) #样本数量#=======================【2】数据处理===============================================x0=np.ones(num)#归一化处理,这里使用线性归一化x1=(area-area.min())/(area.max()-area.min())x2=(room-room.min())/(room.max()-room.min())#堆叠属性数组,构造属性矩阵#从(16,)到(16,3),因为新出现的轴是第二个轴所以axis为1X=np.stack((x0,x1,x2),axis=1)print(X)#得到形状为一列的数组Y=price.reshape(-1,1)print(Y)#=======================【3】设置超参数===============================================learn_rate=0.001#迭代次数iter=500#每10次迭代显示一下效果display_step=50#=======================【4】设置模型参数初始值===============================================np.random.seed(612)W=np.random.randn(3,1)#=======================【4】训练模型=============================================mse=[]for i in range(0,iter+1):#求偏导dL_dW=np.matmul(np.transpose(X),np.matmul(X,W)-Y) #XT(XW-Y)#更新模型参数W=W-learn_rate*dL_dW#得到估计值PRED=np.matmul(X,W)#计算损失(均方误差)Loss=np.mean(np.square(Y-PRED))/2mse.append(Loss)#显示模型#plt.plot(x,pred)if i % display_step==0:print("i:%i,Loss:%f"%(i,mse[i]))#=======================【5】结果可视化============================================plt.rcParams['font.sans-serif'] =['SimHei']plt.figure(figsize=(12,4))#损失变化可视化plt.subplot(1,2,1)plt.plot(mse)plt.xlabel("迭代次数",fontsize=14)plt.ylabel("损失值",fontsize=14)#估计值与标签值比较可视化plt.subplot(1,2,2)PRED=PRED.reshape(-1)plt.plot(price,color="red",marker="o",label="销售记录")plt.plot(PRED,color="blue",marker="o",label="预测房价")plt.xlabel("sample",fontsize=14)plt.ylabel("price",fontsize=14)plt.legend()plt.show()

总结

注意点:选择归一化方式


喜欢的话点个赞和关注呗!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。