import numpy as np
defmatrix_factorization(R, P, Q, K, steps=5000, alpha=0.0003, beta=0.03):
Q = Q.T
cnt =0
mse =0for step inrange(steps):
stp = step
for i inrange(len(R)):for j inrange(len(R[i])):
loss_eij = R[i][j]- np.dot(P[i,:], Q[:, j])for k inrange(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 inrange(len(R)):for j inrange(len(R[i])):
cnt +=1
mse +=pow(R[i][j]- np.dot(P[i,:], Q[:, j]),2)
mse /= cnt
if mse <1e-3:breakreturn P, Q, mse, stp
defcreate_matrix(item_floor, item_ceil, row, column):
r =[[np.random.randint(item_floor, item_ceil +1)for j inrange(1, column +1)]for i inrange(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)