文章目录
前言
本文使用随机梯度下降,进行多项式回归参数估计,线性回归请参考
线性回归——梯度下降
一、随机梯度下降是什么?
梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。
二、代码实现
1.引入库
代码如下(示例):
import numpy as np
import matplotlib.pyplot as plt
2.建立训练集和测试集
代码如下(示例):
建立训练集和测试集
data = [5.1, 8.2, 11.5, 13.9, 15.1, 16.2]
target = [2.14, 4.62, 8.24, 11.24, 13.99, 16.33]
test = [19.6, 23.3]
test_target = [19.23, 28.74]
该处使用的自定义数据集。
3.多项式回归实现
3.1初始参数
代码如下(示例):
使用曲线u = w1*x²+w2*x +b 拟合
w1 = 1 # 权重1设置为0
w2 = 0 # 权重2设置为0
b1 = 0 # 截距设置为0
esum = 100
n = 1
使用曲线y = wx +b 拟合
w = 0 # 权重设置为0
b = 0 # 截距设置为0
esum = 100 # 训练集样本误差之和,初始值100
n = 1 # 训练次数
3.2计算最优参数
代码如下(示例):
计算最优权重
while(abs(esum)>0.0000001): # 当训练集误差之和的绝对值小于0.0000001时跳出循环
i = np.random.randint(0,5)
e = (data[i]*data[i]*w1 + data[i]*w2 +b1)-target[i] # 计算误差
w1= w1 - e*data[i]*w1*0.0001 # 随机下降梯度步长设置为0.0001,这里的权重变化与线性回归不同
w2 = w2 - e*data[i]*0.0001
b1 = b1-e*0.02
for i in range(len(data)): # 计算样本误差之和
esum = (data[i]*data[i]*w1 + data[i]*w2 +b1)-target[i]
# if n%100000 == 0: # 结果呈现
# print("第{:}次".format(n))
# print("此时训练集误差之和为:%.2f"%esum)
n+=1
3.3计算训练集和测试集误差
代码如下(示例):
err = []
scount = []
err_train = []
scount_train=[]
计算训练样本误差
for i in range(len(data)):
e = (data[i]*data[i]*w1 + data[i]*w2 +b1)-target[i]
p = e/target[i]
err_train.append(e)
scount_train.append(p)
计算测试样本误差
for i in range(len(test)):
e = (test[i]*test[i]*w1 + test[i]*w2 +b1)-test_target[i]
p = e/test_target[i]
err.append(e)
scount.append(p)
3.4评价模型
代码如下(示例):
sst = 0
sse = 0
sum =0
求target平均值
for i in range(len(test_target)):
sum += test_target[i]
avg = sum/len(test_target)
评价模型
for i in range(len(test_target)):
sst += (test_target[i] - avg)**2
sse += ((test[i]*test[i]*w1 + test[i]*w2 +b1)-test_target[i])**2
3.4输出结果并显示图像
代码如下(示例):
结果输出
print("随机梯度下降:线性回归")
print("测试集评价模型{}".format(1-sse/sst))
print('训练结束,共运行{}次,最后一次训练集总误差{}'.format(n, esum))
print(w1, w2 , b1) # 输出参数
print('训练集样本误差和误差百分比:', end='')
print( err_train, scount_train)
print('测试集样本误差和误差百分比:', end='')
print( err, scount)
图像显示
x = data + test
x = np.reshape(x, newshape=(len(x), 1))
y = target + test_target
y = np.reshape(y, newshape=(len(y), 1))
plt.scatter(x, y)
plt.plot(x, x*x*w1 + x*w2 +b1)
plt.show()
三、实验过程
第一次实验
训练样本总误差设置为1时:
运行实现
结果分析:
此时各参数为w1 = 0.1236386691, w2 = -1.3383115579, b = 6.0582175292526905。发现对于训练集的误差总和可以达到1,但是测试集的误差平均在44%,
; 第二次实验
2、当把训练集总误差设置为0.0000001时
运行实现
结果分析:发现对于训练集的误差总和可以达到0.0000000744,但是测试集的误差平均在28%,,发现曲线只是更加拟合训练集,并没有对测试集有影响。由于数据集数量过少,导致结果并不精准。
总结
虽然在设置更小的总误差情况下,测试集误差出现下降趋势,但测试集误差仍然太大。所以,该曲线存在过拟合现象。
解决办法:1、使用更加简单的曲线。2、忽略某些点,但由于训练集过少,所以只能降维,即回到了第一个线性回归方法。
Original: https://blog.csdn.net/m0_47970623/article/details/124531020
Author: 不会就用洛必达
Title: 多项式回归——梯度下降
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/629937/
转载文章受原作者版权保护。转载请注明原作者出处!