【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)

简介: 【Python机器学习】梯度下降法的讲解和求解方程、线性回归实战(Tensorflow、MindSpore平台 附源码)

需要全部源码请点赞关注收藏后评论区留言私信~~~

基本思想

迭代关系式是迭代法应用时的关键问题,而梯度下降(Gradient Descent)法正是用梯度来建立迭代关系式的迭代法。 机器学习模型的求解一般可以表示为:

其中,f(x)为机器学习模型的损失函数。

也称为无约束最优化模型。

对于无约束最优化问题argmin┬xf(x),其梯度下降法求解的迭代关系式为:

式中,x为多维向量,记为x=(x^(1),x^(2),…,x^(n));α为正实数,称为步长,也称为学习率;df(x)/dx=(■8(■8(∂f(x)/∂x^(1)&∂f(x)/∂x^(2))&■8(⋯&∂f(x)/∂x^(n))))是f(x)的梯度函数。

梯度下降法的几个问题:

1)梯度下降法的结束条件,一般采用:①迭代次数达到了最大设定;②损失函数降低幅度低于设定的阈

2)关于步长α,过大时,初期下降的速度很快,但有可能越过最低点,如果“洼地”够大,会再折回并反复振荡。如果步长过小,则收敛的速度会很慢。因此,可以采取先大后小的策略调整步长,具体大小的调节可根据f(x)降低的幅度或者x前进的幅度进行。

3)关于特征归一化问题,梯度下降法应用于机器学习模型求解时,对特征的取值范围也是敏感的,当不同的特征值取值范围不一样时,相同的步长会导致尺度小的特征前进比较慢,从而走之字型路线,影响迭代的速度,甚至不收敛。

梯度下降法解方程

梯度下降法求解方程示例:为了迭代到取值为0的点,可采取对原函数取绝对值或者求平方作为损失函数。

在MindSpore中,通过mindspore.ops.GradOperation提供对任意函数式自动求导的支持。

在TensorFlow2中,通过GradientTape提供对自动微分的支持,它记录了求微分的过程,为后续自动计算导数奠定了基础。

部分代码如下

### 求方程的根
class loss_func(ms.nn.Cell): # 用方程的平方作为求导目标函数
    def __init__(self):
        super(loss_func, self).__init__()
        self.mspow = ms.ops.Pow()       
    def construct(self, x):
        y = self.mspow(x, 3.0) + self.mspow(math.e, x)/2.0 + 5.0*x - 6
        y = self.mspow(y, 2) # 方程的输出的平方
        return y
x = ms.Tensor([0.0], dtype=ms.float32)
for i in range(200): # 200次迭代
    grad = GradNetWrtX(loss_func())(x)
    #print(grad)
    x = x - 2.0 * alpha * grad # 步长加大一倍
    print(str(i)+":"+str(x))
import tensorflow as tf
x = tf.constant(1.0)
with tf.GradientTape() as g:
    g.watch(x)
    y = x**3 + (math.e**x)/2.0 + 5.0*x - 6
dy_dx = g.gradient(y, x)
print(dy_dx)
>>> tf.Tensor(9.35914, shape=(), dtype=float32)
x = tf.constant(0.0)
for i in range(200):
    with tf.GradientTape() as g:
        g.watch(x)
        loss = tf.pow(f(x), 2)
    grad = g.gradient(loss, x)
    x = x – 2.0 * alpha * grad
    print(str(i)+":"+str(x))

梯度下降法解线性回归问题

线性回归问题中m个样本的损失函数表示为:

回归系数的更新过程如下:

 

50000次迭代后效果如下

部分代码如下

alpha = 0.00025
class loss_func2(ms.nn.Cell):
    def __init__(self):
        super(loss_func2, self).__init__()
        self.transpose = ms.ops.Transpose()
        self.matmul = ms.ops.MatMul()
    def construct(self, W, X, y):
        k = y - self.matmul(X, W)
        return self.matmul(self.transpose(k, (1,0)), k) / 2.0
