python机器学习一元和二元多项式回归梯度下降算法(代码片段)

哈伦裤DOCTOR 哈伦裤DOCTOR     2023-01-28     609

关键词:

python 机器学习 一元和二元多项式回归

一元多项式

一元多项式表达式为:
Y = W T X = [ w 0 + w 1 + ⋯ + w n ] ⋅ [ 1 + x + ⋯ + x n − 1 ] T Y=W^TX=\\left[ w_0+w_1+\\cdots +w_n \\right] \\cdot \\left[ 1+x+\\cdots +x^n-1 \\right] ^T Y=WTX=[w0+w1++wn][1+x++xn1]T

其中高次项为一次项的高次幂,将该式写为多元表达式:
Y = W T X = [ w 0 + w 1 + ⋯ + w n ] ⋅ [ x 1 + x 2 + ⋯ + x n ] T Y=W^TX=\\left[ w_0+w_1+\\cdots +w_n \\right] \\cdot \\left[ x_1+x_2+\\cdots +x_n \\right] ^T Y=WTX=[w0+w1++wn][x1+x2++xn]T
其中,xn=x^(n+1),n=0,1,2…,n-1
这里使用梯度下降算法拟合一元二次多项式方程:
假设其函数(X,Y)的函数映射关系为: h θ ( x ) = θ 0 + θ 0 × x + θ 0 × x 2 h_\\theta\\left( x \\right) =\\theta _0+\\theta _0\\times x+\\theta _0\\times x^2 hθ(x)=θ0+θ0×x+θ0×x2

损失函数选择均平方误差MSE:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J\\left( \\theta \\right) =\\frac12m\\sum_i=1^m\\left( h_\\theta\\left( x^\\left( i \\right) \\right) -y^\\left( i \\right) \\right)^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2
参数θ关于J(θ)的梯度为:
∂ J ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \\frac\\partial J\\partial \\theta _j=\\frac1m\\sum_i=1^m\\left( h_\\theta\\left( x^\\left( i \\right) \\right) -y^\\left( i \\right) \\right)x_j^\\left( i \\right) θjJ=m1i=1m(hθ(x(i))y(i))xj(i)
所以其参数更新公式为:
θ j = θ j − α ∂ J ∂ θ j = θ j − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \\theta _j=\\theta _j-\\alpha \\frac\\partial J\\partial \\theta _j=\\theta _j-\\frac\\alpham\\sum_i=1^m\\left( h_\\theta\\left( x^\\left( i \\right) \\right) -y^\\left( i \\right) \\right)x_j^\\left( i \\right) θj=θjαθjJ=θjmαi=1m(hθ(x(i))y(i))xj(i)
α为学习率

生成数据

待拟合函数为: y = 2 + 3 × x + 2 × x 2 y=2+3\\times x+2\\times x^2 y=2+3×x+2×x2
使用numpy.random.normal()函数为数据添加噪声,(高斯噪音):

y_noise=np.random.normal(loc=0,scale=1,size=len(x))

下图为生成数据散点图:

具体代码为:

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-2,2,0.2)
def Y():
    return 2+3*x+2*x**2 #待拟合函数
y=Y()
##噪音
# x_noise=np.random.normal(loc=0,scale=0,size=len(x)) #可为x添加随机扰动
y_noise=np.random.normal(loc=0,scale=1,size=len(x))

#x=x+x_noise
y=y+y_noise
x_train=np.stack((np.linspace(1,1,len(x)),x,x**2),axis=1) #使用np.stack(将X0,X1,X2)合成待训练数据
y_train=y
plt.scatter(x,y_train)
plt.show()

x_train的生成原理:
x _ t r a i n = [ x 0   x 1   x 2 ] = [ 1   x   x 2 ] x\\_train=[x_0\\ x_1\\ x_2]=[1\\ x\\ x^2] x_train=[x0 x1 x2]=[1 x x2]

最后使用梯度下降方式实现PYTHON参数更新代码为:

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-2,2,0.2)
def Y():
    return 2+3*x+2*x**2
y=Y()
x_noise=np.random.normal(loc=0,scale=0,size=len(x))
y_noise=np.random.normal(loc=0,scale=1,size=len(x))

