机器学习数学基础之梯度下降

一、概念理解

  1. 梯度下降法
    梯度下降法(Gradient Descent,GD)是一种常用的求解无约束最优化问题的方法,在最优化、统计学以及机器学习等领域有着广泛的应用。

  2. 微分
    微分在数学中的定义:由函数B=f(A),得到A、B两个数集,在A中当dx靠近自己时,函数在dx处的极限叫作函数在dx处的微分。

  3. 梯度
    梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

更多知识点让百度百科为您解答

二、梯度下降法求解问题

1.梯度下降法手工求解

在这里插入图片描述

设初始值a₁=(x1,x2)=(3,2),学习率为η
因此初始点的梯度为▽f(a₁)=(⅓ x 3,½ x 2)=(2,2)
f(a₂)=f(a₁-η▽f(a₁))=10/3η²-8η+5
则当η°=6/5时,函数有极小值
所以 ,a₂=a₁-η°=(3/5,-2/5)
接下来以a₂为初始点,重复迭代即可求解。

2.在Excel里用梯度下降法求解方程的近似根

求解函数的近似根:
  z =   2 ( x − 1 ) 2 + y 2   \ z= \ 2(x-1)^{2}+y^{2}\,  z= 2(x1)2+y2

  1. 设置表格
    如下图前四行
  2. 输入公式
    在第五行输入公式。设x,y的初始值为3,2
    其中a=∂z/∂x=4*(x-1)=4*(B5-1)
    b=∂z/∂y=2y=2*C5
    ∆x=ηa
    ∆y=ηb
    第六行的x和y列输入公式:
    x=B5-0.1D5
    y=C5-0.1
    E5
    在这里插入图片描述
  3. 多次迭代,得到最小值
    在这里插入图片描述
    可以看到当x=1,y=0时,取得近似根0
3.用梯度下降法求解线性回归

求店铺面积与营业额问题:
在Excel中建立下表
在这里插入图片描述
①梯度下降法
python代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
%matplotlib inline

data=np.genfromtxt('E:\ljzy\ai-3\dpyye1.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=0
    for i in range(0,len(x_data)):#定义一共有多少样本点
        totalerror=totalerror+(y_data[i]-(theta1*x_data[i,0]+theta2*x_data[i,1]+theta0))**2
    return 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=0
        theta1_grad=0
        theta2_grad=0
        for 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_grad
        theta1=theta1-lr*theta1_grad
        theta2=theta2-lr*theta2_grad
    return 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()

结果图:
在这里插入图片描述

②用最小二乘法求解上述问题

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('E:\dpyye.xlsx')
print("X1=",model.coef_[0])
print("X2=",model.coef_[1])
print("截距为=",model.intercept_)

输出结果
在这里插入图片描述

print("多元线性回归方程为:y=",model.coef_[0],"X1",model.coef_[1],"X2+",model.intercept_)

sns.pairplot(data, x_vars=['X1','X2'], y_vars='Y', height=3, aspect=0.8, kind='reg')  
plt.show() 

在这里插入图片描述

三、小结

错误总是有。
人工智能学习之梯度下降法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值