class GradNetWrtW(ms.nn.Cell):
    def __init__(self, net):
        super(GradNetWrtW, self).__init__()
        self.net = net
        self.grad_op = ms.ops.GradOperation()
    def construct(self, W, X, y):
        gradient_func = self.grad_op(self.net)
        return gradient_func(W, X, y)
X = ms.Tensor((np.mat([[1,1,1,1,1,1], temperatures])).T, dtype=ms.float32)
y = ms.Tensor((np.mat(flowers)).T, dtype=ms.float32)
W = ms.Tensor([[0.0],[0.0]], dtype=ms.float32)
for i in range(50000):
    grad = GradNetWrtW(loss_func2())(W, X, y)
    #print(grad)
    W = W - alpha * grad
    print(i,'--->', '\tW:', W)
alpha = 0.00025
X = tf.constant( (np.mat([[1,1,1,1,1,1], temperatures])).T, shape=[6, 2], dtype=tf.float32)
y = tf.constant( (np.mat(flowers)), shape=[6, 1], dtype=tf.float32)
def linear_mode(X, W):
    return tf.matmul(X, W)
W = tf.ones([2,1], dtype=tf.float32)
for i in range(50000):
    with tf.GradientTape() as g:
        g.watch(W)
        loss = tf.reduce_sum( tf.pow(linear_mode(X, W) - y, 2) ) /2.0
    grad = g.gradient(loss, W)
    #print(grad)
    W = W - alpha * grad
    print(i,'--->', '\tW:', W)#, '\t\tloss:', loss)

随机梯度下降和批梯度下降

从梯度下降算法的处理过程,可知梯度下降法在每次计算梯度时,都涉及全部样本。在样本数量特别大时,算法的效率会很低。

随机梯度下降法(Stochastic Gradient Descent,SGD),试图改正这个问题,它不是通过计算全部样本来得到梯度,而是随机选择一个样本来计算梯度。随机梯度下降法不需要计算大量的数据,所以速度快,但得到的并不是真正的梯度,可能会造成不收敛的问题。

批梯度下降法(Batch Gradient Descent,BGD)是一个折衷方法,每次在计算梯度时,选择小批量样本进行计算,既考虑了效率问题,又考虑了收敛问题。

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
2天前
|
调度 开发者 UED
探索Python中的异步编程:从基础到实战
【9月更文挑战第30天】在编程的世界里,异步编程是一个强大的概念,它允许程序在等待某些操作完成时继续执行其他任务。本文将深入探讨Python中的异步编程,从理解其基本概念开始,逐步过渡到高级应用。我们将通过具体的代码示例来展示如何在实际项目中实现异步功能,从而提高应用程序的性能和响应性。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
|
6天前
|
数据采集 人工智能 程序员
探索Python编程:从基础到实战
【9月更文挑战第27天】在这篇文章中,我们将一起踏上一段激动人心的Python编程之旅。无论你是初学者还是有一定经验的开发者,这里都有适合你的内容。文章将通过浅显易懂的语言带你了解Python的基础语法,并通过实际案例展示如何将这些知识应用于解决现实问题。准备好,我们即将启程!
|
7天前
|
存储 人工智能 数据挖掘
Python编程入门:从基础到实战
【9月更文挑战第26天】 在这篇文章中,我们将一起探索Python编程的奇妙世界。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从Python的基本语法开始,然后逐步深入到更复杂的主题,如函数、类和模块。最后,我们将通过一个实际的项目来应用我们所学的知识。让我们一起开始这段Python编程之旅吧!
|
7天前
|
数据采集 人工智能 数据挖掘
Python编程入门:从基础到实战的快速指南
【9月更文挑战第25天】本文旨在为初学者提供一个简明扼要的Python编程入门指南。通过介绍Python的基本概念、语法规则以及实际案例分析,帮助读者迅速掌握Python编程的核心技能。文章将避免使用复杂的专业术语,而是采用通俗易懂的语言和直观的例子来阐述概念,确保内容的可读性和实用性。
|
6天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
21 2
|
4月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
163 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
4月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
56 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
15天前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
38 0
|
23天前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
42 0
|
2月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
44 0
下一篇
无影云桌面