Как можно эффективнее реализовать это уравнение Robust PCA нормы L1? - PullRequest
3 голосов
/ 20 марта 2019

Я недавно узнал в классе, что метод анализа основных компонентов стремится приблизить матрицу X к умножению двух матриц Z * W. Если X является матрицей n x d, Z является матрицей n x k, а W является матрицей k x d. В этом случае целевая функция, которую PCA пытается минимизировать, заключается в следующем. (w ^ j означает j_th столбец W, z_i означает i_th ряд Z) * ​​1001 *

enter image description here

В этом случае легко вычислить градиент f относительно W и Z.

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()

Есть ли способ сделать этот код быстрее? Я чувствую, что есть способ сделать уравнение более простым, но с квадратным корнем внутри я полностью потерялся. Любая помощь будет оценена!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...