梯度下降法及一元线性回归的python实现
梯度下降法及一元线性回归的python实现
一、梯度下降法形象解释
设想我们处在一座山的半山腰的位置,现在我们需要找到一条最快的下山路径,请问应该怎么走?根据生活经验,我们会用一种十分贪心的策略,即在现在所处的位置上找到一个能够保证我们下山最快的方向,然后向着该方向行走;每到一个新位置,重复地应用上述贪心策略,我们就可以顺利到达山底了。其实梯度下降法的运行过程和上述下山的例子没有什么区别,不同的是我们人类可以凭借我们的感官直觉,根据所处的位置来选择最佳的行走方向,而梯度下降法所依据的是严格的数学法则来进行每一步的更新。本文不再对该算法进行严格的数理讨论,只介绍梯度下降法进行数据拟合的流程和利用梯度下降法解决一元线性回归的python实现。
二、梯度下降法算法应用流程
假设有一组数据X=[x1,x2,x3,...],Y=[y1,y2,y3,...],现求由X到Y的函数关系:
1、为所需要拟合的数据,构造合适的假设函数:y=f(x;θ),以θ=[θ1,θ2,θ3,...]为参数;
2、选择合适的损失函数:cost(θ),用损失函数来衡量假设函数对数据的拟合程度;
3、设定梯度下降法的学习率 α,参数的优化初始值及迭代终止条件;
4、迭代更新θ,直到满足迭代终止条件,更新公式为:
θ1=θ1-α*dcost(θ)/dθ1,
θ2=θ2-α*dcost(θ)/dθ2,...
三、一元线性回归的python实现
下面以一个一元线性回归的例子来更进一步理解梯度下降法的过程。笔者通过在函数y=3*x+2的基础之上添加一些服从均匀分布的随机数来构造如下的待拟合数据:X,Y,训练数据图像如下图1所示。假设函数为一元线性函数: y=f(x;θ,k)=θ*x+k,损失函数为:cost(θ,k)=1/2*∑(f(xi;θ,k)-yi),xi属于X,yi属于Y,损失函数的图像如下图2所示。应用梯度下降法进行参数更新的过程如图3中的蓝色圆点所示。

(1)

(2)

