梯度下降与矩阵分解

2023-05-16

1.梯度下降

    梯度下降属于迭代法的一种,所谓迭代法就是不断用变量的旧值得到新值的方法。在求解损失函数最小值的时候,可以通过梯度下降法来一步步迭代求出最小化的损失函数和模型参数值。

    梯度:

              对于一元函数来说,梯度就是该函数的导数。即▽f(x)=f'(x)

              对于多元函数来说,梯度就是对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来。比如函数f(x,y),分别对x,y求偏导数,得到的的梯度就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。

    在求极小值的时候,要向负梯度方向求最小值,以下图为例:

默认向上为y轴正方向,向右为x轴正方向

    在A点求最小值时要向梯度反方向,在B点求最小值时也是如此,梯度是在该点的导数。

   求解过程:

      1.设出两个较小的正数s,b       s代表步长,b代表非常小的常数阈值;

      2.求当前位置的偏导数:

       ▽f(x)=f'(x);▽f(x,y)=(∂f/∂x, ∂f/∂y)T          (x=0....n)

      3.修改函数的参数值:

        X1=x-s*▽

       参数值为函数的梯度与步长的乘积的绝对值。

       4.如果修改后的参数值小于b,则此时的参数值就是求得最小值;否则回到步骤2,此时x=x-X0。

    一般情况下,梯度向量为0的时候就是一个极值点,此时梯度的幅值也为0。梯度下降算法迭代结束的条件是幅值接近0,故刚开始可以设置一个较小的阈值。

例:出发点设为-4利用梯度下降法求函数y=x*x-x的极小值

                         

def f(x):
    return 2*x-1
x=-4
s=0.9
b=0.01
while True:
    x1=f(x)*s
    if x1<0:
        x1=-x1
        x=x+x1
    else:
        x=x-x1
    if x1<b:
        break
    print(x)
print("函数最小值",x*x-x)

 运行结果:

4.1
-2.38
2.8040000000000003
-1.3432000000000004
1.9745600000000003
-0.6796480000000003
1.4437184000000003
-0.2549747200000003
1.1039797760000003
0.01681617919999967
0.8865470566400003
0.19076235468799974
0.7473901162496003
0.3020879070003198
0.6583296743997442
0.37333626048020463
0.6013309916158363
0.418935206707331
0.5648518346341352
0.44811853229269183
0.5415051741658465
0.46679586066732276
0.5265633114661418
0.4787493508270866
0.5170005193383307
0.48639958452933546
0.5108803323765316
0.4912957340987747
0.5069634127209802
0.49442926982321583
0.5044565841414274
函数最小值 -0.24998728886898583

2.矩阵分解:

      矩阵分解就是把一个矩阵近似变成若干个小矩阵相乘的形式。个人感觉矩阵分解就是预测一些矩阵中没有的元素。

      应用矩阵分解思想解决评分矩阵中没有打分的元素,这种思想可以看做是有监督的机器学习。

      矩阵R可以近似表示为P与Q的乘积:R(m,n)≈ P(m,K)*Q(K,n)\widehat{}为什么要说是近似表示呢,因为矩阵R中并不是所有的元素都有值,而分解后的矩阵P和Q是都有元素值的。K值是通过交叉验证法获得的最佳的值。,为了得到近似的R(m,n),必须求出矩阵P和Q,如何求出这两个矩阵是关键问题。

      随机生成矩阵P和Q

      然后使用原始的评分矩阵与重新构建的评分矩阵之间的误差的平方作为损失函数,即:

      如果R(i,j)已知,则R(i,j)的误差平方和为:

              最终,需要求解所有的非“-”项的损失之和的最小值:

      之后使用梯度下降法获得修正的p和q分量:

  •         求解损失函数的负梯度:

     

 

  •        根据负梯度的方向更新变量:

     

 

       最后不停迭代直到算法最终收敛(直到sum(e^2) <=阈值)

