【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)是一个折衷方法,每次在计算梯度时,选择小批量样本进行计算,既考虑了效率问题,又考虑了收敛问题。

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

相关文章
|
13天前
|
数据采集 JavaScript 前端开发
Pyppeteer实战:基于Python的无头浏览器控制新选择
本文详细讲解了如何使用 Pyppeteer 结合爬虫代理高效采集小红书热点推荐信息。通过设置代理 IP、Cookie 和自定义 User-Agent,突破目标网站的反爬机制,实现标题、内容和评论的数据提取。文章结合代码示例与技术关系图谱,清晰展示从数据采集到分析的全流程,为复杂网站的数据获取提供参考。读者可在此基础上优化异常处理、并发抓取等功能,提升爬虫性能。
|
15天前
|
机器学习/深度学习 存储 Kubernetes
【重磅发布】AllData数据中台核心功能:机器学习算法平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
26天前
|
缓存 安全 Android开发
Python实战:搭建短信转发器,实现验证码自动接收与处理
在移动互联网时代,短信验证码是重要的安全手段,但手动输入效率低且易出错。本文介绍如何用Python搭建短信转发器,实现验证码自动接收、识别与转发。通过ADB工具监听短信、正则表达式或ddddocr库提取验证码,并利用Flask框架转发数据。系统支持多设备运行,具备安全性与性能优化功能,适合自动化需求场景。未来可扩展更多功能,提升智能化水平。
102 1
|
1月前
PAI-Rec推荐平台对于实时特征有三个层次
PAI-Rec推荐平台针对实时特征有三个处理层次:1) 离线模拟反推历史请求时刻的实时特征;2) FeatureStore记录增量更新的实时特征,模型特征导出样本准确性达99%;3) 通过callback回调接口记录请求时刻的特征。各层次确保了实时特征的准确性和时效性。
53 0
|
1月前
|
数据采集 XML 存储
Python爬虫实战:一键采集电商数据,掌握市场动态!
这个爬虫还挺实用,不光能爬电商数据,改改解析规则,啥数据都能爬。写爬虫最重要的是要有耐心,遇到问题别着急,慢慢调试就成。代码写好了,运行起来那叫一个爽,分分钟几千条数据到手。
|
Python
【Python数据科学手册】专题:线性回归
线性回归模型是解决回归任务的好起点。 你可能对线性回归模型最简单的形式(即对数据拟合一条直线)已经很熟悉了,不过经过扩展,这些模型可以对更复杂的数据行为进行建模。
970 0
|
机器学习/深度学习 Python
Python 数据科学手册 5.6 线性回归
5.6 线性回归 原文:In Depth: Linear Regression 译者:飞龙 协议:CC BY-NC-SA 4.0 译文没有得到原作者授权,不保证与原文的意思严格一致。
1049 0
|
22天前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
81 28
|
1月前
|
Python
[oeasy]python074_ai辅助编程_水果程序_fruits_apple_banana_加法_python之禅
本文回顾了从模块导入变量和函数的方法,并通过一个求和程序实例,讲解了Python中输入处理、类型转换及异常处理的应用。重点分析了“明了胜于晦涩”(Explicit is better than implicit)的Python之禅理念,强调代码应清晰明确。最后总结了加法运算程序的实现过程,并预告后续内容将深入探讨变量类型的隐式与显式问题。附有相关资源链接供进一步学习。
38 4
|
1月前
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

热门文章

最新文章