梯度下降法及一元线性回归的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版)
上周在实验室里师姐说了这么一个问题,对于线性回归问题,最小二乘法和梯度下降方法所求得的权重值是一致的,对此我颇有不同观点.如果说这两个解决问题的方法的等价性的确可以根据数学公式来证明,但是很明显的这个 ...
sklearn中实现随机梯度下降法(多元线性回归)
sklearn中实现随机梯度下降法 随机梯度下降法是一种根据模拟退火的原理对损失函数进行最小化的一种计算方式,在sklearn中主要用于多元线性回归算法中,是一种比较高效的最优化方法,其中的梯度下降系 ...
最小二乘法 及 梯度下降法 分别对存在多重共线性数据集 进行线性回归 (Python版)
网上对于线性回归的讲解已经很多,这里不再对此概念进行重复,本博客是作者在听吴恩达ML课程时候偶然突发想法,做了两个小实验,第一个实验是采用最小二乘法对数据进行拟合, 第二个实验是采用梯度下降方法对数据 ...
梯度下降法的python代码实现(多元线性回归)
梯度下降法的python代码实现(多元线性回归最小化损失函数) 1.梯度下降法主要用来最小化损失函数,是一种比较常用的最优化方法,其具体包含了以下两种不同的方式:批量梯度下降法(沿着梯度变化最快的方向 ...
Python实现——一元线性回归(梯度下降法)
2019/3/25 一元线性回归--梯度下降/最小二乘法_又名:一两位小数点的悲剧_ 感觉这个才是真正的重头戏,毕竟前两者都是更倾向于直接使用公式,而不是让计算机一步步去接近真相,而这个梯度下降就不一 ...
梯度下降法实现最简单线性回归问题python实现
梯度下降法是非常常见的优化方法,在神经网络的深度学习中更是必会方法,但是直接从深度学习去实现,会比较复杂.本文试图使用梯度下降来优化最简单的LSR线性回归问题,作为进一步学习的基础. import n ...
简单线性回归(梯度下降法) python实现
grad_desc .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...
梯度下降法VS随机梯度下降法 (Python的实现)
# -*- coding: cp936 -*- import numpy as np from scipy import stats import matplotlib.pyplot as plt # ...
随机推荐
mybatis入门基础(四)----输入映射和输出映射
一:输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 1.1.传递pojo的包装对象 1.1.1.需求描述 完成用户信息的综合查询, ...
java基础知识总结(2)
抽象方法的定义语法: 访问修饰符 abstract <返回类型> <方法名>(参数列表): 在语法中:abstract关键字表示该方法被定义为抽象方法 抽象方法和普通方 ...
poj2253
此题略坑,%.3lf用g++一直WA,c++过的 //Accepted 468 KB 16 ms #include #include #i ...
Codeforces Round #360 div2
Problem_A(CodeForces 688A): 题意: 有d天, n个人.如果这n个人同时出现, 那么你就赢不了他们所有的人, 除此之外, 你可以赢他们所有到场的人. 到场人数为0也算赢. 现 ...
SQL Server数据库同步SQL
select table_name,COLUMN_NAME,data_TYPE,CHARACTER_OCTET_LENGTH,CHARACTER_MAXIMUM_LENGTH from informa ...
BEANUTIL 对象转JSON
package cn.com.softmap.cache.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...
php中的public、protected、private三种访问控制模式及self和parent的区别(转)
php的public.protected.private三种访问控制模式的区别 public: 公有类型 在子类中可以通过self::var调用public方法或属性,parent::method调用 ...
linux 定时任务,压缩 日志,并删除掉 指定日期之前的 日志
sh文件 #!/bin/sh myPath="/var/www/Client/storage/logs/" myFile="lumen.log" cd $myP ...
使用Maven
MyEclipse2015自带有Maven,但是建个工程老出错. (Eclipse J2EE也自带有) 1.下载maven.官网 http://maven.apache.org/download.cg ...
将不同级别的logging 日志信息写入不同文件
将不同级别的logging 日志信息写入不同文件 # -*- coding: utf-8 -*- import os import time from logging.handlers import ...