矩阵分解笔记

1.矩阵的形式

下面为一个矩阵的基本形式

 

1.“矩”的意思是矩形,由数字组成的矩形;

2.“阵”的意思是整齐,这些数字排列起来是非常整齐的,并不会歪歪扭扭;

3.矩阵中,横向的数字是行,竖向的数字是列,行和列都是整数,可以是1或者是n(n是整数);

4.矩阵中,通过“第几行、第几列”这种简便的方式来确定某个数字的具体位置。

2.矩阵的相关运算

矩阵+矩阵

 常数×矩阵

 阵矩×矩阵

以下矩阵为例

 y1 = a11 * x1 + a12 * x2

 y2 = a21 * x1 + a22 * x2

方程组如下

 要计算矩阵乘法,请将第一个矩阵行元素(或数字)乘以第二个矩阵列元素,然后计算其总和。

 所以第一个矩阵的行数需要与第二个矩阵的列数对应

m×k的矩阵和k×n的矩阵相乘,结果就是得到一个m×n的矩阵

而三个矩阵甚至多个矩阵相乘也符合这个道理

 先将前两个举着进行相乘,变成一个矩阵,如图所示

 于是就变成了两个矩阵相乘

矩阵的转置

 3.分解矩阵

矩阵分解,直观上来说就是把原来的大矩阵,近似分解成两个小矩阵的乘积,在实际推荐计算时不再使用大矩阵,而是使用分解得到的两个小矩阵。

import numpy as np
import math
import matplotlib.pyplot as plt

#定义矩阵分解函数
def Matrix_decomposition(R,P,Q,N,M,K,alpha=0.0002,beta=0.02):
    Q = Q.T #Q 矩阵转置
    loss_list = [] #存储每次迭代计算的 loss 值
    for step in range(5000):
        #更新 R^
        for i in range(N):
            for j in range(M):
                if R[i][j] != 0:
                    #计算损失函数
                    error = R[i][j]
                    for k in range(K):
                        error -= P[i][k]*Q[k][j]
                    #优化 P,Q 矩阵的元素
                    for k in range(K):
                        P[i][k] = P[i][k] + alpha*(2*error*Q[k][j]-beta*P[i][k])
                        Q[k][j] = Q[k][j] + alpha*(2*error*P[i][k]-beta*Q[k][j])
                    
        loss = 0.0
        #计算每一次迭代后的 loss 大小,就是原来 R 矩阵里面每个非缺失值跟预测值的平方损失
        for i in range(N):
            for j in range(M):
                if R[i][j] != 0:
                    #计算 loss 公式加号的左边
                    data = 0
                    for k in range(K):
                        data = data + P[i][k]*Q[k][j]
                    loss = loss + math.pow(R[i][j]-data,2)
                    #得到完整 loss 值
                    for k in range(K):
                        loss = loss + beta/2*(P[i][k]*P[i][k]+Q[k][j]*Q[k][j])
                    loss_list.append(loss)
        plt.scatter(step,loss)
        #输出 loss 值
        if (step+1) % 1000 == 0:
            print("loss={:}".format(loss))
        #判断
        if loss < 0.001:
            print(loss)
            break
    plt.show()    
    return P,Q
        
if __name__ == "__main__":
    N = 5
    M = 4
    K = 5
    R = np.array([[5,3,0,1],
                [4,0,0,1],
                [1,1,0,5],
                [1,0,0,4],
                [0,1,5,4]]) #N=5,M=4
    print("初始评分矩阵:")
    print(R)
    #定义 P 和 Q 矩阵
    P = np.random.rand(N,K) #N=5,K=2
    Q = np.random.rand(M,K) #M=4,K=2
    
    print("开始矩阵分解:")
    P,Q = Matrix_decomposition(R,P,Q,N,M,K)
    print("矩阵分解结束。")
    print("得到的预测矩阵:")
    print(np.dot(P,Q))

运行结果为:

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
低秩矩阵分解是一种用于推荐系统的算法,可以通过分解一个矩阵两个较低秩的矩阵来获得所需的参数。在Python中,可以使用向量化的方式实现低秩矩阵分解。首先,你可以使用NumPy库来进行矩阵的数值计算和处理。然后,可以利用NumPy中的函数来进行矩阵的乘法运算,例如使用np.dot()函数进行矩阵相乘。另外,你还可以使用NumPy中的函数来进行矩阵的逆运算,例如使用np.linalg.inv()函数来计算逆矩阵。此外,你还可以使用NumPy中的函数来进行矩阵的分解,例如使用np.linalg.svd()函数进行奇异值分解。通过奇异值分解,可以得到矩阵的特征向量和特征值,从而实现低秩矩阵分解。同时,你可以使用Python中的其他库,如SciPy和scikit-learn,来进行更高级的矩阵操作和计算。总的来说,Python提供了丰富的工具和库,可以方便地进行低秩矩阵分解的计算和实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于OpenGL的计算机图形学实验四简单几何形体(三角形、多边形等)的平移、缩放、旋转等几何变换(完整可...](https://download.csdn.net/download/weixin_53249260/88236610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [9.3 低秩矩阵分解-机器学习笔记-斯坦福吴恩达教授](https://blog.csdn.net/weixin_36815313/article/details/105162458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [用于低秩矩阵完成的秩自适应原子分解及其在图像恢复中的应用](https://download.csdn.net/download/weixin_38670983/18274057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值