梯度下降法及一元线性回归的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) 什么是线性回归?线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方 ...
随机推荐
- shell命令大全笔记
## -print 将匹配的文件输出到标准输出## -exec 将匹配的文件执行该参数所给出的shell命令## -ok 将匹配的文件执行该参数所给出的shell命令,每次执行命令有提示 #----- ...
- Python3程序设计指南:01 过程型程序设计快速入门
大家好,从本文开始将逐渐更新Python教程指南系列,为什么叫指南呢?因为本系列是参考<Python3程序设计指南>,也是作者的学习笔记,希望与读者共同学习. .py文件中的每个估计都是顺 ...
- 利用Helm简化Kubernetes应用部署(2)
目录 定义Charts 使用Helm部署Demo Helm常用操作命令 定义Charts 回到之前的“charts”目录,我们依次进行解读并进行简单的修改. Chart.yaml 配置示例: a ...
- 引入flask_cache时出现ModuleNotFoundError: No module named 'flask.ext'
环境: centos 7.3 python 3.6 flask 1.0.2 flask-cache 0.13.1 引入flask_cache后运行时,出现以下错误 Traceback (most re ...
- Oracle VM VirtualBOX桥接网卡
1.在VirtualBOX设置中的网络菜单,连接方式选择桥接网卡 2.启动系统,设置静态IP sudo vim /etc/network/interfaces auto enp0s3 ...
- Vtable内存布局分析
vtale 内存布局分析 虚函数表指针与虚函数表布局 考虑如下的 class: class A { public: int a; virtual void f1() {} virtual void f ...
- Tensorflow从开始到放弃(技术篇)
在gpu中运行 tf.device("/gpu:1") 有时候这个是会出问题的,即便你在有名称为1的gpu时.有的操作是不能支持gpu的,应该为session添加一些配置: pyt ...
- jmeter基本组件介绍
常用术语统一:元件-jmeter工具菜单的一个子菜单(功能) 组件-一组元件的集合.如http请求与取样器的的关系 jmeter测试计划要素: (1)脚本中测试计划只能有一个: (2)测试计划中至 ...
- spring security原理-学习笔记1-整体概览
整体概述 运行时环境 Spring Security 3.0需要Java 5.0 Runtime Environment或更高版本. 核心组件 SecurityContextHolder,Securi ...
- git jenkins 基本部署 gitlab私有仓库
从代码私有性方面来看,公司不希望员工获取到全部的代码,这个时候 GitLab 无疑是最佳的选择.但对于开源项目而言,GitHub 依然是代码托管的首选平台. 1.安装gitlab[root@gitla ...