我怎样才能以更有效的方式实现这个L1范数鲁棒PCA方程?

问题描述 投票:0回答:1

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

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

但是,我不能使用上面的 L2 范数,而是必须使用 L1 范数,如下式所示,并使用梯度下降来找到理想的 Z 和 W。

为了区分它,我将绝对函数近似如下(epsilon是一个很小的值)。

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

我尝试按元素制作梯度矩阵,但如果 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()

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

python machine-learning pca gradient-descent least-squares
1个回答
0
投票

你最好以矩阵方式计算梯度:

渐变:

梯度下降会起作用,尽管问题既不是凸的也不是平滑的,所以它会很慢并且最小值只能保证是局部最小值。

可能有更好的策略来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.