import matplotlib.pyplot as plt
from math import pow
import numpy
def matrix_factorization(R,P,Q,K,steps=5000,alpha=0.0002,beta=0.02):
    Q=Q.T  # .T操作表示矩阵的转置
    result=[]
    for step in range(steps):
        for i in range(len(R)):
            for j in range(len(R[i])):
                if R[i][j]>0:
                    eij=R[i][j]-numpy.dot(P[i,:],Q[:,j]) # .dot(P,Q) 表示矩阵内积
                    for k in range(K):
                        P[i][k]=P[i][k]+alpha*(2*eij*Q[k][j]-beta*P[i][k])
                        Q[k][j]=Q[k][j]+alpha*(2*eij*P[i][k]-beta*Q[k][j])
        eR=numpy.dot(P,Q)
        e=0
        for i in range(len(R)):
            for j in range(len(R[i])):
                if R[i][j]>0:
                    e=e+pow(R[i][j]-numpy.dot(P[i,:],Q[:,j]),2)
                    for k in range(K):
                        e=e+(beta/2)*(pow(P[i][k],2)+pow(Q[k][j],2))
        result.append(e)
        if e<0.001:
            break
    return P,Q.T,result

if __name__ == '__main__':
    R=[
        [5,3,0,2],
        [4,0,0,1],
        [1,1,0,5],
        [1,0,1,4],
        [0,1,5,4]
    ]
    R=numpy.array(R)
    N=len(R)
    M=len(R[0])
    K=2

    P=numpy.random.rand(N,K) #随机生成一个 N行 K列的矩阵
    Q=numpy.random.rand(M,K) #随机生成一个 M行 K列的矩阵

    nP,nQ,result=matrix_factorization(R,P,Q,K)
    print("原始的评分矩阵R为:\n",R)
    R_MF=numpy.dot(nP,nQ.T)
    print("经过MF算法填充0处评分值后的评分矩阵R_MF为:\n",R_MF)

矩阵分解的方法和代码引用:https://www.cnblogs.com/shenxiaolin/p/8637794.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

梯度下降与矩阵分解 的相关文章

  • 最大矩形(题解)

    题意 xff1a 给一个直方图 xff0c 求直方图中的最大矩形的面积 例如 xff0c 下面这个图片中直方图的高度从左到右分别是2 1 4 5 1 3 3 他们的宽都是1 xff0c 其中最大的矩形是阴影部分 思路 xff1a 对于每个高
  • python 工厂方法模式原理与实现

    一 简介 工厂模式是属于创建型模式 xff0c 它提供了一种创建对象的最佳方式 在工厂模式中 xff0c 我们在创建对象的过程中不会向客户端暴露实现逻辑 xff0c 而是通过一个共同的接口类来指向新创建的对象 二 工厂方法模式的主要角色 抽
  • Python安装Jupyter Notebook配置使用教程

    原文见 xff1a https blog csdn net qq 27825451 article details 84427269 一 什么是jupyter 1 简介 xff1a jupyter notebook是一种 Web 应用 xf
  • 【Python学习】——实现文本的朗读(pyttsx3)

    import pyttsx3 engine pyttsx3 init engine say 三角形 engine runAndWait 1 导入第三方库 import pyttsx3 2 创建朗读器 engine pyttsx3 init
  • 啊啊啊啊啊,终于解决电脑hardlock.sys蓝屏问题啦,顺利下载modelsim软件

    最开始下载软件时 xff0c 电脑蓝屏 xff0c 以为是电脑储存空间不足 xff0c 换了1T固态硬盘之后 xff0c 问题还是没有解决 xff1b 从博客看经验贴 xff0c 需要进入安全模式后 xff0c 从别的笔记本电脑上复制har
  • 上课摸鱼必备 -- Vscode网页版的搭建教程

    上课摸鱼必备 Vscode网页版的搭建教程 文章目录 上课摸鱼必备 Vscode网页版的搭建教程前言 xff08 一 xff09 运行效果 xff08 二 xff09 基础配置1 下载code server到服务器上2 解压安装试运行 xf
  • 牛客练习赛50

    tokitsukaze and Connection 链接 xff1a https ac nowcoder com acm contest 12257 A 来源 xff1a 牛客网 题目描述 tokitsukaze有一个长度为n xff0c
  • ROS——创建工作空间和功能包并成功运行一个基本python文件

    文章目录 ROS文件系统的基本结构一 创建工作空间二 xff08 可选 xff09 创建功能包三 编写python代码四 调试运行代码正确运行Clion ROS文件系统的基本结构 x1f4c1 workspace xff08 ROS的工作空
  • 解决Server's certificate is not trusted

    要解决Server s certificate is not trusted 首先Ctrl 43 Alt 43 s找到settings单击进入 勾选
  • 解决:无法打开系统服务 提示“一个或多个Activex控件无法显示”

    问题 xff1a 电脑打开系统的服务时 xff0c 出现 一个或多个Activex 控件无法显示 的提示 xff0c 开始以为与IE设置有关 xff0c 试着在Internet 选项 gt 安全 xff0c 勾选了 允许ActiveX 控件
  • IDEA:yml不显示小绿叶图标

    IDEA xff1a yml不显示小绿叶图标 之前idea能识别yml文件 xff0c 后面再学习微服务时突然识别不了yml xff0c yml文件不显示小绿叶图标 xff0c yml文件中相关的提示功能也失效 xff0c 但以 yaml为
  • 安装Ubuntu时发现卡在一个地方点不动解决方法

    有很多小伙伴发现自己在VMware安装虚拟机时 xff0c 卡在一个页面不能点击 xff0c 拖动也不起作用 xff0c 一直卡在一个地方动不了 xff0c 真的气死人了 xff0c 总以为是电脑或者其他什么地方的问题 xff0c 移除然后
  • CSP 202112-5 极差路径12分暴力代码

    原题链接 xff1a CSP 202112 5 极差路径 span class token macro property span class token directive keyword include span span class
  • CCF-CSP 201809-3 元素选择器

    原题链接 xff1a CCF CSP 201809 3 元素选择器 参考题解 xff1a CCF201809 3 元素选择器 xff08 100分 xff09 文本处理 span class token macro property spa
  • CCP-CSP 201912-5 魔数 暴力25

    原题链接 xff1a CCP CSP 201912 5 魔数 线段树是写不来的 span class token macro property span class token directive hash span span class
  • CCP-CSP 201909-3 字符画 100

    原题链接 xff1a CCP CSP 201909 3 字符画 这道题我觉得难点主要是不会处理ASCII码的转换 xff0c 还有就是看不懂题 xff0c 其实逻辑不难 参考博客 xff1a CCF CSP 20190903 字符画 100
  • wsl 无法使用netstat

    zshrc
  • 速腾雷达16线实现FAST-LIO2算法建图

    速腾雷达16线实现FAST LIO2算法建图 一 配置激光雷达数据1 下载rsladir SDK包到catkin ws src下2 添加依赖3 配置参数 xff1a 4 编译测试5 将雷达格式转换为velodyne格式6 将转换格式嵌入到s
  • HuTool工具最全介绍

    简介 xff1a Hutool是一个小而全的Java工具类库 xff0c 通过静态方法封装 xff0c 降低相关API的学习成本 xff0c 提高工作效率 xff0c 使Java拥有函数式语言般的优雅 xff1b 提供了Java基础工具类