x=x+x_noise
y=y+y_noise
x_train=np.stack((np.linspace(1,1,len(x)),x,x**2),axis=1)
y_train=y
plt.scatter(x,y_train)
m=len(x_train)
theat=np.array([0,0,0])
lr=0.009
def Y_pred(x,a):
    return a[0]*x[0]+a[1]*x[1]+a[2]*x[2]
def partial_theat(x,y,a):
    cost_all=np.array([0,0,0])
    for i in range(m):
        cost_all=cost_all+(Y_pred(x[i],a)-y[i])*x[i]

    return 1.0/m*cost_all
def J(x,y,a):
    cost=0
    for i in range(m):
        cost=cost+(Y_pred(x[i],a)-y[i])**2
    return (1/2*m)*cost
iterations=0
theat_list=np.array([0,0,0])
while(True):     
   # plt.scatter(x_train,y_train)
   # plt.plot(np.arange(-3,3,0.1),theat[0]*np.arange(-3,3,0.1)+theat[1])
    
    theat=theat-lr*partial_theat(x_train,y_train,theat)
    theat_list=np.vstack((theat_list,theat))
    iterations=iterations+1
    if(np.abs(J(x_train,y_train,theat_list[-1])-J(x_train,y_train,theat_list[-2]))<0.001): 
        break
print(theat_list[-1],theat_list.shape)
x_t=np.linspace(-2,2,20)
x_test=np.stack((np.linspace(1,1,20),x_t,x_t**2),axis=1)
##plt.plot(x,theat[0]+x_t*theat[1]+x_t**2*theat[2])

from matplotlib.animation import FuncAnimation
fig,ax=plt.subplots()

atext_anti=plt.text(0.2,2,'',fontsize=15)
btext_anti=plt.text(1.5,2,'',fontsize=15)
ctext_anti=plt.text(3,2,'',fontsize=15)
ln,=plt.plot([],[],'red')
def init():
    ax.set_xlim(np.min(x_train),np.max(x_train))
    ax.set_ylim(np.min(y_train),np.max(y_train))
    return ln,
def upgrad(frame):
    x=x_t
    y=frame[0]+frame[1]*x+frame[2]*x**2
    ln.set_data(x,y)
    atext_anti.set_text('a=%.3f'%frame[0])
    btext_anti.set_text('b=%.3f'%frame[1])
    ctext_anti.set_text('c=%.3f'%frame[2])
    return ln,
ax.scatter(x,y_train)
ani=FuncAnimation(fig,upgrad,frames=theat_list,init_func=init)
plt.show()

梯度下降算法拟合过程动图如下:

最后拟合结果为: y = 1.86 + 3.07 × x + 1.92 × x 2 y=1.86+3.07\\times x+1.92\\times x^2 y=1.86查看详情

sklearn实现一元线性回归python机器学习系列(代码片段)

sklearn实现一元线性回归【Python机器学习系列(五)】文章目录1.获取数据2.线性回归模型大家好,我是侯小啾! 本期blog分享的内容是通过sklearn库实现一元线性回归。相比上篇blog中介绍的梯度下降法中较为复杂... 查看详情

机器学习100天(十七):017逻辑回归梯度下降

机器学习100天,今天讲的是:逻辑回归-梯度下降!在讲解了逻辑回归的基本原理和损失函数之后,我们来推导逻辑回归模型中参数w和b的梯度表达式。我们之前介绍过,计算逻辑回归的代价函数实际上包含了下面三个过程:Z=WTX+... 查看详情

机器学习100天(十七):017逻辑回归梯度下降

机器学习100天,今天讲的是:逻辑回归-梯度下降!在讲解了逻辑回归的基本原理和损失函数之后,我们来推导逻辑回归模型中参数w和b的梯度表达式。我们之前介绍过,计算逻辑回归的代价函数实际上包含了下面三个过程:Z=WTX+... 查看详情

机器学习实战之logistic回归

...1.1导入数据集    1.2定义辅助函数    1.3BGD算法python实现    1.4准确率计算函数  2.使用SGD求解逻辑回归    2.1SGD算法python实现四、从疝气病症预测病马的死亡率  1.准备数据  2.logistic回归分类函数 &... 查看详情

机器学习_logistic回归和梯度下降

 原文:http://blog.csdn.net/dongtingzhizi/article/details/15962797  Logistic回归总结 PDF下载地址:http://download.csdn.net/detail/lewsn2008/65474631.引言   看了Stanford的AndrewNg老师的机 查看详情

