如何以更有效的方式实施L1范数的健壮PCA方程?

时间:2019-03-20 07:20:12

标签: python machine-learning pca gradient-descent least-squares

我最近在课堂上学到了主成分分析方法,旨在将矩阵X近似为两个矩阵Z * W的乘法。如果X是n x d矩阵,则Z是n x k矩阵,W是k x d矩阵。在那种情况下,PCA试图最小化的目标函数就是这个。 (w ^ j表示W的第j_列,z_i表示Z的第i_行)

enter image description here

在这种情况下,很容易计算出相对于W和Z的f的梯度。

enter image description here

enter image description here

但是,除了使用上面的L2范数之外,我还必须使用L1范数(如以下等式),并使用梯度下降来找到理想的Z和W。

enter image description here

为了区分它,我将绝对函数近似如下(ε是非常小的值)。

enter image description here

但是,当我尝试计算相对于该目标函数W的梯度矩阵时,我得出了以下方程式。

enter image description here

我尝试按元素制作渐变矩阵,但是如果X的大小很大,则会花费很长时间。

g = np.zeros((k, d))
for i in range(k):
            for j in range(d):
                for k2 in range(n):
                    temp = np.dot(W[:,j], Z[k2,:])-X[k2, j]
                    g[i, j] += (temp * Z[k2, i])/np.sqrt(temp*temp + 0.0001)
g = g.transpose()

有什么办法可以使这段代码更快?我觉得有一种方法可以使方程式更简单,但是里面的平方根让我完全迷失了。任何帮助将不胜感激!

0 个答案:

没有答案