jupyter使用Python编程----使用梯度下降法求多元函数的极值和系数并与最小二乘法进行比较

本文介绍了梯度下降法的基本原理和概念,详细阐述了如何使用梯度下降法求解多元函数的极值和系数,并与最小二乘法进行了比较。通过Python实现,发现最小二乘法在求解系数时更准确,而梯度下降法在求解极值时表现良好。
摘要由CSDN通过智能技术生成

梯度下降法的原理和概念

偏导数:就是对函数的两个未知数求微分
然后得到的函数
例如一个函数为y=x12+x22+2x1x2
d(y)/d(x1)=2x1+2x2
d(y)/d(x2)=2x2+2x1
学习率:
也称为迭代的步长,优化函数的梯度是不断变化的,有时候变化很大,有时候变化很小,所以需要将每次的梯度变化控制在一个合适的范围内。
梯度:
梯度其实就是函数的变化率,在多元函数中,梯度变为了向量,有了变化的方向。
梯度的方向表示的是函数增加最快的方向。
梯度下降法求解,首先就要求得所给定函数的偏导数,即y对x1和x2的微分函数,规定学习率,给定一组初始值,然后计算梯度函数,使用迭代公式更新迭代一次后的函数未知数的值,然后计算出迭代后的梯度函数,将原梯度函数的值与迭代后的梯度函数的值的差值进行判断,判断差值是否收敛,若收敛,就停止算法,否则,就重复之前的迭代。

梯度下降法求解多元函数的极值

1、首先导入需要的库并设置字符集

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

# 设置字符集,防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False

2、对函数用MATLAB进行显示

#定义要求极值的函数表达式
def f2(x1,x2):

    return x1**2+2*x2**2-4*x1-2*x1*x2

X1 = np.arange(0,5,0.1)
X2 = np.arange(0,5,0.1)

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 
%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()

显示为:
在这里插入图片描述
3、用梯度下降法求解函数极值,要求对应x1和x2的偏导数

#函数
def f2(x, y):
    return x**2+2*y**2-4*x-2*x*y  

## 求两个未知数对于函数的偏导数
def hx1(x, y):
    return 2*x-2*y-4
def hx2(x, y):
    return -2*x+4*y

4、定义初值和学习率,然后运用数组保存梯度下降后所经过的点

#学习率
alpha = 0.1
#保存梯度下降经过的点
GD_X1 = []
GD_X2 = []
GD_Y = []
GD_X1.append(x1)
GD_X2.append(x2)
GD_Y.append(f2(x1,x2))
# 定义y的变化量和迭代次数
y_change = 0-f2(x1,x2)
iter_num = 0

5、判断前后两次迭代的y值的差值,如果很小表明函数已经收敛了,就可以得出最后的极小值了,然后用MATLAB显示出所经过的点,我的图上经过的点在背面有点儿看不清晰

while(y_change > 1e-10) :
    tmp_x1 = x1 - alpha * hx1(x1,x2)
    tmp_x2 = x2 - alpha * hx2(x1,x2)
    tmp_y = f2(tmp_x1,tmp_x2)
    y_change =f2(x1,x2)-tmp_y
    x1 = tmp_x1
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值