梯度下降法来解决线性回归问题的原理(公式)介绍

可以先看前几篇文章,会有不一样的感觉。

 

 

'''
x是样本集
y是特征(标签)也可以理解为函数值
w是线性回归模型的参数,目标矩阵
gradient是梯度计算函数
loss_function是损失函数
上述三者均为矩阵
'''
#计算梯度
import numpy as np
def gradient(x,y,w): #定义梯度函数
 m,n = np.shape(x) #获取x的行、列数分别赋给m,n
 g = np.mat(np.zeros((n,1))) #设置一个n行1列的0值矩阵给变量g
 for i in range(m):
 m_v = y[i,0] - x[i,] * w #一阶梯度中间值的计算
 for j in range(n):
 g[j,] -= m_v * x[i,j] #对每一特征j计算一阶梯度
 return g
#计算损失函数
def loss_function(x,y,w):
 k = y - x*w #利用误差值的平方来作为此次优化问题的损失函数
 return k.T*k/2 #矩阵与自身的逆矩阵相乘
#主函数
times = [30,45,60,75,90,105] #测量时间列表
gravity = [150,141,130,119,108,100]#重力数据列表
x = (np.mat([[1,1,1,1,1,1],times])).T #时间矩阵
y = (np.mat(gravity)).T #重力数据矩阵
w = (np.mat([0.0,0.0])).T #回归模型系数矩阵
print(w)
loop_number = 0
step = 0.000060 #步长
loss_change=0.000001 #迭代精度
loss = loss_function(x,y,w) 
for i in range(200000): #这个迭代次数可以设置大一些
 loop_number = loop_number + 1 #每次迭代循环次数加1
 w = w - step * gradient(x,y,w)#回归系数的梯度下降,这是梯度下降的核心*
 loss_value2 = loss_function(x,y,w)#梯度下降后的新损失值
 print(str(i)+":"+str(w[0])+":"+str(w[1]))
 print(loss_value2)
 if abs(loss - loss_value2) < loss_change:
 break #如果损失值变化很小了那么结束循环即可
 loss = loss_value2 #如果损失值变化还较大,那么就更新损失值并继续
new_time = [120,140,180] #本模型期望预测的时间列表
new_time = (np.mat([[1,1,1],new_time])).T
forecast_gravity = new_time * w
print(forecast_gravity)

 下面再用Matlab来对比拟合直线与原重力数据(标签值y)

x=[30,45,60,75,90,105] 
y=[150,141,130,119,108,100]
plot(x,y,'g')
hold on
y = -0.6835*x+170.7814
plot(x,y,'r')
xlabel('times');
ylabel('gravity');
legend('actual data','fit line')
set(gcf,'Units','centimeters','Position',[20 10 30 15]);%中括号里分别代表成图的位
置和大小
title('Actual data contrast to fit line')
set(gca, 'LineWidth',1.5,'Fontname', 'times new roman','fontsize',22)

       在此处完成了梯度下降法对线性回归问题的解决,前几篇文章还介绍了最小二乘法实现的线性回归问题,与此处的数据是一致的,下面对两种拟合结果做简要对比:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值