python语言原理_梯度下降算法的原理用Python语言实现,易于理解,python,更
梯度下降
要找到某个函数的最小值,就是沿着该函数的梯度的负方向寻找。若寻找某函数最大值,则沿着梯度方向找。
那么梯度下降数学表示:
:步长或叫学习率,
:是函数关于w的导数
梯度上升数学表示:
上述某函数可以理解成最小二乘问题(线性回归和非线性)的损失函数,均方误差损失表示为:
对于凸函数可以使用最小二乘法求解最优点,过程是求关于w的导数,使导数等于0即可
对于梯度下降法则需要迭代N次,每次将wi带入上式中求得wi值下的导数,然后求得wi+1的值
看图理解
上图是梯度下降求解过程,假设求解一个线性回归问题,目标函数是均方误差最小,数学公式表示为:
用矩阵表示为:
,其中X已知,y已知,w是求要的参数,圆心视为最优点也是误差最小点,那么对w求导
则梯度的负方向寻找最小点,p0是开始位置,w0可以使初始值1的矩阵,则将w0带入导数方程求得w0导数,那么根据梯度下降法
,根据此方法一直迭代的圆心点附近,求得的wi使得均方误差最小。
实例
首先生成随机样本:
x = np.arange(0, 100, 1)
y = x * 11.8 - np.random.standard_normal(100) * 100
使用梯度下降法求解结果如下图
第一张图表示样本分布,第二张(右上)表示使用梯度下降法求解拟合直线,第三张(左下)表示随着迭代次数增加模型损失逐渐下降直至平稳,第四张图表示参数的学习效果,随着迭代次数增加参数学习逐渐稳定。
迭代 1 损失:18659840.76439424,weight参数:[[1.0539232487566108, 4.578364388994817]]
迭代 2 损失:9004152.836684883,weight参数:[[1.0901282014628215, 6.981505910781841]]
迭代 3 损失:4649307.430631565,weight参数:[[1.1144339831409158, 8.5953966993742]]
迭代 4 损失:2685213.4523903765,weight参数:[[1.13074857483731, 9.679246133912951]]
迭代 5 损失:1799380.5932514765,weight参数:[[1.1416964803735679, 10.407132849392006]]
迭代 6 损失:1399858.0328088128,weight参数:[[1.1490402518776508, 10.89596376971111]]
迭代 7 损失:1219667.972099556,weight参数:[[1.1539635759490037, 11.22425070567449]]
迭代 8 损失:1138399.8251730944,weight参数:[[1.157261387354931, 11.44472025576014]]
迭代 9 损失:1101746.7947403109,weight参数:[[1.1594675447067935, 11.59278230490871]]
迭代 10 损失:1085215.783217484,weight参数:[[1.1609405742996355, 11.692217259740454]]
迭代10轮,直线方程可以表达为y = 11.692217259740454* x +1.1609405742996355和样本生成方程即(y = x * 11.8 - np.random.standard_normal(100) * 100)比较接近了
python实现代码如下
# @Time : 2020/6/16 19:42
# @Author : 大太阳小白
# @Software: PyCharm
"""
通过程序理解如何使用梯度下降求解
1、首先程序定义一个样本集,用来代替真实数据的分布
2、计算模型误差,使用均方误差
3、利用均方误差求导,解出关于待定参数w的导数
4、目标函数是误差最小,则关于w的方程求w下降最快方向使目标函数下降最快
5、定义w初始位置,带入导数方程,求得关于初始位置w的导数
6、w根据w位置导数移动lamda倍步长,得到新的w1点,带入导数方程求w1导数,如此迭代
7、当满足一定迭代限制或是误差限制时停止迭代,求得w值
"""
import numpy as np
import matplotlib.pyplot as plt
def create_sample_set():
"""
生成样本数据集
:return:
"""
x = np.arange(0, 100, 1)
y = x * 11.8 - np.random.standard_normal(100) * 100
return x, y
def loss(weight, x, y):
"""
损失函数使用均方误差
:param weight:权重
:param x:
:param y:
:return:
"""
return (x * weight - y).T * (x * weight - y)
def gradient(weight, x, y):
"""
基于损失函数求关于w的导数
:param weight:
:param x:
:param y:
:return:
"""
return x.T * (x * weight - y)
def gradient_descent(x, y, max_iter=10, learning_rate=0.001):
"""
梯度下降求解
:param x:
:param y:
:param max_iter:
:param learning_rate:
:return:
"""
m, n = np.shape(x)
weight = np.mat(np.ones((n, 1)))
loss_arr = []
weight_arr = np.zeros((max_iter,n))
for i in range(max_iter):
g = gradient(weight, x, y)
weight = weight - learning_rate * g
error = loss(weight, x, y).T.tolist()[0][0]
loss_arr.append(error)
weight_arr[i, :] = weight.T
print("迭代 {} 损失:{},weight参数:{}".format(i + 1, error, weight.T.tolist()))
return weight,loss_arr,weight_arr
if __name__ == '__main__':
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
features, labels = create_sample_set()
X = np.ones((2, 100))
X[1] = np.mat(features)
X = X.T
Y = labels.reshape(100, 1)
weights,loss_array,weights_array = gradient_descent(X, Y, learning_rate=0.000001)
# 绘制曲线
fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax1.set_title("样本数据分布" )
ax1.scatter(features, labels)
ax2 = fig.add_subplot(2, 2, 2)
ax2.set_title("梯度下降拟合效果" )
ax2.scatter(features, labels)
ax2.plot(features, (X * weights).T.tolist()[0])
ax3 = fig.add_subplot(2, 2, 3)
ax3.set_title("随着迭代次数增加loss走势")
ax3.plot(range(len(loss_array)), loss_array)
ax4 = fig.add_subplot(2, 2, 4)
ax4.set_title("随着迭代数增加学习的参数逐渐稳定")
ax4.plot(np.array(weights_array))
plt.show()
模型使用的学习率很小,可以尝试加大学习率(会出现问题),这个时候可以考虑对样本数据进行标准化。
python语言原理_梯度下降算法的原理用Python语言实现,易于理解,python,更相关推荐
- 梯度下降算法动图_梯度下降算法原理及代码实现
1 概述 梯度下降(Gradient Descent)在机器学习中是很常用的算法,它不仅被用在了线性回归上,还被广泛应用于机器学习的众多领域,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小 ...
- 梯度下降算法_梯度下降算法的工作原理
↑ 点击蓝字 关注极市平台作者丨 磐怼怼来源丨深度学习与计算机视觉编辑丨极市平台 极市导读 梯度下降算法是工业中最常用的机器学习算法之一,但也是很多新手难以理解的算法之一.如果你刚刚接触机器学习,那么 ...
- 梯度下降算法_梯度下降算法原理及推导
今天我们就来介绍用来优化代价函数的梯度下降算法(gradient descent algorithm). 1 原理 那梯度下降究竟为何方神圣?我来用最通俗的语言来介绍下: 假设你站在华山之巅,你现在想 ...
- 梯度下降算法动图_梯度下降算法原理及推导
今天我们就来介绍用来优化代价函数的梯度下降算法(gradient descent algorithm). 1 原理 那梯度下降究竟为何方神圣?我来用最通俗的语言来介绍下: 假设你站在华山之巅,你现在想 ...
- 梯度下降算法_梯度下降算法(Gradient Descent)的原理和实现步骤
大部分的机器学习模型里有直接或者间接地使用了梯度下降的算法.虽然不同的梯度下降算法在具体的实现细节上会稍有不同,但是主要的思想是大致一样的.梯度下降并不会涉及到太多太复杂的数学知识,只要稍微了解过微积 ...
- 梯度下降算法以及随机梯度下降算法的原理及python代码
梯度下降算法 梯度下降,依照所给数据,判断函数,随机给一个初值w,之后通过不断更改,一步步接近原函数的方法.更改的过程也就是根据梯度不断修改w的过程. 以简单的一元函数为例 原始数据为 x_data ...
- loss下降auc下降_梯度下降算法 线性回归拟合(附Python/Matlab/Julia源代码)
梯度下降 梯度下降法的原理 梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法,是求解无约束优化问题最简单.最经典的方法之一. 梯度下降最典型的例子就是从 ...
- python原理_强化学习:原理与Python实现
强化学习:原理与Python实现 作者:肖智清 著 出版日期:2019年08月 文件大小:17.18M 支持设备: ¥60.00 适用客户端: 言商书局 iPad/iPhone客户端:下载 Andro ...
- python底层代码里面的参数_梯度下降算法讲解及python底层实现
梯度下降法思路就是,开始随机选择参数组合,计算代价函数,寻找到下一个能让代价函数下降最快的参数组合(对某一参数的偏导方向),然后不断重复这一过程,直到找到一个局部最小值.因为并没有计算过所有的参数组合 ...
最新文章
- 合肥师范学院计算机毕设选老师,计算机毕设被导师要求反复修改?
- JAVA基础代码分享--模拟人机猜拳系统
- 江湖救急,换对姿势比《颈椎病康复指南》更有效丨极客官舍
- Python文件修改的两种方式
- 26、ES中使用mget批量查询api(学习笔记,来自课程资料 + 自己整理)
- 浦银行面试总结(信息科技部)
- 描述一下JVM加载class文件的原理机制
- homebrew 安装 formula 的不同历史版本——以安装 node 为例
- 深入浅出Python机器学习2——基于Python语言的环境配置
- [JSON]2017年最新县及县以上行政区划代码
- python爬取微信运动_微信运动数据抓取(Python)
- 题15 Oracle临时表有几种?临时表和普通表主要区别是什么?
- 5道String面试题,能全答对的人不到10%!(附答案)
- java三三剩二五五剩三,大年三十彩灯悬,彩灯齐明光灿灿,三三数时能数尽,五五数时剩一盏,七七数时刚刚好,八八数时还缺三,...
- CCIE知识点总结——QoS
- 关于 Windows 设置tomcat开机自动启动
- 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
- Modbus 超时时间设置
- AjaxPro2 方法未定义,对象不支持此方法或属性,解决办法
- 怎么用c语言编写画图软件,大佬们,小菜鸟想问一问用vc编译器做简易画图软件...