人工智能与机器学习-梯度下降法

一、梯度下降法概述

梯度下降法(Gradient descent)是一个一阶最优化算法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。

二、梯度下降法直观理解

以人下山为例,要到达最低点,需要以下步骤:

第一步,明确自己现在所处的位置

第二步,找到相对于该位置而言下降最快的方向

第三步,沿着第二步找到的方向走一小步,然后到底一个新的位置,这时候的位置就比原来更低

第四步,又明确当前所处位置,即回到第一步

第五步,到底最低点后就停下

基于以上步骤,就能够找到最低点,以下图为例

三、多元函数的梯度下降解法

以y(x)函数为例,这个函数具有n+1个自变量:

首先需要设置下降的初始位置,随意设置即可:

接下来需要对每一个自变量求偏导:

将设置的初始值代入偏导的公式,接下来进行迭代的公式
上式中的α为学习率,也可叫做步长

四.实例

1、Python与Excel分别使用梯度下降法求解极小值与极小点

(1)、Excel使用梯度下降法求解极小值与极小点

需要设置下降的起始位置与学习率的值:

通过设置的起始位置去计算自变量的偏导、偏导与学习率的乘积以及最终的函数值:
已经知道第一行的信息,也就可以计算出第二行的信息,然后根据第二行的信息进行迭代求极值,因为第一行的计算公式与第二行的计算公式有所不同,但第二行与后面的计算公式相同,因此还需要求得第二行的信息:
后面的迭代可以采用excel中的复制功能即可,当函数值收敛的时候停止迭代,因为学习率取得比较小,因此迭代的次数就会比较多。

最终迭代出来的极小值为-8,极小点为(4,2),在迭代多次x1的值应该是等于4的

(2)、Python计算极小值与极小点并画出图像

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import math
from mpl_toolkits.mplot3d import Axes3D
import warnings
# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
%matplotlib inline
def f2(x1,x2):return x1 ** 2+2*x2 ** 2-4*x1-2*x1*x2
X1 = np.arange(-4,4,0.2)
X2 = np.arange(-4,4,0.2)
X1, X2 = np.meshgrid(X1, X2) # 生成xv、yv,将X1、X2变成n*m的矩阵,方便后面绘图
Y = np.array(list(map(lambda t : f2(t[0],t[1]),zip(X1.flatten(),X2.flatten()))))
Y.shape = X1.shape # 1600的Y图还原成原来的(40,40)%matplotlib inline
#作图
fig = plt.figure(facecolor='w')
ax = Axes3D(fig)
ax.plot_surface(X1,X2,Y,rstride=1,cstride=1,cmap=plt.cm.jet)
ax.set_title(u'$ y = x1^2+2x2^2-4x1-2x1x2  $')
plt.show()

# 二维原始图像
def f2(x1, x2):return x1 ** 2+2*x2 ** 2-4*x1-2*x1*x2
## 偏函数
def hx1(x1, x2):return 2* x1-4-2*x2
def hx2(x1, x2):return 4*x2-2*x1
x1 = 1
x2 = 1
alpha = 0.0011
#保存梯度下降经过的点
GD_X1 = [x1]
GD_X2 = [x2]
GD_Y = [f2(x1,x2)]
# 定义y的变化量和迭代次数
y_change = f2(x1,x2)
iter_num = 0while(y_change < 1e-10 and iter_num < 10000) :   #此处可以设置迭代的次数以及y的变化量小于多少时停止迭代tmp_x1 = x1 - alpha * hx1(x1,x2)tmp_x2 = x2 - alpha * hx2(x1,x2)tmp_y = f2(tmp_x1,tmp_x2)f_change = np.absolute(tmp_y - f2(x1,x2))x1 = tmp_x1x2 = tmp_x2GD_X1.append(x1)GD_X2.append(x2)GD_Y.append(tmp_y)iter_num += 1
print(u"最终结果为:(%.5f, %.5f, %.5f)" % (x1, x2, f2(x1,x2)))
print(u"迭代过程中X的取值,迭代次数:%d" % iter_num)
print(GD_X1)# 作图
fig = plt.figure(facecolor='w',figsize=(20,18))
ax = Axes3D(fig)
ax.plot_surface(X1,X2,Y,rstride=1,cstride=1,cmap=plt.cm.jet)
ax.plot(GD_X1,GD_X2,GD_Y,'ko-')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title(u'函数;\n学习率:%.3f; 最终解:(%.3f, %.3f, %.3f);迭代次数:%d' % (alpha, x1, x2, f2(x1,x2), iter_num),fontsize=30)
plt.show()
最终结果为:(3.99942, 1.99964, -8.00000)
迭代过程中X的取值,迭代次数:10000
[1, 1.0044, 1.00878548, 1.013156514536, 1.0175131777223392, 1.021855543254118, 1.0261836844096073, 1.0304976740526408.........]

