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

一元多项式

一元多项式表达式为:
Y=WTX=[w0+w1+⋯+wn]⋅[1+x+⋯+xn−1]TY=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+⋯+xn−1]T

其中高次项为一次项的高次幂,将该式写为多元表达式:
Y=WTX=[w0+w1+⋯+wn]⋅[x1+x2+⋯+xn]TY=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×x2h_{\theta}\left( x \right) =\theta _0+\theta _0\times x+\theta _0\times x^2 hθ​(x)=θ0​+θ0​×x+θ0​×x2

损失函数选择均平方误差MSE:
J(θ)=12m∑i=1m(hθ(x(i))−y(i))2J\left( \theta \right) =\frac{1}{2m}\sum_{i=1}^m{\left( h_{\theta}\left( x^{\left( i \right)} \right) -y^{\left( i \right)} \right)}^2 J(θ)=2m1​i=1∑m​(hθ​(x(i))−y(i))2
参数θ关于J(θ)的梯度为:
∂J∂θj=1m∑i=1m(hθ(x(i))−y(i))xj(i)\frac{\partial J}{\partial \theta _j}=\frac{1}{m}\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​=m1​i=1∑m​(hθ​(x(i))−y(i))xj​(i)
所以其参数更新公式为:
θj=θj−α∂J∂θj=θj−αm∑i=1m(hθ(x(i))−y(i))xj(i)\theta _j=\theta _j-\alpha \frac{\partial J}{\partial \theta _j}=\theta _j-\frac{\alpha}{m}\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​−α∂θj​∂J​=θj​−mα​i=1∑m​(hθ​(x(i))−y(i))xj​(i)
α为学习率

生成数据

