Python 实现矩阵分解

详细的理论解释和Java实现参考: 附上详细的理论解释和Java实现LTA_ALBlack的博客

在多标签学习中,标签矩阵Y,存在标签缺失情况,利用Funk-SVD,将矩阵Y 分解为矩阵U 和V ,使得满足 Y = U * V,即可将确失标签补充。具体步骤如下:

1、随机初始化 U、V。

2、确定包含正则化的损失函数。

3、对损失函数求导,利用梯度下降法,更新U、V。

4、循环步骤3,直到损失函数小于某个值为止。

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

def matrix_factorization(Y, rank, aplha, beta, steps):
    '''
    :param Y: label matrix m*n
    :param U: 对象向隐含标签的映射 m*k
    :param V: 标签向隐含标签的映射 m*k
    :param K: 隐向量的维度
    :param aplha: 学习率
    :param beta: 正则化参数
    :param steps:
    :return:
    '''
    print('开始分解原矩阵:\n')

    Y = np.array(Y)

    # Number of rows of label matrix Y
    rows_Y = len(Y)

    # Number of columns of label matrix Y
    columns_Y = len(Y[0])  # 原矩阵R的列数

    # Random initialization matrix. [0 1]
    U = np.random.rand(rows_Y, rank)
    V = np.random.rand(columns_Y, rank)
    # Transpose
    V = V . T

    result=[]

    # update parameters using gradient descent method
    print('开始训练: \n')
    for step in range(steps):
        for i in range(len(Y)):
            for j in range(len(Y[0])):
                eij=Y[i][j]-np.dot(U[i,:],V[:,j])
                for k in range(rank):
                    if Y[i][j]>0:
                        # update parameters
                        U[i][k]=U[i][k]+aplha*(2*eij*V[k][j]-beta*U[i][k])
                        V[k][j]=V[k][j]+aplha*(2*eij*U[i][k]-beta*V[k][j])

        # loss
        e=0
        for i in range(len(Y)):
            for j in range(len(Y[i])):
                if Y[i][j] > 0:
                    e = e + pow(Y[i][j] - np.dot(U[i, :], V[:, j]), 2)  # loss
                    for k in range(rank):
                        e = e + (beta / 2) * (pow(U[i][k], 2) + pow(V[k][j], 2))  # loss with regularization
        result.append(e)
        if e < 0.001:
            break
    print('training Finshed 。。。。')

    return U, V.T, result


if __name__ == '__main__':   #主函数
    Y=[                 #原始矩阵
        [5,3,0,1],
        [4,0,0,1],
        [1,1,0,5],
        [1,0,0,4],
        [0,1,5,4]
    ]
    Y=np.array(Y)

    U,V,result=matrix_factorization(Y, 3, aplha=0.0002,beta=0.02,steps=5000)

    # show the result
    print(result)
    print('原矩阵',Y)
    Y_MF=np.dot(U,V.T)
    print('计算出的矩阵',Y_MF)

    # display the results with a chart
    plt.plot(range(len(result)),result)
    plt.xlabel("time")
    plt.ylabel("loss")
    plt.show()







  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,你可以使用SciPy库中的`scipy.spatial.transform`模块来进行旋转矩阵的分解。具体来说,你可以使用`Rotation.from_matrix()`函数来创建一个`Rotation`对象,然后使用该对象的`as_euler()`方法来获取欧拉角表示。 以下是一个示例代码,展示了如何使用SciPy库进行旋转矩阵的分解: ```python from scipy.spatial.transform import Rotation # 你可以将旋转矩阵表示为一个3x3的NumPy数组 rotation_matrix = [[0.707, -0.707, 0], [0.707, 0.707, 0], [0, 0, 1]] # 创建Rotation对象 rotation = Rotation.from_matrix(rotation_matrix) # 获取欧拉角表示 euler_angles = rotation.as_euler('xyz') # 输出欧拉角表示(以弧度为单位) print(euler_angles) ``` 在上述代码中,`rotation_matrix`是一个3x3的旋转矩阵,`Rotation.from_matrix()`函数将其转换为一个`Rotation`对象,然后使用`as_euler()`方法获取欧拉角表示。`as_euler()`方法的第一个参数是旋转顺序,可以使用`'xyz'`表示yaw-pitch-roll的顺序。 如果你想将欧拉角表示转换为角度(而不是弧度),你可以使用`rotation.as_euler('xyz', degrees=True)`。 请注意,由于欧拉角的约定性和多样性,你可能需要根据实际情况选择适合的欧拉角表示。12 #### 引用[.reference_title] - *1* *2* [python旋转矩阵与欧拉角互转](https://blog.csdn.net/ZHUO__zhuo/article/details/124634228)[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^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值