我正在尝试创建一个PCA脚本,该脚本将处理一组图像并将其分解为按功率/重量排序的PC。据我了解,您想做以下的M = U*S*V.T
。我在N处切断了阵列,N是去除所有较低PC的过滤器。但是它似乎根本不起作用,并且会产生明显不是PC的乱码。我误会数学了吗?
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
答案 0 :(得分:0)
主要成分只是V的对应前N列。
您计算出的是2范数和Frobenius范数中矩阵M的最佳秩N近似值。