- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想使用 ZCA 对 CIFAR10 数据集进行白化处理。输入 X_train
的形状为 (40000, 32, 32, 3),其中 40000 是图像的数量,32x32x3 是每个图像的大小。我正在使用 this answer 中的代码为此目的:
X_flat = np.reshape(X_train, (-1, 32*32*3))
# compute the covariance of the image data
cov = np.cov(X_flat, rowvar=True) # cov is (N, N)
# singular value decomposition
U,S,V = np.linalg.svd(cov) # U is (N, N), S is (N,)
# build the ZCA matrix
epsilon = 1e-5
zca_matrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T))
# transform the image data zca_matrix is (N,N)
zca = np.dot(zca_matrix, X_flat) # zca is (N, 3072)
但是,在运行时我遇到了以下警告:
D:\toolkits.win\anaconda3-5.2.0\envs\dlwin36\lib\site- packages\ipykernel_launcher.py:8: RuntimeWarning: invalid value encountered in sqrt
所以在我得到 SVD 输出后,我尝试了:
print(np.min(S)) # prints -1.7798217
这是意想不到的,因为 S
只能有正值。此外,ZCA 白化结果不正确,它包含 nan
值。
我尝试通过第二次重新运行相同的代码来重现此代码,这次我没有遇到任何警告或任何负 S
值,但我得到了:
print(np.min(S)) # prints nan
知道为什么会发生这种情况吗?
更新:重新启动内核以释放 cpu 和 RAM 资源,并尝试再次运行此代码。对于向 np.sqrt()
提供负值,再次收到相同的警告。不确定是否有帮助,但我还附上了 cpu 和 ram 利用率数据:
最佳答案
这里有一些想法。我没有你的数据集,所以我不能完全确定这些会解决你的问题,但我有足够的信心将其发布为答案而不是评论。
首先。您的 X_train
是 40'000 x 3072,其中每个行 是一个数据向量,每个列 是一个变量或特征。您需要 3072 x 3072 的协方差矩阵:将 rowvar=False
传递给 np.cov
。
我不太确定为什么 40'000 x 40'000 协方差矩阵的 SVD 会发散。假设您有足够的 RAM 来存储 12 GB 协方差矩阵,我能想到的一件事是数值溢出,因为您可能没有像 ZCA(和任何其他美白技术)所期望的那样删除数据的平均值?
所以第二个。删除均值:X_zeromean = X_flat - np.mean(X_flat, 0)
。
如果你这样做,那么最后一步必须稍微修改一下(使尺寸对齐)。这是使用统一随机数据的快速检查:
import numpy as np
X_flat = np.random.rand(40000, 32*32*3)
X_zeromean = X_flat - np.mean(X_flat, 0)
cov = np.cov(X_zeromean, rowvar=False)
U,S,V = np.linalg.svd(cov)
epsilon = 1e-5
zca_matrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T))
zca = np.dot(zca_matrix, X_zeromean.T) # <-- transpose needed here
作为健全性检查,np.cov(zca)
现在非常接近单位矩阵,符合需要(zca
将翻转维度作为输入)。
(作为旁注,这是一种非常昂贵且数值不稳定的白化数据数组的方法:您不需要先计算协方差然后再使用 SVD——您所做的工作是原来的两倍。您可以使用数据矩阵本身的瘦 SVD(np.linalg.svd
带有 full_matrices=False
标志)并直接从那里计算白化矩阵,而无需评估昂贵的外积为协方差矩阵。)
关于python - 从 Numpy 的 SVD 分解中获得负 S 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55131665/
SciPy 和 Numpy 都内置了奇异值分解 (SVD) 函数。命令基本上是 scipy.linalg.svd 和 numpy.linalg.svd。这两者有什么区别?它们中的任何一个都比另一个更好
numpy.linalg.svd 函数给出输入矩阵的完整 svd。但是我只想要第一个奇异向量。 我想知道在 numpy 中是否有任何函数用于那个或 python 中的任何其他库? 最佳答案 一种可能是
代码: import numpy from matplotlib.mlab import PCA file_name = "store1_pca_matrix.txt" ori_data = nump
我在学习SVD通过关注这个 MIT course . 矩阵构造为 C = np.matrix([[5,5],[-1,7]]) C matrix([[ 5, 5], [-1, 7]]
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我想计算 SVD ,但我没有找到合适的 java 库。现在,我在 hashmap 中存储了数据,因为矩阵不适合内存,因为大小约为 400 000 X 10 000 并且大多数为 0。我尝试了 MTJ、
运行以下代码: from sklearn.decomposition import TruncatedSVD import numpy as np X = np.matrix('1 2 3 4 5;
给定一个实数矩阵 A 使得: A 是对称的 所有非对角线项都是已知且正的 所有对角线项都缺失 排名k 我想找到 A 的最佳可能完成,称为 Ac,这样(大约)rank(Ac)=k。 矩阵 A 可能很大(
我正在寻找一个执行维基百科中描述的奇异值分解的 Java 库:从矩阵 A (m X n) 得到 A = U*S*V' 其中 U 是 m x m,S 是 m x n,V 是n x n. 谁能帮帮我? 请
我正在尝试学习用于图像处理的 SVD...例如压缩。 我的方法:使用 ImageIO 获取图像作为 BufferedImage...获取 RGB 值并使用它们获取等效的灰度值(在 0-255 范围内)
我必须在 Matlab 中使用 SVD 来获得数据的简化版本。我读到函数 svds(X,k) 执行 SVD 并返回前 k 个特征值和特征向量。如果必须规范化数据,文档中没有提及。对于归一化,我指的是减
我已经使用 SVD 找到了两组点之间的旋转矩阵。我知道 R = Transpose(U) * V 但我不明白 U 和 V 代表什么以及为什么这种乘法会产生旋转矩阵。 最佳答案 由于您的问题是理论性的并
我正在尝试在名为“LSA 简介”的论文中复制一个示例: An introduction to LSA 在示例中,它们具有以下术语-文档矩阵: 然后他们应用 SVD 并得到以下结果: 试图复制这一点,我
我正在使用带有 R 的 SVD 包,我能够通过将最低奇异值替换为 0 来降低矩阵的维数。但是当我重新组合矩阵时,我仍然拥有相同数量的特征,我找不到如何有效地删除源矩阵中最无用的特征,以减少其列数。 例
我想编写一个函数,它使用 SVD 分解来求解方程组 ax=b,其中 a 是一个方阵,b 是一个值向量。 scipy 函数 scipy.linalg.svd() 应该将 a 转换为矩阵 U W V。对于
我在 R 中有一个稀疏矩阵,它显然太大了,无法在其上运行 as.matrix()(尽管它也不是 super 大)。有问题的 as.matrix() 调用位于 svd() 函数内部,所以我想知道是否有人
我正在尝试使用 bcv 包中的 SVD 插补,但所有插补值都是相同的(按列)。 这是缺少数据的数据集 http://pastebin.com/YS9qaUPs #load data dataMiss
我有这个数组 double a[][] = {{1,1,1}, {0,1,1} , { 1,0,0} ,{0,1,0},{1,0,0},{1,0,1},{1,1,1},{1,1,1},
我们现在知道A_(m x n) = U_(m x k) * S_(k x k) * V_(k x n)^T = u_(1) * s_1 * v_(1) + u_(2) * s_2 * v_(2) +
我必须对矩阵进行 SVD,但它有一些错误,在下面的示例中 U[1][1]、U[2][1] 和 U[2][0] 应为 0。 问题是,上面的例子只是一个测试,我必须使用条件不太好的大型矩阵,我该怎么做才能
我是一名优秀的程序员,十分优秀!