随机推荐

  • 【hnu暑学期】数据库系统设计 准备阶段

    说些什么 那年杏花微雨 xff0c 你说你是数据库 xff0c 或许一开始便都是错的 如果学弟学妹们可以在暑学期选课前看到这篇博文的话 快跑 xff01 快跑 xff01 快跑 xff01 本来是想着数据库比较水的 xff0c 可以随便混一
  • 古代有一个梵塔,塔内有 A、B、C 三个基座,A 座上有 64 个盘子,盘子大小不等,大的在下,小的在上

    古代有一个梵塔 xff0c 塔内有 A B C 三个基座 xff0c A 座上有 64 个盘子 xff0c 盘子大小不等 xff0c 大的在下 xff0c 小的在上 有人想把这 64 个盘子 从 A 座移到 C 座 xff0c 但每次只允许
  • 修改mysql 8.0密码

    1 首先说明 xff1a 正确的修改密码方式 xff1a span class token constant ALTER span span class token constant USER span span class token s
  • P1591 阶乘数码洛谷

    题目描述 求n 中某个数码出现的次数 输入格式 第一行为t 10 xff0c 表示数据组数 接下来t行 xff0c 每行一个正整数n 1000 和数码a 输出格式 对于每组数据 xff0c 输出一个整数 xff0c 表示n 中a出现的次数
  • 多神经网络轨迹跟随控制(MATLAB实现)

    多神经网络轨迹跟随控制 xff08 MATLAB实现 xff09 本文是我基于自己的理解实现的多神经轨迹跟随控制 xff0c 可能不太正确 xff0c 但仍记录下来 此题目当我刚看到的时候一头雾水 xff0c 经过看PPT和自己实践貌似搞出
  • turtlebot3 Slam建图和导航仿真

    turtlebot3 Slam建图和导航仿真 使用RViz仿真Turtlebot3 RViz简介 RViz是ROS的三维可视化工具 它的主要目的是以三维方式显示ROS消息 xff0c 可以将数据进行可视化表达 例如无需编程即可表达激光测距仪
  • 【MATLAB APPdesigner ui设计实现软件动态页面启动 】(启动无标题栏)

    MATLAB APPdesigner实现软件动态页面启动 xff08 启动无标题栏 xff09 前言实现实现动态界面启动隐藏动态界面启动的标题栏 前言 最近需要验收利用MATLAB所实现的控制系统 xff0c 为了更好的展示 xff0c 因
  • 激光雷达方程推导与激光器参数指标

    激光雷达方程推导与激光器参数指标 激光雷达方程推导多种目标类型下的激光雷达方程激光器的参数指标 激光雷达方程推导 设定目标与激光雷达的距离为 R R R xff0c 发射激光束的发散角为
  • mpc模型预测控制原理详解

    mpc模型预测控制原理详解 前言mpc算法步骤mpc算法推导 前言 本文是对mpc模型预测控制学习的记录 xff0c 主要参照了DR CAN老师的视频进行学习 视频专栏链接 xff1a DR CAN老师mpc视频专栏 在这篇博客中博主也针对
  • C++基础回顾(上)

    C 43 43 基础回顾 xff08 上 xff09 目录 C 43 43 基础回顾 xff08 上 xff09 前言关键字和标识符运算符数据类型函数类 前言 C 43 43 之前学过一点 xff0c 但是很长时间都没用过 xff0c 翻出
  • 自适应控制专栏目录及介绍

    目录 自适应控制专栏目录及介绍第一篇 xff1a 具有不确定参数系统的自适应跟踪控制设计 ADi hhh的博客 CSDN博客 https blog csdn net qq 45830323 article details 129713051
  • 【五一创作】Qt quick基础1(包含基本元素Text Image Rectangle的使用)

    Qt quick基础1 xff08 包含基本元素Text Image Rectangle的使用 xff09 目录 Qt quick基础1 xff08 包含基本元素Text Image Rectangle的使用 xff09 前言qt中有直接设
  • 网站使用微信登录接口,所踩的坑...

    一 如何开通微信公众号 微信开发平台 授权认证 接口权限申请等等 xff0c 这些不在本文描述 xff0c 请参考官方资料 二 假设已顺利完成第一步的工作 xff0c 现在需要在自己开发的网站 xff08 PC端 移动端 xff0c 注意两
  • Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)

    Qt quick基础2 xff08 包含平移旋转放缩以及qml控件大写开头啊 xff09 目录 Qt quick基础2 xff08 包含平移旋转放缩以及qml控件大写开头啊 xff09 前言简单的平移 旋转和放缩其他元素的一些基本使用qml
  • 虚幻引擎配置物体水面浮力的简便方法

    虚幻引擎配置物体水面浮力的简便方法 目录 虚幻引擎配置物体水面浮力的简便方法前言前期工作配置水面浮力针对一个立方体的水面浮力配置针对船3D模型的水面浮力配置 小结 前言 在使用虚幻引擎配置导入的3D模型时 xff0c 如何快速地将水面浮力配
  • 用栈实现回文字符串的判断

    用栈实现回文字符串的判断 栈是一种后进先出的数据结构 xff0c 它只能在一段进行插入和删除操作 例如一个字符串 34 12321 34 像这种 xff0c 无论正读反读均相同的字符序列 xff0c 就叫做回文字符串 首先 xff0c 我们
  • 安装diffuse 解决dpkg依赖问题

    安装diffuse报错 xff0c 缺少依赖 xff0c 安装地址 flynnsin 64 flynnsin Downloads span class token function sudo span dpkg span class tok
  • 软件工程整理

    软件工程总结 第一章1 软件2 软件工程3 软件工程环境4 三种编程范例 第二章1 软件生存周期2 软件生存周期的主要活动 3 软件过程 第三章1 结构化分析SA2 DFD xff08 数据流 xff09 图3 结构化设计SD xff08
  • TCP客户端增加多线程与TCP服务端增加多线程

    TCP客户端增加多线程 xff08 ps xff1a 仅有代码 xff0c 小伙伴们利用百度 xff0c 冲啊 xff01 xff01 xff01 xff09 span class token comment coding 61 utf 8
  • 梯度下降与矩阵分解

    1 梯度下降 梯度下降属于迭代法的一种 xff0c 所谓迭代法就是不断用变量的旧值得到新值的方法 在求解损失函数最小值的时候 xff0c 可以通过梯度下降法来一步步迭代求出最小化的损失函数和模型参数值 梯度 xff1a 对于一元函数来说 x