基于最小二乘的矩阵分解问题
例如已知代价函数: min D=||Y−AX||2F m i n D = | | Y − A X | | F 2
一般思想是将固定其中一个因子矩阵,计算关于另外一个因子矩阵的导数。为了计算方便一般将上述代价函数转为如下形式:
min D=tr[(Y−AX)(Y−AX)T] or tr[(Y−AX)T(Y−AX)] m i n D = t r [ ( Y − A X ) ( Y − A X ) T ] o r t r [ ( Y − A X ) T ( Y − A X ) ]
将代价函数转化为求取矩阵的迹之后,可更加方便求解最优化问题。
计算因子矩阵
- 固定 X X , 计算 A A
- 固定 A A , 计算 X X
- 往复循环直至满足阈值条件,参见als思想
以计算 A A 为例
固定 X X , 计算对 D D 关于 A A 的导数
dDdA=d[tr(YYT−AXYT−YXTAT+AXXTAT)]dA d D d A = d [ t r ( Y Y T − A X Y T − Y X T A T + A X X T A T ) ] d A
化简之,
dDdA=2AXXT−2YXT d D d A = 2 A X X T − 2 Y X T
则可得, A←YXT(XXT)−1 A ← Y X T ( X X T ) − 1
同理可得, X←(ATA)−1ATY X ← ( A T A ) − 1 A T Y
附录1:关于矩阵分解的HALS代码
E = T - A*B';
%% algorithm based on HALS
while iter < iter_max
iter = iter + 1;
for j = 1:J
Cj = E + A(:,j)*B(:,j)';
B(:,j) = pinv(A(:,j)'*A(:,j))*Cj'*A(:,j);
B(:,j) = max(eps,B(:,j));
A(:,j) = pinv(B(:,j)'*B(:,j))*Cj*B(:,j);
A(:,j) = max(eps,A(:,j));
A(:,j) = A(:,j)./norm(A(:,j));
E = Cj - A(:,j)*B(:,j)';
end
end
附录2:关于迹函数的求导
详见《矩阵分析与应用》第五章 作者张贤达
![]()
![]()
![]()
![]()