矩阵分解与梯度下降 1月九日学习笔记

2023-10-20 02:20

本文主要是介绍矩阵分解与梯度下降 1月九日学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.矩阵的乘法与分解

矩阵乘法的原理示意图:

矩阵乘法的公式:

矩阵乘法的具体例子:

同样的利用矩阵的乘法的原理我们同样可以一个矩阵分解为两个矩阵。

 例如一个4*5的矩阵可以分解为一个4*K与K*5的矩阵。

2.损失函数:

损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越小,通常模型的性能越好。不同的模型用的损失函数一般也不一样

通俗来讲就是,用数据的真实值去减去采用函数模型得到的预测值,计算的是一个样本的误差。它是用来估量你模型的预测值 f(x)与真实值 Y的不一致程度。 

公式为 LOSS=真实值-预测值

我们当前主要常用的是:均方差损失函数

采用矩阵形式的损失函数:

我们构造好了损失函数,自然希望能够得到一个是误差尽可能小的 函数模型,也就是找到这个损失函数取最小值时的参数,而方法就用到梯度下降的方法来得到目标函数。 

3.梯度下降与偏导:

 梯度下降(gradient descent)在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值。

   3.1偏导:

在一元函数中,导数就是函数的变化率。对于二元函数的“变化率”,由于自变量多了一个,情况就要复杂的多。

在 xOy 平面内,当动点由 P(x0,y0) 沿不同方向变化时,函数 f(x,y) 的变化快慢一般来说是不同的,因此就需要研究 f(x,y) 在 (x0,y0) 点处沿不同方向的变化率。

在这里我们只学习函数 f(x,y) 沿着平行于 x 轴平行于 y 轴两个特殊方位变动时, f(x,y) 的变化率。

偏导数的表示符号为:∂。偏导数反映的是函数沿各个坐标轴正方向的变化率。梯度的最大方向就是方向导数方向也就是数值变化最快的方向。

3.2梯度下降;

我们可以用下山作为例子:(这里引用别人所举出的例子)

假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;

总之:通俗来讲就是利用当前位置的信息,一步一步迭代,找到最小值所在位置。

通过我们所学的高数知识知道,沿导数方向就是数值变化的最大方向。所以求导是必不可少的,就如同下山一样,我们有了下山方向就要考虑自己的下山所迈出的步伐,步长也是梯度下降中的一个重要参数,有了下山的方向也有了自己下山的步长,我们就可以一步一步进行一直到山底,也就是我们想要求出的函数中最小值点的参数

下面是一维以及多维的示意图:。

通俗易懂讲解梯度下降法


参数更新的主要步骤:

1.随机初始化一组参数θ

2.将目标函数J(θ)J(θ)分别对每个参数θ求偏导,(也可以理解为每个当前位置下山的最快方向

3.用旧的值减去旧的值的导数乘于步长得到新的值。

θnew=θold-a *f'(θold)

a 为学习效率(也可以理解为下山的步伐

b为每次迭代X的变化量  b=θold-θnew。

4.迭代次数一般通过2个参数控制

         初设的循环次数  或者 当b 也就是变化量小于一个特定的值。注意:a可以自己设定不易过大或过小,过大容易造成不准确,过小容易造成迭代次数过多。

 下面看一个具体例子:(利用梯度下降求损失函数最小值点参数

另一个y=(x-2.5)**2+3为例:(求函数最小值点对应的横坐标

 

 

 可以看到所求梯度下降得到最低点已经十分逼近函数真实最低点2.5了

部分代码实现

def dJ(x):return 2*(x-2.5)###定义一个求函数值的函数J
def J(x):try:return (x-2.5)**2+3except:return float('inf')
x=0.0							#随机选取一个起始点
eta=0.1		#学习率
i=0
epsilon=1e-8				    #用来判断是否到达二次函数的最小值点的条件
history_x=[x]                   #用来记录使用梯度下降法走过的点的X坐标
while True:i=i+1d=(x-2.5)**2+3gradient=dJ(x)				#梯度(导数)last_x=xx=x-eta*gradientprint("第%d次迭代 函数值%f x坐标%f 变化率%f"%(i,J(last_x),x,abs(J(last_x)-J(x))))history_x.append(x)if (abs(J(last_x)-J(x)) <epsilon):		#用来判断是否逼近最低点break

 4.正则化:(这个也不太明白)

 我们一般为了防止过拟合,在损失函数中增加正则化项

以矩阵为例:

也即是:

 有了上面的基础知识我们来看看关于矩阵分解的例子

 我们可以看U代表user及也就是用户,D表示数据也就是data(代表评分)。

图中有未评分的项目,我们要利用其他数据来预估这些评分。

 首先我们可以将矩阵拆分为2个矩阵的相乘。

R(m,n)为原始矩阵,Q(m,k)和P(k,n)为分解矩阵。

此时R1=Q*P。R1为预估矩阵。使R近似等于R1

1.我们要构建损失函数:

 2.对其求偏导:

 3.更新参数:

 4.接下来就是不断的迭代了。(一般要加入正则化这里也不要太明白就不加了)

下面是借鉴的别人的代码(自己初学还写不出来),看一下利用python的代码实现

# from pylab import *
import matplotlib.pyplot as plt
from math import pow
import numpydef 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=0for 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:breakreturn P,Q.T,resultif __name__ == '__main__':R=[[5,3,0,1],[4,0,0,1],[1,1,0,5],[1,0,0,4],[0,1,5,4]]R=numpy.array(R)N=len(R)M=len(R[0])K=2P=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)

 5总结:

主要学习矩阵的乘法与分解,以及什么是损失函数,然后就是利用梯度下降法去求得损失函数的最小值,这里也要清楚高等数学中的偏导概念,最后一般防止过度拟合要加入正则化(这个目前自己还不是特别清楚),其中还加了一些pytohn代码的实现,自己确实有很多地方不太清楚,刚开始写这些,也借鉴了许多别人的文章,那些人文章写的非常好,自己以后也会进步的。

这篇关于矩阵分解与梯度下降 1月九日学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/243942

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个