多项式回归——梯度下降

文章目录

前言

本文使用随机梯度下降,进行多项式回归参数估计,线性回归请参考
线性回归——梯度下降

一、随机梯度下降是什么?

梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球