认识

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模), 我感觉, 其实就是偏导数向量方向呗, 沿着这个向量方向可以找到局部的极值.

from random import random

def gradient_down(func, part_df_func, var_num, rate=0.1, max_iter=10000, tolerance=1e-10):
"""
不依赖第三库实现梯度下降
:param func: 损失(误差)函数
:param part_df_func: 损失函数的偏导数向量
:param var_num: 变量个数
:param rate: 学习率(参数的每次变化的幅度)
:param max_iter: 最大计算次数
:param tolerance: 误差的精度
:return: theta, y_current: 权重参数值列表, 损失函数最小值
""" theta = [random() for _ in range(var_num)] # 随机给定参数的初始值
y_current = func(*theta) # 参数解包 for i in range(max_iter):
# 计算当前参数的梯度(偏导数导数向量值)
gradient = [f(*theta) for f in part_df_func]
# 根据梯度更新参数 theta
for j in range(var_num): theta[j] -= gradient[j] * rate # [0.3, 0.6, 0.7] ==> [0.3-0.3*lr, 0.6-0.6*lr, 0.7-0.7*lr] y_current, y_predict = func(*theta), y_current
print(f"正在进行第{i}次迭代, 误差精度为{abs(y_predict - y_current)}") if abs(y_predict - y_current) < tolerance: # 判断是否收敛, (误差值的精度) print(); print(f"ok, 在第{i}次迭代, 收敛到可以了哦!") return theta, y_current def f(x, y):
"""原函数"""
return (x + y - 3) ** 2 + (x + 2 * y - 5) ** 2 + 2 def df_dx(x, y):
"""对x求偏导数"""
return 2 * (x + y - 3) + 2 * (x + 2 * y - 5) def df_dy(x, y):
"""对y求偏导数, 注意求导的链式法则哦"""
return 2 * (x + y - 3) + 2 * (x + 2 * y - 5) * 2 def main():
"""主函数"""
print("用梯度下降的方式求解函数的最小值哦:")
theta, f_theta = gradient_down(f, [df_dx, df_dy], var_num=2) theta, f_theta = [round(i, 3) for i in theta], round(f_theta, 3) # 保留3位小数 print("该函数最优解是: 当theta取:{}时,f(theta)取到最小值:{}".format(theta, f_theta)) if __name__ == '__main__':
main()
...
...
正在进行第248次迭代, 误差精度为1.6640999689343516e-10
正在进行第249次迭代, 误差精度为1.5684031851037616e-10
正在进行第250次迭代, 误差精度为1.478208666583214e-10
正在进行第251次迭代, 误差精度为1.3931966691416164e-10
正在进行第252次迭代, 误差精度为1.3130829756846651e-10
正在进行第253次迭代, 误差精度为1.2375700464417605e-10
正在进行第254次迭代, 误差精度为1.166395868779091e-10
正在进行第255次迭代, 误差精度为1.0993206345233375e-10
正在进行第256次迭代, 误差精度为1.0361000946090826e-10
正在进行第257次迭代, 误差精度为9.765166453234997e-11 ok, 在第257次迭代, 收敛到可以了哦!
该函数最优解是: 当theta取:[1.0, 2.0]时,f(theta)取到最小值:2.0
[Finished in 0.0s]

不依赖Python第三方库实现梯度下降的更多相关文章

  1. 【Python基础】安装python第三方库

    pip命令行安装(推荐) 打开cmd命令行 安装需要的第三方库如:pip install numpy 在安装python的相关模块和库时,我们一般使用“pip install  模块名”或者“pyth ...

  2. Python第三方库资源

    [转载]Python第三方库资源   转自:https://weibo.com/ttarticle/p/show?id=2309404129469920071093 参考:https://github ...

  3. 常用Python第三方库 简介

    如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面,这里有6000多个第三方库的介绍:点这里或者访 ...

  4. PyCharm 如何安装python第三方库及插件

    一.如何安装python第三方库: 1.有一个专门可下载安装第三方库的网址: http://www.lfd.uci.edu/~gohlke/pythonlibs/ Ctrl+f 搜索要下载的第三方库, ...

  5. [爬虫]Windows下如何安装python第三方库lxml

    lxml是个非常有用的python库,它可以灵活高效地解析xml与BeautifulSoup.requests结合,是编写爬虫的标准姿势. 但是,当lxml遇上Windows,简直是个巨坑.掉在安装陷 ...

  6. python第三方库自动安装脚本

    #python第三方库自动安装脚本,需要在cmd中运行此脚本#BatchInstall.pyimport oslibs = {"numpy","matplotlib&qu ...

  7. python第三方库requests简单介绍

    一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...

  8. Python第三方库官网

    Python第三方库官网 https://pypi.python.org/pypi 包下载后的处理: 下载后放到Python的scripts文件夹中(D:\Python3.5\Scripts),用cm ...

  9. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

随机推荐

  1. ROS2 在WIN10下测试和安装

    博客参考:https://blog.csdn.net/cocoiehl/article/details/83351307 和 https://blog.csdn.net/weixin_38294178 ...

  2. SVM – 核函数

    核函数的起源是对于线性不可分的分类情况,其实可以通过p次方多项式,及非线性模型进行分类:然后对于这类非线性多次方的,其实可以按照广义线性模型来进行升维变形,使之成为线性模型,这样就可以放到SVM中来进 ...

  3. AngularJS 常见面试问题

    ng-if 跟 ng-show/hide 的区别有哪些? 第一点区别是,ng-if 在后面表达式为 true 的时候才创建这个 dom 节点,ng-show 是初始时就创建了,用 display:bl ...

  4. Ubuntu下局域网快速分享文件

    本地主机名:zhang 本地环境:Ubuntu 18.04.3 工作中经常需要在多个机器上互传文件,本文分享一种便捷的方法,仅供应急使用. 利用了mdns和python3内置的httpServer.( ...

  5. python入门之格式化输出

    目录 扩展: 保留几位小数 一.占位符格式化输出 1.1 %s 1.2 %d 二..format()方式 三.f-string 扩展: 保留几位小数 保留两位小数 a = 12345.2487 pri ...

  6. turtle1

    #画风车 from turtle import * pensize(2) for i in range(4): seth(360-i*90) fd(150) rt(90) circle(-150,45 ...

  7. 洛谷P1434滑雪讲解

    题源:[戳这里] 洛谷博客链接:[戳这里] 我觉得这道题主要方法应该有两种: 动态规划 搜索 下面会分别对这两种方法进行简述 一,动态规划法首先的想法是用L(i,j)表示从点(i,j)出发能到达的最长 ...

  8. IDEA中MavenWeb项目没有新建servlet文件

    解决方案: https://blog.csdn.net/Delicious_Life/article/details/89515363

  9. Python学习之路:通过分片的方式修改列表的技巧(拓展知识)

    一.为列表添加值 用分片的方式可以在列表的头部和尾部添加值 1.在列表的头部添加值 x = [1, 2, 3] #创建列表x x[:0] = [0] #用分片的方式在列表头部添加值 print(x) ...

  10. C++中STL中简单的Vector的实现

    该vector只能容纳标准库中string类, 直接上代码了,StrVec.h文件内容为: #ifndef STRVEC_H #define STRVEC_H #include<iostream ...