2、梯度下降法求解多元线性回归方程式参数并与最小二乘法求得参数进行比较

(1)、最小二乘法

①、Excel得出的结果

Excel画出的图像

Excel求出的方程式

②、Python计算出来的结果与画出的图像
#导入需要的库
from sklearn import linear_model        #表示,可以调用sklearn中的linear_model模块进行线性回归。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
#读入本地数据
data=pd.read_excel('media/作业2.xlsx')
x=data[['店铺的面积(坪)','距离最近的车站(m)']]
x

y=data['月营业额(万日元)']
y
梦之丘总店     469
寺井站大厦店    366
曾根店       371
桥本大街店     208
桔梗町店      246
邮政局前店     297
水道町站前店    363
六条站大厦店    436
若叶川店      198
美里店       364
Name: 月营业额(万日元), dtype: int64
model=linear_model.LinearRegression()
model.fit(x,y)
#调用sklearn库求出常数与未知数
a1=model.coef_[0]
a2=model.coef_[1]
b=model.intercept_
print("第一个未知数a1="+str(a1)+";第二个未知数a2="+str(a2)+";常数b="+str(b))
第一个未知数a1=41.513478256438496;第二个未知数a2=-0.3408826856636194;常数b=65.32391638894819
#打印回归方程
print("多元线性回归y="+str(a1)+"*x1"+str(a2)+"*x2+"+str(b))
多元线性回归y=41.513478256438496*x1-0.3408826856636194*x2+65.32391638894819
#支持中文
from pylab import mpl
mpl.rcParams['font.sans-serif']=['FangSong']
mpl.rcParams['axes.unicode_minus']=Falsesns.pairplot(data, x_vars=['店铺的面积(坪)','距离最近的车站(m)'], y_vars='月营业额(万日元)',height=8,size=4, aspect=1.5,kind = 'reg')
plt.show()

月营业额与距离车站的距离和店铺面积的关系,可以看出,与车站距离成反比,而与店铺面积成正比。

(2)、梯度下降法求解多元线性回归方程式

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
data=np.genfromtxt('media/车站问题.csv',delimiter=',')
x_data=data[:,:-1]
y_data=data[:,2]
#定义学习率、斜率、截据
#设方程为y=theta1x1+theta2x2+theta0
lr=0.00001
theta0=0
theta1=0
theta2=0
#定义最大迭代次数,因为梯度下降法是在不断迭代更新k与b
epochs=10000
#定义最小二乘法函数-损失函数(代价函数)
def compute_error(theta0,theta1,theta2,x_data,y_data):totalerror=0for i in range(0,len(x_data)):#定义一共有多少样本点totalerror=totalerror+(y_data[i]-(theta1*x_data[i,0]+theta2*x_data[i,1]+theta0))**2return totalerror/float(len(x_data))/2
#梯度下降算法求解参数
def gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs):m=len(x_data)for i in range(epochs):theta0_grad=0theta1_grad=0theta2_grad=0for j in range(0,m):theta0_grad-=(1/m)*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta2)+y_data[j])theta1_grad-=(1/m)*x_data[j,0]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])theta2_grad-=(1/m)*x_data[j,1]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])theta0=theta0-lr*theta0_gradtheta1=theta1-lr*theta1_gradtheta2=theta2-lr*theta2_gradreturn theta0,theta1,theta2
#进行迭代求解
theta0,theta1,theta2=gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs)
print("多元线性回归方程为:y=",theta1,"X1+",theta2,"X2+",theta0)
ax=plt.figure().add_subplot(111,projection='3d')
ax.scatter(x_data[:,0],x_data[:,1],y_data,c='r',marker='o')
x0=x_data[:,0]
x1=x_data[:,1]
#生成网格矩阵
x0,x1=np.meshgrid(x0,x1)
z=theta0+theta1*x0+theta2*x1
#画3d图
ax.plot_surface(x0,x1,z)
ax.set_xlabel('店铺的面积',fontsize=20)
ax.set_ylabel('距离最近的车站',fontsize=20)
ax.set_zlabel("月营业额",fontsize=20)
plt.show()
多元线性回归方程为:y= 45.0533119768975 X1+ -0.19626929358281256 X2+ 5.3774162274868

(3)、对比分析

通过与最小二乘法的结果进行对比分析,发现梯度下降法计算出来的误差比较大,精度比较低。而最小二乘法无论是借助sklearn库还是借用公式推导得出的结果都是比较精确的!

