目录

  • 一、梯度下降法求解
    • 1.1 基本概念
    • 1.2 梯度下降法手工求解
    • 1.3 Excel 实现梯度下降法求解
  • 二、线性回归问题求解
    • 2.1 最小二乘法
    • 2.2 梯度下降法
  • 三、总结
  • 四、参考资料

一、梯度下降法求解

1.1 基本概念

微分:

  • 由函数 B=f(A),得到 A、B 两个数集,在 A 中当 dx 靠近自己时,函数在 dx 处的极限叫作函数在 dx 处的微分,微分的中心思想是无穷分割。
  • 微分是函数改变量的线性主要部分。
  • 微积分的基本概念之一。
    单变量的微分:dx2dx=2x多变量的微分:∂x2y2∂x=2xy2单变量的微分:\frac{dx^2}{dx}=2x\\ 多变量的微分:\frac{\partial x^2y^2}{\partial x}=2xy^2 单变量的微分:dxdx2​=2x多变量的微分:∂x∂x2y2​=2xy2

梯度:

  • 是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
  • 例:
    f(x,y,z)=0.55−(5x+2y−12z)f(x,y,z)=0.55-(5x+2y-12z) f(x,y,z)=0.55−(5x+2y−12z)
  • 梯度:
    gradf(x,y,z)=∇f(x,y,z)=(∂f(x,y,z)∂x,∂f(x,y,z)∂y,∂f(x,y,z)∂z)=(−5,−2,12)gradf(x,y,z)=\nabla f(x,y,z)=(\frac{\partial f(x,y,z)}{\partial x},\frac{\partial f(x,y,z)}{\partial y},\frac{\partial f(x,y,z)}{\partial z})=(-5,-2,12) gradf(x,y,z)=∇f(x,y,z)=(∂x∂f(x,y,z)​,∂y∂f(x,y,z)​,∂z∂f(x,y,z)​)=(−5,−2,12)
  • 由此,看来梯度是一个向量,向量包括大小和方向;
  • 所以梯度的方向就指出了函数在给定点的上升最快的方向;
  • 而梯度的反方向就是函数在给定点下降最快的方向。

梯度下降法:

  • 是一个一阶最优化算法。
  • 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。
  • 如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点;这个过程则被称为梯度上升法。

详细的数学推导:什么是梯度下降法?

1.2 梯度下降法手工求解

题目:

  • 求函数
    f(x)=f(x1,x2)=13x12+12x22f(x)=f(x_1,x_2)=\frac{1}{3}x_1^2+\frac{1}{2}x_2^2 f(x)=f(x1​,x2​)=31​x12​+21​x22​
  • 的极小值点。

手工求解过程:

  • 设置初始点及学习率:

    • 初始点:x0=(x1(0),x2(0))⊤=(3,2)⊤初始点:x^0=(x_1^{(0)},x_2^{(0)})^⊤=(3,2)^⊤初始点:x0=(x1(0)​,x2(0)​)⊤=(3,2)⊤
    • 学习率:λ学习率:\lambda学习率:λ

说明:初始点和学习率是自己随意设置的,这里学习率就不预设值,当然也可以预先设置学习率的值,只不过取值不是很好确定,取值取得不是很好,可能要迭代很多次。

  • 计算初始点的梯度:

    • 梯度计算:∇f(x)=(23x1,x2)梯度计算:\nabla f(x)=(\frac{2}{3}x_1,x_2)梯度计算:∇f(x)=(32​x1​,x2​)
    • 初始值的梯度:∇f(x0)=(2,2)初始值的梯度:\nabla f(x^0)=(2,2)初始值的梯度:∇f(x0)=(2,2)
  • 更新迭代公式:
    • f(x1)=f(x0−λ∇f(x0))=103λ2−8λ+5f(x^1)=f(x^0-\lambda \nabla f(x^0))=\frac{10}{3}\lambda^2-8\lambda+5f(x1)=f(x0−λ∇f(x0))=310​λ2−8λ+5
    • λ0=65\lambda^0=\frac{6}{5}λ0=56​为很熟极小点;
    • 更新后的迭代公式:x1=x0−λ0∇f(x0)=(35,−25)x^1=x^0-\lambda^0\nabla f(x^0)=(\frac{3}{5},-\frac{2}{5})x1=x0−λ0∇f(x0)=(53​,−52​)
    • 重复上面过程可以得到:x2=(352,252)x^2=(\frac{3}{5^2},\frac{2}{5^2})x2=(523​,522​)
    • 通过总结可以得到:xk=(35k,(−1)k25k)x^k=(\frac{3}{5^k},(-1)^k\frac{2}{5^k})xk=(5k3​,(−1)k5k2​)
    • 不断地迭代,直到:xk=(0,0)x^k=(0,0)xk=(0,0)为止。

