Я недавно узнал в классе, что метод анализа основных компонентов стремится приблизить матрицу 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 *
В этом случае легко вычислить градиент 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()
Есть ли способ сделать этот код быстрее? Я чувствую, что есть способ сделать уравнение более простым, но с квадратным корнем внутри я полностью потерялся. Любая помощь будет оценена!