基于Edward的概率矩阵分解潜在因子恢复可行性问询
首先得明确:你遇到的问题是概率矩阵分解(PMF)的固有可识别性问题——PMF的潜在空间是旋转(甚至缩放)不变的。具体来说,对于任意正交矩阵$W$,$\tilde{U} = U W$和$\tilde{V} = W^{-1} V$都会得到完全相同的$R = U^T V = \tilde{U}^T \tilde{V}$。这就是为什么你能很好地预测$R$,但$U/V$的误差却居高不下——模型找到了一个和真实解旋转等价的解,但这个解和真实值的欧氏距离可能很大。
下面是几个能有效提升潜在特征恢复效果的方法,结合Edward实现来给你说明:
1. 给模型添加可识别性约束
打破对称性最直接的方式是给$U$或$V$施加约束,让模型只能收敛到唯一(或接近唯一)的解。常见的约束方式有:
固定部分参数
比如固定$U$的前几列或前几行的结构,强制模型的潜在空间和真实空间对齐。举个Edward里的例子:
# 假设D=2,固定U的前2个样本的潜在特征为特定值,打破旋转对称性 fixed_U_part = tf.constant([[1.0, 0.0], [0.0, 1.0]], shape=[D, 2]) # 剩下的U部分用正态先验 U_free = Normal(loc=tf.zeros([D, N-2]), scale=tf.ones([D, N-2])) # 拼接得到带约束的U U = tf.concat([fixed_U_part, U_free], axis=1)
这种方法直接消除了旋转自由度,代价是需要提前知道一部分真实特征的结构(如果是合成数据的话很容易,真实数据可以根据领域知识设定)。
施加范数或正交约束
比如让$U$的列具有单位范数,或者让$U$成为正交矩阵:
# 对U的列做L2归一化,消除缩放自由度 U = Normal(loc=tf.zeros([D, N]), scale=tf.ones([D, N])) U_normalized = tf.nn.l2_normalize(U, axis=0) # 用归一化后的U来计算R R = Normal(loc=tf.matmul(tf.transpose(U_normalized), V), scale=tf.ones([N, M]))
如果同时对$U$和$V$施加正交约束,就能完全消除旋转和缩放的歧义。
2. 使用带正则化的收缩先验
你原来用的是标准正态先验,对潜在特征的结构没有引导。换成收缩先验可以让模型更倾向于接近真实特征的解,减少对称性带来的模糊:
马蹄形先验(适合稀疏特征)
如果真实的$U/V$有稀疏性,马蹄形先验能很好地收缩小系数,保留大系数:
from edward.models import HalfCauchy # 定义超参数 tau = HalfCauchy(loc=0.0, scale=1.0) lambda_U = HalfCauchy(loc=0.0, scale=1.0, sample_shape=[D, N]) lambda_V = HalfCauchy(loc=0.0, scale=1.0, sample_shape=[D, M]) # 给U和V添加马蹄形先验 U = Normal(loc=tf.zeros([D, N]), scale=tau * lambda_U) V = Normal(loc=tf.zeros([D, M]), scale=tau * lambda_V)
带尺度参数的正态先验
如果知道真实特征的尺度,可以手动设定或学习尺度参数:
# 学习U的尺度参数 scale_U = tf.Variable(tf.ones([D, N])) U = Normal(loc=tf.zeros([D, N]), scale=scale_U) # V同理 scale_V = tf.Variable(tf.ones([D, M])) V = Normal(loc=tf.zeros([D, M]), scale=scale_V)
3. 后验推断后的对齐修正
如果不想修改模型结构,也可以在推断得到$U_{est}$和$V_{est}$后,用Procrustes分析来对齐旋转和缩放,再结合置换匹配(比如匈牙利算法)来修正特征顺序:
from scipy.linalg import orthogonal_procrustes from scipy.optimize import linear_sum_assignment # 步骤1:用Procrustes分析解决旋转/反射问题 # 注意维度:假设U_true是(D,N),U_est是推断得到的(D,N) W, _ = orthogonal_procrustes(U_true.T, U_est.T) # 转置为(N,D)来匹配Procrustes的输入要求 U_aligned = U_est.dot(W) V_aligned = np.linalg.inv(W).dot(V_est) # 步骤2:用匈牙利算法解决特征置换问题 # 计算真实U和对齐后U的匹配成本 cost_matrix = np.zeros((D, D)) for i in range(D): for j in range(D): cost_matrix[i,j] = np.linalg.norm(U_true[i,:] - U_aligned[j,:]) # 找到最优置换 row_ind, col_ind = linear_sum_assignment(cost_matrix) # 应用置换 U_final = U_aligned[col_ind, :] V_final = V_aligned[:, col_ind]
这样处理后,$U_final$和$V_final$会和真实值的误差显著降低。
总结
PMF的对称性是无法完全消除的,但通过上述方法——添加可识别性约束、使用正则化先验、后验对齐——可以大幅提升潜在特征的恢复效果。在Edward中,前两种方法需要修改模型的先验或变量定义,第三种是推断后的后处理,都能有效解决你遇到的问题。
内容的提问来源于stack exchange,提问作者charlesh