1.3 Excel 实现梯度下降法求解

  • 求解z=2(x−1)2+y2z=2(x−1)^2+y^2z=2(x−1)2+y2的近似根。

  • 设置表格的一些基本内容:

  • 设置(x,y)初始值为(2,1),其它地方输入相应的公式:

    • ∂z∂x=4∗(x−1)\frac{\partial z}{\partial x}=4*(x-1)∂x∂z​=4∗(x−1)
    • ∂z∂x=2y\frac{\partial z}{\partial x}=2y∂x∂z​=2y
    • ∇x=η∂z∂x\nabla x=\eta \frac{\partial z}{\partial x}∇x=η∂x∂z​
    • ∇y=η∂z∂y\nabla y=\eta \frac{\partial z}{\partial y}∇y=η∂y∂z​
    • z=2(x−1)2+y2z=2(x−1)^2+y^2z=2(x−1)2+y2


  • 迭代多次后结果如下:

  • 由此,可得到其近似值为(1,0),迭代很多次才得到想要的结果

二、线性回归问题求解

2.1 最小二乘法

  • 定义数据及设置相关数值
from sklearn import linear_model
#可以调用sklearn中的linear_model模块进行线性回归
import numpy as np
import matplotlib.pyplot as plt
# 定义数据集的大小 即20个数据点
m = 20
# x的坐标以及对应的矩阵
X0 = np.ones((m, 1))  # 生成一个m行1列的向量,其值全是1
X1 = np.arange(1, m+1).reshape(m, 1)  # 生成一个m行1列的向量,也就是x1,从1到m
X = np.hstack((X0, X1))  # 按照列堆叠形成数组,其实就是样本数据
# 对应的y坐标
Y = np.array([3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,11, 13, 13, 16, 17, 18, 17, 19, 21]).reshape(m, 1)
  • 进行线性回归。
#进行线性回归的求解
model = linear_model.LinearRegression()
model.fit(X1,Y)
print("斜率=",model.coef_[0])
print("截距为=",model.intercept_)

  • 线性结果绘制:
# 根据数据画出对应的图像
def plot(X, Y, theta):ax = plt.subplot(111)  # 将画布分为1行1列,取第一个ax.scatter(X, Y, s=30, c="blue", marker="s")plt.xlabel("X")plt.ylabel("Y")x = arange(0, 21, 0.2)  # x的范围y =  model.intercept_+ model.coef_[0]*xax.plot(x, y)plt.show()plot(X1, Y, model.coef_[0])

2.2 梯度下降法

  • 定义数据及设置相关数值。
from numpy import *
# 定义数据集的大小 即20个数据点
m = 20
# x的坐标以及对应的矩阵
X0 = ones((m, 1))  # 生成一个m行1列的向量,其值全是1
X1 = arange(1, m+1).reshape(m, 1)  # 生成一个m行1列的向量,也就是x1,从1到m
X = hstack((X0, X1))  # 按照列堆叠形成数组,其实就是样本数据
# 对应的y坐标
Y = np.array([3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,11, 13, 13, 16, 17, 18, 17, 19, 21
]).reshape(m, 1)
# 学习率
alpha = 0.01
import matplotlib.pyplot as plt
#绘制出数据集
plt.scatter(X1,Y,color='red')
plt.show()

  • 代价函数定义及代价函数的梯度函数。
# 定义代价函数
#损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数
def cost_function(theta, X, Y):diff = dot(X, theta) - Y  # dot() 数组需要像矩阵那样相乘,就需要用到dot()return (1/(2*m)) * dot(diff.transpose(), diff)# 定义代价函数对应的梯度函数
def gradient_function(theta, X, Y):diff = dot(X, theta) - Yreturn (1/m) * dot(X.transpose(), diff)
# 梯度下降迭代
def gradient_descent(X, Y, alpha):#将[1,1]变为2行1列的形式theta = array([1, 1]).reshape(2, 1)#得到代价函数的初始梯度gradient = gradient_function(theta, X, Y)#不断迭代的过程while not all(abs(gradient) <= 1e-5):#更新迭代公式theta = theta - alpha * gradient#更新迭代所用的梯度gradient = gradient_function(theta, X, Y)return theta#梯度下降最终的结果
optimal = gradient_descent(X, Y, alpha)
print('optimal:', optimal)
print('cost function:', cost_function(optimal, X, Y)[0][0])

  • 线性结果绘制:
# 根据数据画出对应的图像
def plot(X, Y, theta):ax = plt.subplot(111)  # 将画布分为1行1列,取第一个ax.scatter(X, Y, s=30, c="red", marker="s")plt.xlabel("X")plt.ylabel("Y")x = arange(0, 21, 0.2)  # x的范围y = theta[0] + theta[1]*xax.plot(x, y)plt.show()plot(X1, Y, optimal)

  • 再与最小二乘法的结果相比,其差值是及其小的,最小二乘法是直接调用 sklearn 中 linear_model.LinearR egression() 函数来进行求解的,相对于梯度下降的方法来说,会更加快计算出结果。通过这个方法,还是比较好理解梯度下降的整个原理过程的实现。