待拟合函数为:y=2+3×x+2×x2y=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_train=[x0x1x2]=[1xx2]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=0for i in range(m):cost=cost+(Y_pred(x[i],a)-y[i])**2return (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+1if(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_ty=frame[0]+frame[1]*x+frame[2]*x**2ln.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×x2y=1.86+3.07\times x+1.92\times x^2 y=1.86+3.07×x+1.92×x2
迭代次数为622次,拟合精度为0.001,拟合效果较好,与原始函数参数产生差距是因为噪声关系。
这里不对代码进行解释,感兴趣的可点击这里,里面有代码的具体解释。

二元多项式

设函数中的二元变量分别为x1和x2,其与y之间的多项式表达式关系为:
y=5−2x1+3x2+3x12−x22+4x1x2−10x13y=5-2x_1+3x_2+3{x_1}^2-{x_2}^2+4x_1x_2-10{x_1}^3 y=5−2x1​+3x2​+3x1​2−x2​2+4x1​x2​−10x1​3
设该二元函数多项式表达式为:
hθ(x)=[θ0⋮θ11]T⋅[x0x1x2x1x2x12x22x1x22x2x12x12x22x13x23]h_{\theta}\left( x \right) =\,\,\left[ \begin{array}{c} \theta _0\\ \vdots\\ \theta _{11}\\ \end{array} \right] ^T\cdot \left[ \begin{array}{c} x_0\,\,x_1\,\,x_2\,\,x_1x_2\,\,{x_1}^2\\ \,\,{x_2}^2\,\,x_1{x_2}^2\,\,x_2{x_1}^2\,\,\\ {x_1}^2{x_2}^2\,\,{x_1}^3\,\,{x_2}^3\\ \end{array} \right] \,\, hθ​(x)=⎣⎢⎡​θ0​⋮θ11​​⎦⎥⎤​T⋅⎣⎡​x0​x1​x2​x1​x2​x1​2x2​2x1​x2​2x2​x1​2x1​2x2​2x1​3x2​3​⎦⎤​
将上式中变量用z替换,则原式为:
hθ(z)=[θ0⋮θ11]T⋅[z0z1z2z3z4z5z6z7z8z9z10]h_{\theta}\left( z \right) =\,\,\left[ \begin{array}{c} \theta _0\\ \vdots\\ \theta _{11}\\ \end{array} \right] ^T\cdot \left[ \begin{array}{c} z_0\,\,z_1\,\,z_2\,\,z_3\,\,z_4\,\,z_5\\ \,\,z_6\,\,z_7\,\,z_8\,\,z_9\,\,z_{10}\\ \end{array} \right] hθ​(z)=⎣⎢⎡​θ0​⋮θ11​​⎦⎥⎤​T⋅[z0​z1​z2​z3​z4​z5​z6​z7​z8​z9​z10​​]
参数更新公式和损失函数与一元多项式相同,直接上代码:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
x1=np.linspace(-1,1,20)
x2=np.linspace(2,4,20)
np.random.seed=7
def Y():return 5-2*x1+3*x2+3*x1**2-x2**2+4*x1*x2-10*x1**3
y=Y()
y_noise=np.random.normal(loc=0,scale=1,size=len(x1))x_train=np.stack((np.linspace(1,1,len(x1)),x1,x2,x1*x2,x1**2,x2**2,x1*x2**2,x2*x1**2,x1**2*x2**2,x1**3,x2**3),axis=1)#,x1**3,x2**3,x1*x2**3,x1**2*x2**3,x2*x1**3,x2**2*x1**3,x1**3*x2**3
y_train=y+y_noise
features=x_train.shape[1]m=len(x_train)
theat=np.linspace(1,1,features)*0
lr=0.001
def Y_pred(x,a):return np.dot(x,a)
def partial_theat(x,y,a):cost_all=np.linspace(1,1,features)*0for 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=0for i in range(m):cost=cost+(Y_pred(x[i],a)-y[i])**2return (1/2*m)*cost
theat_list=np.linspace(1,1,features)*0
while(True):      theat=theat-lr*partial_theat(x_train,y_train,theat)theat_list=np.vstack((theat_list,theat))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)
theat_list=theat_list[0:theat_list.shape[0]:500,:]
from matplotlib.animation import FuncAnimation
fig,ax=plt.subplots()
ln,=plt.plot([],[],'red')
def upgrad(frame):y=np.dot(x_train,frame)ln.set_data(x1,y)return ln,
plt.scatter(x1,y_train)
ani=FuncAnimation(fig,upgrad,frames=theat_list,interval=100)
ani.save('二元多项式.gif',writer='pillow')
plt.show()


迭代次数3万多次,计算相对复杂一些,而且与原函数各参数有所不同。
原函数关系:
y=5−2x1+3x2+3x12−x22+4x1x2−10x13y=5-2x_1+3x_2+3{x_1}^2-{x_2}^2+4x_1x_2-10{x_1}^3 y=5−2x1​+3x2​+3x1​2−x2​2+4x1​x2​−10x1​3
当有噪音时的拟合函数结果为:
hθ(x)=[0.57550069−1.435017330.29148473−1.059942843.24510915−0.185488670.733163333.91299186−1.30377424−5.82233560.17669733]T⋅[x0x1x2x1x2x12x22x1x22x2x12x12x22x13x23]Th_{\theta}\left( x \right) =\,\,^{\left[ \begin{array}{c} 0.57550069\\ -1.43501733\\ 0.29148473\\ -1.05994284\\ 3.24510915\\ -0.18548867\\ 0.73316333\\ 3.91299186\\ -1.30377424\\ -5.8223356\\ 0.17669733\\ \end{array} \right] ^T\cdot \left[ \begin{array}{c} x_0\,\,x_1\,\,x_2\,\,x_1x_2\,\,{x_1}^2\\ \,\,{x_2}^2\,\,x_1{x_2}^2\,\,x_2{x_1}^2\,\,\\ {x_1}^2{x_2}^2\,\,{x_1}^3\,\,{x_2}^3\\ \end{array} \right] ^T\,\,} hθ​(x)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​0.57550069−1.435017330.29148473−1.059942843.24510915−0.185488670.733163333.91299186−1.30377424−5.82233560.17669733​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​T⋅[x0​x1​x2​x1​x2​x1​2x2​2x1​x2​2x2​x1​2x1​2x2​2x1​3x2​3​]T

跟原函数参数有较大差距
当无噪声时,拟合结果为下图,拟合结果与加入噪声时的大致相同,所以,拟合函数结果与假设函数有关。虽然参数有所不同,但是函数误差很小,基本与原函数重合。

为准确拟合原函数,可在损失函数中引入正则项以降低函数复杂度。

python 机器学习 一元和二元多项式回归 梯度下降算法相关推荐

  1. python梯度下降法实现线性回归_【机器学习】线性回归——多变量向量化梯度下降算法实现(Python版)...

    [向量化] 单一变量的线性回归函数,我们将其假设为:hθ(χ)=θ0+θ1χh_\theta(\chi)=\theta_0+\theta_1\chihθ​(χ)=θ0​+θ1​χ但是如果我们的变量个数 ...

  2. python多元线性回归代码_Python实现梯度下降算法求多元线性回归(一)

    预备知识及相关文档博客 学习吴恩达机器学习课程笔记,并用python实现算法 python numpy基本教程: numpy相关教程 数据来自于UCI的机器学习数据库: UCI的机器学习数据库 pyt ...

  3. 用Python学习吴恩达机器学习——梯度下降算法理论篇

    开篇词:(CSDN专供) 欢迎阅读我的文章,本文起先是在B站上进行投稿,一开始是采用吴恩达机器学习2012年版的,目前已经出了十二期了.现在我决定将我摸索出来的学习笔记在各个平台上进行连载,保证同时更 ...

  4. 梯度下降算法原理讲解——机器学习

    博文目录 1. 概述 2. 梯度下降算法 2.1 场景假设 2.2 梯度下降 2.2.1 微分 2.2.2 梯度 2.3 数学解释 2.3.1 α 2.3.2 梯度要乘以一个负号 3. 实例 3.1 ...

  5. 【算法】梯度下降算法及python实现

    目录 1.概述 2.梯度下降算法 2.1 场景假设 2.1 梯度下降 2.1.1 微分 2.2.2 梯度 2.3 数学解释 2.3.1 α 2.3.2 梯度要乘以一个负号 3. 实例 3.2 多变量函 ...

  6. 梯度下降算法以及线性回归模型

    版权声明:本文为原创文章:http://blog.csdn.net/programmer_wei/article/details/51941358 梯度下降算法是一个很基本的算法,在机器学习和优化中有 ...

  7. python sklearn 梯度下降法_科学网—Python_机器学习_总结4:随机梯度下降算法 - 李军的博文...

    =============================================================== 总结如下: 1.随机梯度下降算法可以看成是梯度下降算法的近似,但通常它能 ...

  8. 机器学习中,梯度下降算法的问题引入

    来源 | 动画讲编程 今天讲解的内容是梯度下降算法. 梯度下降算法在机器学习中的应用十分广泛,该算法的最主要目的是通过迭代的方法找到目标函数的最小值,经常用来解决线性回归和逻辑回归等相关问题.本节课主 ...

  9. python二元函数求导_用Excel和python实现二元函数梯度下降的人工智能,之用,excel,一元...

    梯度下降法和牛顿法的总结与比较 机器学习的本质是建立优化模型,通过优化方法,不断迭代参数向量,找到使目标函数最优的参数向量.最终建立模型 通常用到的优化方法:梯度下降方法.牛顿法.拟牛顿法等.这些优化 ...

  10. 一文清晰讲解机器学习中梯度下降算法(包括其变式算法)

    本篇文章向大家介绍梯度下降(Gradient Descent)这一特殊的优化技术,我们在机器学习中会频繁用到. 前言 无论是要解决现实生活中的难题,还是要创建一款新的软件产品,我们最终的目标都是使其达 ...

最新文章

  1. [JS][dfs]题解 | #迷宫问题#
  2. matlab中ismember_相当于Matlab“ismember”in numpy(Python)?
  3. Spark 下操作 HBase
  4. upc组队赛15 Supreme Number【打表】
  5. java+nginx+tomcat+memcache
  6. 剑指offer面试题[22]-栈的压入、弹出序列
  7. 计算机桌面为什么没有语言栏了,电脑语言栏不见了有哪些解决方法
  8. 群同态基本定理证明_群论(2): 群作用, Sylow定理
  9. HttpClient的简单实现
  10. jQuery 1.3 API 参考文档中文版
  11. 原生H5+JS文件上传
  12. LaTeX常用符号(持续更新)
  13. 用c语言把图像转成jpg格式,图像格式转换之BMP格式转换为JPG格式(示例代码)
  14. 3208点阵时钟c语言程序,点阵万年历(带时间、年月日星期调整及闹钟功能)C程序...
  15. 下一代降维打击黑科技现身中国
  16. PROE二次开发(protoolkit):把PRT或者ASM模型转换成STEP,PS,IGES,CATIA等等格式
  17. 如何挑选属于自己的电脑
  18. python切割图片地图切图脚本
  19. Redis分布式锁剖析和几种客户端的实现
  20. 斯坦福的“计算广告学”

热门文章

  1. 百度开发者搜索及个人搜索方式总结
  2. 宁波银行成长的AB面:增长与合规不可兼得?管理漏洞不容忽视
  3. DVWA--SQL Injection(SQL注入-非盲注)(全难度)
  4. App Tamer for mac常见问题
  5. 用什么软件编写html语言,可以用什么工具编写javascript?
  6. 爱心树html演示,爱心树表白网页源码,jquery女神表白动画树特效
  7. 板载天线设计相关资料
  8. 编写python爬虫基础_0基础如何快速写python爬虫
  9. kdev-ruby 停止开发,原 maintainer 转用其它编辑器
  10. windows xp iis5.1服务器安装