#### 实验题目:使用梯度下降法训练线性回归模型
#### 实验目的:掌握线性回归的基本原理,以及梯度下降法和最小二乘法;
#### 实验环境(硬件和软件)Anaconda/Jupyternotebook/Pycharm
#### 实验内容:
(1)编码实现基于梯度下降的单变量线性回归算法,包括梯度的计算与验证;
(2)画数据散点图,以及得到的直线;
(3)画梯度下降过程中损失的变量图;
(4)基于训练得到的参数,输入新的样本数据,输出预测值;
1.导入工具
import numpy as np##导入包
import matplotlib.pyplot as plt##画图用
plt.rcParams['font.sans-serif']=['SimHei']##中文标题
plt.rcParams['axes.unicode_minus'] = False
2.步骤,求损失变化量
w=0
b=0
data=np.loadtxt('data1.txt',delimiter=',')
x=data[:,0]
y=data[:,1]
times=1000##次数
a=0.0001227##学习率,最后调试了一下参数,发现这个大小比较好
m=len(x)
E=np.zeros([1000,1])##画图用
#e=0
for j in range(times):
e=0
pe_w=0#损失函数对w求骗到
pe_b=0#对b
sumx2=0#x平方和
sumy_b=0
sumy_wx=0
for i in range(m):##这次迭代求偏导公式中要用到的连家和
e+=(y[i]-w*x[i]-b)**2##均方误差
sumx2+=x[i]**2
sumy_b+=(y[i]-b)*x[i]
sumy_wx+=y[i]-w*x[i]
pe_w=2*(w*sumx2-sumy_b)
pe_b=2*(m*b-sumy_wx)
#print(sumy_b)
E[j,0]=int(e)##e放均方误差矩阵里
w=w-a*pe_w#梯度下降法,每次降学习率*当前偏导这么多,
#偏导大就降得多,降到最后步子会越来越细。用减法,无论偏导正负都是朝最中心的方向
b=b-a*pe_b
#print(w)
#print(e)
#print(type(e))
#earray=E[:,0]
plt.plot(E,"ro-",ms=3)
plt.title("损失的变化图")
3.做出拟合直线图
plt.scatter(x,y,c='b',s=5)
plt.plot(x,x*w+b,"r-")
plt.title("拟合直线图")
plt.show()
4.基于训练得到的参数,输入新的样本数据,输出预测值;
x1=np.array([3.12121,4.34343,5.34344])
#输入新样本
y1=w*x1+b
print(y1)#输出预测值
[-0.13504791 1.31647902 2.50410601]