def sparse_mat_decompose(user_preference: ss.csr_matrix, latent_factor_num: int = 1) -> (ss.csr_matrix, ss.csr_matrix): """ 分解稀疏的用户偏好矩阵至两个初始化矩阵 U 和 V,U 的列数和 V 的行数为 latent_factor_num :param user_preference: 分解用户偏好矩阵 :param latent_factor_num: U 的列数和 V 的行数 :return: U, V """ rows_num, column_num = user_preference.shape not_nan_elements_num = user_preference.count_nonzero() avg = user_preference.sum() / not_nan_elements_num init_element = np.sqrt(avg / latent_factor_num) u_init, v_init = np.full((rows_num, latent_factor_num), init_element), \ np.full((latent_factor_num, column_num), init_element) return ss.csr_matrix(u_init), ss.csr_matrix(v_init)