Как я могу реализовать это уравнение PCA, устойчивое к норме L1, более эффективным способом?

#python #machine-learning #pca #gradient-descent #least-squares

#python #машинное обучение #pca #градиентный спуск #метод наименьших квадратов

Вопрос:

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

введите описание изображения здесь

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

введите описание изображения здесь

введите описание изображения здесь

Однако вместо использования нормы L2, как указано выше, я должен использовать норму L1, как следующее уравнение, и использовать градиентный спуск, чтобы найти идеальные Z и W.

введите описание изображения здесь

Чтобы его дифференцировать, я аппроксимировал абсолютную функцию следующим образом (эпсилон — это очень маленькое значение).

введите описание изображения здесь

Однако, когда я попытался вычислить матрицу градиента относительно 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()
  

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