Декомпозиция сингулярных значений Python на изображениях для фильтрации - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать сценарий PCA, который просматривает набор изображений и разбивает их на ПК, отсортированные по мощности / весу. Насколько я понимаю, вы хотите сделать M = U*S*V.T, что я сделал ниже. Я отрезал массив в N, который является фильтром, который удаляет все нижние ПК. но, похоже, он вообще не работает и возвращает тарабарщину, которой явно нет на ПК. Я неправильно понимаю математику?

def PCA(cube_array, PCA_N=False, cutoff=1, verbatim=0):
    cube_shape_z, cube_shape_x, cube_shape_y = cube_array.shape
    n = 1
    M = cube_array.reshape(cube_array.shape[0],-1)


    U, s, Vt = np.linalg.svd(M, full_matrices=False)
    V = Vt.T
    S = np.diag(s)
    N = cutoff
    Mhat = np.dot(U[:, :N], np.dot(S[:N, :N], 
    V[:,:N].T)).reshape(cube_array.shape)
    return Mhat

1 Ответ

0 голосов
/ 11 января 2019

Основными компонентами являются только соответствующие первые N столбцов V.

То, что вы вычислили, является наилучшим приближением ранга N матрицы M в 2-норме и норме Фробениуса.

...