(3)
程序源代码如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D np.random.seed(1)
#生成样本数据
x=np.arange(-1,1,step=0.04)#自变量
noise=np.random.uniform(low=-0.5,high=0.5,size=50)#噪声
y=x*3+2+noise#因变量
#显示待拟合数据
plt.figure(1)
plt.xlabel('x')
plt.ylabel('y')
plt.scatter(x,y) #假设函数为一元线性函数:y=theta*x+k,需要求解的参数为theta和k
#损失函数为
def cost(theta, k, x, y):
return 1/2*np.mean((theta*x+k-y)**2) def cost_mesh(theta_m, k_m, x, y):
z_m=np.zeros((theta_m.shape[0],theta_m.shape[1]))
for i in range(theta_m.shape[0]):
for j in range(theta_m.shape[1]):
z_m[i,j]=cost(theta_m[i,j], k_m[i,j],x,y)
return z_m
#可视化损失函数
theta_axis=np.linspace(start=0, stop=5,num=50)
k_axis=np.linspace(start=0, stop=5,num=50)
(theta_m, k_m)=np.meshgrid(theta_axis,k_axis)#网格化
z_m=cost_mesh(theta_m, k_m, x, y)
#绘制损失函数的3D图像
fig=plt.figure(2)
ax=Axes3D(fig)#为figure添加3D坐标轴
ax.set_xlabel('theta')
ax.set_ylabel('k')
ax.set_zlabel('cost')
ax.plot_surface(theta_m, k_m, z_m,rstride=1, cstride=1,cmap=plt.cm.hot, alpha=0.5)#绘制3D的表面, rstide为行跨度,cstride为列跨度 #梯度下降法
#参数设置
lr=0.01#学习率
epoches=600#迭代次数,即迭代终止条件 #参数初始数值
theta=0
k=0 #迭代更新参数
for i in range(epoches):
theta_gra=np.mean((theta*x+k-y)*x)#theta梯度
k_gra=np.mean(theta*x+k-y)#k梯度
#更新梯度
theta-=theta_gra*lr
k-=k_gra*lr
#绘制当前参数所在的位置
if i%50==0:
ax.scatter3D(theta, k, cost(theta, k, x,y), marker='o', s=30, c='b')
print('最终的结果为:theta=%f, k=%f'%(theta, k))
plt.show()
梯度下降法及一元线性回归的python实现的更多相关文章
- 最小二乘法 及 梯度下降法 运行结果对比(Python版)
上周在实验室里师姐说了这么一个问题,对于线性回归问题,最小二乘法和梯度下降方法所求得的权重值是一致的,对此我颇有不同观点.如果说这两个解决问题的方法的等价性的确可以根据数学公式来证明,但是很明显的这个 ...
- sklearn中实现随机梯度下降法(多元线性回归)
sklearn中实现随机梯度下降法 随机梯度下降法是一种根据模拟退火的原理对损失函数进行最小化的一种计算方式,在sklearn中主要用于多元线性回归算法中,是一种比较高效的最优化方法,其中的梯度下降系 ...
- 最小二乘法 及 梯度下降法 分别对存在多重共线性数据集 进行线性回归 (Python版)
网上对于线性回归的讲解已经很多,这里不再对此概念进行重复,本博客是作者在听吴恩达ML课程时候偶然突发想法,做了两个小实验,第一个实验是采用最小二乘法对数据进行拟合, 第二个实验是采用梯度下降方法对数据 ...
- 梯度下降法的python代码实现(多元线性回归)
梯度下降法的python代码实现(多元线性回归最小化损失函数) 1.梯度下降法主要用来最小化损失函数,是一种比较常用的最优化方法,其具体包含了以下两种不同的方式:批量梯度下降法(沿着梯度变化最快的方向 ...
- Python实现——一元线性回归(梯度下降法)
2019/3/25 一元线性回归--梯度下降/最小二乘法_又名:一两位小数点的悲剧_ 感觉这个才是真正的重头戏,毕竟前两者都是更倾向于直接使用公式,而不是让计算机一步步去接近真相,而这个梯度下降就不一 ...
- 机器学习---用python实现最小二乘线性回归算法并用随机梯度下降法求解 (Machine Learning Least Squares Linear Regression Application SGD)
在<机器学习---线性回归(Machine Learning Linear Regression)>一文中,我们主要介绍了最小二乘线性回归算法以及简单地介绍了梯度下降法.现在,让我们来实践 ...
- 梯度下降法实现最简单线性回归问题python实现
梯度下降法是非常常见的优化方法,在神经网络的深度学习中更是必会方法,但是直接从深度学习去实现,会比较复杂.本文试图使用梯度下降来优化最简单的LSR线性回归问题,作为进一步学习的基础. import n ...
- 简单线性回归(梯度下降法) python实现
grad_desc .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...
- [Machine Learning] 单变量线性回归(Linear Regression with One Variable) - 线性回归-代价函数-梯度下降法-学习率
单变量线性回归(Linear Regression with One Variable) 什么是线性回归?线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方 ...
随机推荐
- Flutter 的基本控件
文本控件 Text 支持两种类型的文本展示,一个是默认的展示单一样式文本 Text,另一个是支持多种混合样式的富文本 Text.rich. 单一样式文本 Text 单一样式文本 Text 的初始化,是 ...
- VMware ESXI6.0服务器安装系列:RAID设置
本文转载至http://www.scriptjc.com/article/847 1.连接显示器 2.插上键盘.U盘.显示器 3.看显示屏上的提示,按F12关机 4.关机前输入密码,然后按回车键 更换 ...
- EasyExcel 轻松灵活读取Excel内容
写在前面 Java 后端程序员应该会遇到读取 Excel 信息到 DB 等相关需求,脑海中可能突然间想起 Apache POI 这个技术解决方案,但是当 Excel 的数据量非常大的时候,你也许发现, ...
- Java8新特性之Lambda
为什么要Lambda Java8应该是目前最大的一次更新了,更新后我们迎来了很多新特性,其中便包括Lambda表达式,函数式编程的思想正式进入Java,让我们看一个经典案例. 例1 按照两个人的年龄排 ...
- 域渗透基础之Windows 2012创建域控制器
创建备份域控制器 这里就拿windows 2012 R2来当备份域控 如果一个域内有多个域控制器,可以有如下好处. 提高用户登录的效率:如果同时有多台域控制器对客户提供服务,可以分担审核用户登录身份( ...
- Debian更新源加安装Metespolit&&Cobalt Strike
首先更新下源 修改/etc/apt/sources.list文件 再apt-get update deb http://mirrors..com/debian/ stretch main non-fr ...
- vc++中字符串的免杀
一:格式字符: http://baike.baidu.com/view/2194593.htm d:以十进制形式输出带符号整数(正数不输出符号)o:以八进制形式输出无符号整数(不输出前缀o)x:以十六 ...
- cmake::helloworld
ubuntu16. cmake安装 apt-get install cmake 1.创建 CMakeLists.txt , main.cpp 2.cmake . 生成 makefile 3.遇到错误c ...
- Python3+RobotFramework+pycharm环境搭建
我的环境为 python3.6.5+pycharm 2019.1.3+robotframework3.1.2 1.安装python3.x 略 之后在cmd下执行:pip install robot ...
- 达孚电子(NDF)参加2019年印度电子元器件展圆满成功
2019年9月27日-29日,达孚电子(NDF)参加2019年印度国际电子元器件及生产设备展览会在印度国际展览中心举得圆满成功,为期三天的展会中,打造了一场电子元器件行业交流的饕餮盛宴. 本次展会取得 ...