我正在尝试实现 ZCA美白,并找到了一些文章来做,但是它们有些令人困惑。
任何提示或帮助,感激不尽!
这是我读过的文章:
http://courses.media.mit.edu/2010fall/mas622j/whiten.pdf
http://bbabenko.tumblr.com/post/86756017649/learning-low-level-vision-feautres-in-10-lines-of
我尝试了几件事,但其中大多数我不理解,我被锁在了某个步骤。
现在,我以此为基础重新开始:
dtype = np.float32
data = np.loadtxt("../inputData/train.csv", dtype=dtype, delimiter=',', skiprows=1)
img = ((data[1,1:]).reshape((28,28)).astype('uint8')*255)
最佳答案
这是用于生成ZCA白化矩阵的python函数:
def zca_whitening_matrix(X):
"""
Function to compute ZCA whitening matrix (aka Mahalanobis whitening).
INPUT: X: [M x N] matrix.
Rows: Variables
Columns: Observations
OUTPUT: ZCAMatrix: [M x M] matrix
"""
# Covariance matrix [column-wise variables]: Sigma = (X-mu)' * (X-mu) / N
sigma = np.cov(X, rowvar=True) # [M x M]
# Singular Value Decomposition. X = U * np.diag(S) * V
U,S,V = np.linalg.svd(sigma)
# U: [M x M] eigenvectors of sigma.
# S: [M x 1] eigenvalues of sigma.
# V: [M x M] transpose of U
# Whitening constant: prevents division by zero
epsilon = 1e-5
# ZCA Whitening matrix: U * Lambda * U'
ZCAMatrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T)) # [M x M]
return ZCAMatrix
以及用法示例:
X = np.array([[0, 2, 2], [1, 1, 0], [2, 0, 1], [1, 3, 5], [10, 10, 10] ]) # Input: X [5 x 3] matrix
ZCAMatrix = zca_whitening_matrix(X) # get ZCAMatrix
ZCAMatrix # [5 x 5] matrix
xZCAMatrix = np.dot(ZCAMatrix, X) # project X onto the ZCAMatrix
xZCAMatrix # [5 x 3] matrix
希望能帮助到你!
有关Edgar Andrés Margffoy Tuay的答案不正确的原因的详细信息:如R.M的comment所指出的,Edgar Andrés Margffoy Tuay的ZCA白化功能包含一个小而关键的错误:应删除
np.diag(S)
。 Numpy将S
作为m x 1向量而不是m x m矩阵返回(这是其他svd实现(例如Matlab)所共有的)。因此,ZCAMatrix
变量变为m x 1向量,而不是应有的m x m矩阵(当输入为m x n时)。 (此外,仅当X为预先居中,即平均值为0时,Andfoy的答案中的协方差矩阵才有效)。ZCA的其他引用:您可以在Python中看到Stanford UFLDL ZCA Whitening练习here的完整答案。
关于python - 如何实现ZCA美白? Python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31528800/