推荐系统--矩阵分解(matrix factorization)

  • 矩阵分解初级代码
  • 根据输入信息,随机生成矩阵,后查看结果
  • 后续会更新代码
import numpy as np


def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0003, beta=0.03):
    Q = Q.T
    cnt = 0
    mse = 0
    for step in range(steps):
        stp = step
        for i in range(len(R)):
            for j in range(len(R[i])):
                loss_eij = R[i][j] - np.dot(P[i, :], Q[:, j])
                for k in range(K):
                    temp_p = P
                    temp_q = Q
                    P[i][k] = temp_p[i][k] + alpha * (2 * loss_eij * temp_q[k][j] - beta * temp_p[i][k])
                    Q[k][j] = temp_q[k][j] + alpha * (2 * loss_eij * temp_p[i][k] - beta * temp_q[k][j])

        for i in range(len(R)):
            for j in range(len(R[i])):
                cnt += 1
                mse += pow(R[i][j] - np.dot(P[i, :], Q[:, j]), 2)

        mse /= cnt
        if mse < 1e-3:
            break

    return P, Q, mse, stp


def create_matrix(item_floor, item_ceil, row, column):
    r = [[np.random.randint(item_floor, item_ceil + 1) for j in range(1, column + 1)] for i in range(1, row + 1)]
    r = np.array(r)
    return r


if __name__ == '__main__':

    item_floor = eval(input("Please enter the lower limit of the matrix number(int):"))
    item_ceil = eval(input("Please enter the upper limit of the matrix number(int):"))
    row = eval(input("Please enter the number of rows(int):"))
    column = eval(input("Please enter the number of columns(int):"))
    K = eval(input("Please enter the latent dimensions(int):"))
    print("Please wait......")

    R = create_matrix(item_floor, item_ceil, row, column)

    N = row
    M = column

    P = np.random.rand(N, K)
    Q = np.random.rand(M, K)

    new_P, new_Q, mse, step = matrix_factorization(R, P, Q, K)
    print("Type of R:", type(R))
    print("The original matrix:\n", R)
    R_MF = np.dot(new_P, new_Q)
    print("matrix after processed:\n", R_MF)
    print("MSE:\n", mse)
    print("default steps:5000 Actual steps:", step + 1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值