三、总结

  • 梯度下降法需要不断地迭代多次,才能取到近视值,找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。 所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。

四、参考资料

[1] 梯度下降法——极值,线性回归,近似根问题
[2] 梯度下降算法原理讲解——机器学习

Excel 和 python 使用梯度下降法分别求【极小值点】【线性回归问题】相关推荐

  1. Excel和Python实现梯度下降法

    文章目录 一.梯度下降法是什么 二.概念理解 1. 微分理解 2. 梯度理解 3. 梯度下降法的数学解释 三.梯度下降法手工求解 四.Excel演示梯度下降法的数据变化 五.Python 编程实现 六 ...

  2. 基于python实现梯度下降法(GD)在线性回归中的应用(Boston房价预测数据集)

    [环境准备] 用到的包主要有两个:numpy和sklearn,都是机器学习常用的库. [数据集介绍] 波士顿房价数据集(Boston House Price Dataset) 使用sklearn.da ...

  3. python实现梯度下降法_梯度下降法及其Python实现

    作者:糖甜甜甜 经管人也可以学Python. 个人公众号: 经管人学数据分析 基本介绍 梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解无约束最 ...

  4. Python实现多元线性回归方程梯度下降法与求函数极值

    梯度下降法 梯度下降法的基本思想可以类比为一个下山的过程. 假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷).但此时山上的浓雾很大,导致可视度很低:因此,下山的路径就无 ...

  5. python sklearn 梯度下降法_(四)梯度下降法及其python实现

    梯度 梯度,什么是梯度?梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模). 在微积分里面,对多元函 ...

  6. Python随机梯度下降法(四)【完结篇】

    有了前面知识的铺垫,现在来做一个总结,利用随机梯度下降法来实现MNIST数据集的手写识别,关于MNIST的详细介绍,可以参考我的前面两篇文章 MNIST数据集手写数字识别(一),MNIST数据集手写数 ...

  7. Python随机梯度下降法(三)

    对梯度熟悉之后,我们寻找函数的最小值(或者尽可能小的值)的位置的过程中,都是以梯度做线索,这个就是上一篇说的梯度所具备的特点决定的.         梯度法:通过不断地沿着梯度方向前进,逐渐减小函数值 ...

  8. Python随机梯度下降法(二)

    既然是梯度下降法,那么梯度就显得很关键了,首先了解梯度的概念:全部变量的偏导数汇总而成的向量.其中偏导数就是说存在两个或两个以上变量的函数,这个时候需要指定求某个变量的导数,其余的变量看成是常量就好, ...

  9. python实现梯度下降法

    文章目录 梯度下降法 梯度定义 梯度下降法思路 梯度下降法的简单应用 梯度下降法求二维曲线的最小值 梯度下降法求三维曲面的最小值 代码附录 梯度下降法 梯度定义 梯度的本意是一个向量(矢量),表示某一 ...

最新文章

  1. python 第六章 函数
  2. C语言SQLite3基本操作Demo
  3. 使用Azure应用服务本地验证安卓脸书
  4. java五子棋代码详解_代码详解:Java和Valohai的深度学习之旅
  5. 机器学习(三)k均值聚类
  6. Java中List, Integer[], int[]的相互转换
  7. rpm软件包管理的详细解读
  8. mysql悲观锁隔离级别_mysql隔离级别与悲观锁、乐观锁
  9. 关于mysql数据库在输入password后,滴的一声直接退出界面的解决的方法(具体办法)...
  10. sqluldr2用法
  11. log4j日志级别小结
  12. Linux ftp ldap认证,vsftpd+ldap认证
  13. 禁用win10触摸屏手势_怎么修改win10 触控板手势设置
  14. Linux df 命令使用详解
  15. 细菌感染和抗生素使用
  16. EditPlus代码补全设置
  17. python接入支付宝 40004 invalid-signature 错误原因: 验签出错
  18. excel高级筛选怎么用_Excel表格自动筛选的9个高级用法
  19. CMakeLists.txt文件常见编译错误
  20. 顺序表的时间复杂度分析

热门文章

  1. Salesforce收购Slack背后的原因,你知道多少?
  2. 第三方数据源大型库| CnOpenData全球专利及引用被引用数据
  3. memcpy、memmove、memcmp、memset函数的使用说明和模拟实现
  4. MMDet踩坑与使用体会
  5. PotPlayer播放DST音频的mkv电影解码错误
  6. 关于嵌入式编程的思考
  7. RMQ倍增,附赠有趣小故事一发
  8. 两点之间的最短距离是?
  9. 《网络攻防》Web基础
  10. 从0到1400star,从阮一峰周刊到尤雨溪推荐,小透明开源项目的2021年总结