机器学习算法(优化)之一:梯度下降算法随机梯度下降(应用于线性回归logistic回归等等)

本文介绍了机器学习中基本的优化算法—梯度下降算法和随机梯度下降算法,以及实际应用到线性回归、Logistic回归、矩阵分解推荐算法等ML中。梯度下降算法基本公式常见的符号说明和损失函数X :所有样本的特征向量组成的... 查看详情

正规方程,梯度下降,岭回归——机器学习(代码片段)

线性回归一.介绍1.1线性回归API介绍——LinearRegression二.线性回归的损失和优化2.1全梯度下降算法(FG)2.2随机梯度下降算法(SG)2.3小批量梯度下降算法(mini-batch)2.4随机平均梯度下降算法(SAG)三... 查看详情

吴恩达-coursera-机器学习-week2

...降法实践1-特征缩放4.4梯度下降法实践2-学习率4.5特征和多项式回归4.6正规方程4.7正规方程及不可逆性(可选)五、Octave教程(OctaveTutorial)5.1基本操作5.2移动数据5.3计算数据5.4绘图数据5.5控制语句:for,whil 查看详情

机器学习梯度下降法(超详解)

...比较和进一步优化5.1算法比较5.2梯度下降优化算法前言在机器学习】线性回归的损失和优化中介绍了最基本的梯度下降 查看详情

机器学习线性回归的损失和优化(代码片段)

线性回归的损失和优化线性回归的损失和优化1.损失函数2.优化算法2.1正规方程2.1.1什么是正规方程2.1.2正规方程求解举例2.1.3正规方程的推导推导方式一推导方式二2.2梯度下降(GradientDescent)2.2.1什么是梯度下降2.2.2梯度的概念2.2.3梯... 查看详情

机器学习入门:线性回归及梯度下降

机器学习入门:线性回归及梯度下降  本文会讲到:   (1)线性回归的定义 (2)单变量线性回归 (3)costfunction:评价线性回归是否拟合训练集的方法 (4)梯度下降:解决线性回归的方法之一 (5)featurescali... 查看详情

机器学习100天(十四):014梯度下降算法求解线性回归

机器学习100天,今天讲的是:使用梯度下降算法求解线性回归问题。一、梯度下降更新公式之前我们介绍了正规方程法直接求解线性回归问题,但是梯度下降算法在机器学习中更为常用,因为面对复杂问题时,梯度下降算法能够... 查看详情

机器学习100天(十四):014梯度下降算法求解线性回归

机器学习100天,今天讲的是:使用梯度下降算法求解线性回归问题。一、梯度下降更新公式之前我们介绍了正规方程法直接求解线性回归问题,但是梯度下降算法在机器学习中更为常用,因为面对复杂问题时,梯度下降算法能够... 查看详情

机器学习入门:线性回归及梯度下降

http://blog.csdn.net/xiazdong/article/details/7950084本文会讲到: (1)线性回归的定义(2)单变量线性回归(3)costfunction:评价线性回归是否拟合训练集的方法(4)梯度下降:解决线性回归的方法之一(5)featurescaling:加快梯度下降执行速度的方... 查看详情

线性回归scikit-learnlinearregression最小二乘法梯度下降sdg多项式回归学习曲线岭回归lasso回归(代码片段)

github:https://github.com/gaowanlu/MachineLearning-DeepLearning线性回归scikit-learn关键词:LinearRegression、最小二乘法、梯度下降、SDG、多项式回归、学习曲线、岭回归、Lasso回归LinearRegression#使用scikit-learn中的线性回归模型fromoperatorimpor 查看详情

多元线性回归_梯度下降法实现python机器学习系列(代码片段)

多元线性回归_梯度下降法实现【Python机器学习系列(六)】文章目录1.读取数据2.定义代价函数3.梯度下降4.可视化展示      ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•... 查看详情

《机器学习》第一周一元回归法|模型和代价函数,梯度下降

课程地址:https://www.coursera.org/learn/machine-learning/lecture/8SpIM/gradient-descent 一ModelandCostFunction模型及代价函数1ModelRepresentation模型表示  首先,教授介绍了一下课程中将会用到的符号和意义:     &nb 查看详情