人工智能与机器学习-梯度下降法相关推荐

  1. 机器学习梯度下降法举例

    本文是参考Andrew Ng网上课程和别人总结的机器学习笔记,作为笔者学习的参考,笔者主要实现了一些程序问题. 持续更新中- 更新- 先以最为简单的例子举例,比如有一个函数为y=x2y=x^2y=x2 ...

  2. 机器学习梯度下降法应用波士顿房价预测

    目录 1 线性回归api介绍 小结 2 波士顿房价预测 2.1 案例背景介绍 2.2 案例分析 2.3 回归性能评估 2.4 代码实现 2.4.1 正规方程 2.4.2 梯度下降法 2.5 小结 1 ...

  3. 人工智能算法之梯度下降法、协同过滤、相似度技术、ALS算法(附案例分析)、模型存储与加载、推荐系统的冷启动问题

    梯度下降法 求解机器学习算法的模型参数,即无约束优化问题时,梯度下降法是最常采用的方法之一,另一种常用的方法是最小二乘法.这里对梯度下降法做简要介绍. 最小二乘法法适用于模型方程存在解析解的情况.如果 ...

  4. 机器学习入门(09)— 偏导数、梯度概念、梯度下降法理论和实现

    1. 偏导数概念 对于式 4-6 而言 式(4.6)有两个变量,求导数时有必要区分对哪个变量求导数,即对 x0 和 x1 两个变量中的哪一个求导数.另外,我们把这里讨论的有多个变量的函数的导数称为偏导 ...

  5. 机器学习最常用的优化算法 — 梯度下降法

    1. 学习目标 每一个机器学习模型都有一个目标函数,而学习的目标,就是最小化目标函数.直观而言,当我们已经获得了一个函数,最小化该函数其实就是,在其自变量取值范围内,找到使得因变量最小的那个自变量取值 ...

  6. 机器学习中的梯度下降法

    1. 机器学习中为什么需要梯度下降 梯度下降是机器学习中常见优化算法之一,梯度下降法有以下几个作用: (1)梯度下降是迭代法的一种,可以用于求解最小二乘问题. (2)在求解机器学习算法的模型参数,即无 ...

  7. 梯度下降法Gradient Descent深度学习 机器学习

    梯度下降法 在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,梯度下降法是一种一阶优化算法,另一种常用的方法是最小二乘法. 求偏导数 ...

  8. 机器学习入门系列一(关键词:单变量线性回归,梯度下降法)

    机器学习入门系列一(关键词:单变量线性回归,梯度下降法) 如上图所示,我们的目标是希望通过这些数据得到城市人口数和利润可能的对应关系,并可以通过城市人口数(利润)来预测它的利润(城市人口数),在这里我 ...

  9. [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)

    本文转自:https://blog.csdn.net/walilk/article/details/50978864 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记, ...

最新文章

  1. [推荐]C#快速开发3d游戏工具--Unity3d
  2. Morph 3D拥有近千名艺术家,欲打造全球最大的VR虚拟化身服装库
  3. 北纬39°54上的采访
  4. java 字符串写入word,JAVA 将字符串hollow 替换成word肿么实现?
  5. ​Xamarin iOS教程之视图显示图像
  6. 内联元素与块级元素及内外边距的影响
  7. sublime text 3安装及使用
  8. Symfony 4.2.4 和 3.4.23 发布,经典 PHP Web 开发框架
  9. pap认证过程_PPP协议当中LCP协商过程详解和PAP认证原理介绍
  10. FreeSSL + ACME自动化续期域名SSL证书(支持泛域名)
  11. 2的指数字节转与MB、GB换算关系
  12. Denoise-----去除噪声
  13. linux 主机卫士安装及使用
  14. 时间漩涡的世界 (二)
  15. 指定服务器不存在或访问被拒绝访问,SQL Server不存在或访问被拒绝怎么办
  16. java中的面向对象(基础)
  17. 鼠标能动但是无法点击屏幕(间歇性)
  18. 实时监测麦克风音量及检测MIC
  19. 金地农村土地承包经营权证打证系统
  20. 什么是disjoint-support?

热门文章

  1. 这届网友实在是太有才了!用python爬取15万条《我是余欢水》弹幕
  2. 判别分析(Discriminate Analysis)
  3. 网址打包(详细图文教程!) 使用HBuilder将网址打包成app
  4. oracle如何判断数字中有字母,SQL 判断含有字母和数字的字符串
  5. Win10物理机的VMnet8和VMnet1黄色感叹号
  6. System.Windows.Markup.XamlParseException:““在“System.Windows.StaticResourceExtension”上提供值时引发了异常
  7. 干货笔记,数据仓库工具箱(附电子书下载)
  8. vue药物管理系统nodejs
  9. 拍案叫绝的创意如何诞生?
  10. 初级程序员 高级程序员_程序员的十大电影