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