我有一个3d numpy数组表示一个对象的单元格作为体素和体素的值从1到10.我想压缩图像(a),使其更小,(b)稍后可以通过将图像压缩到与原始图像达到最低水平的一致性来快速了解图像的复杂程度。三维图像压缩与numpy
我已经使用SVD对2D图像执行此操作,并查看需要多少奇异值,但它看起来有3D困难。如果例如我看着S矩阵中的对角项,它们都是零,我期待奇异值。
有什么方法可以使用svd压缩3D数组(例如以某种方式展平)?还是其他方法更合适?如果有必要,我可以将体素值简化为0或1.
我有一个3d numpy数组表示一个对象的单元格作为体素和体素的值从1到10.我想压缩图像(a),使其更小,(b)稍后可以通过将图像压缩到与原始图像达到最低水平的一致性来快速了解图像的复杂程度。三维图像压缩与numpy
我已经使用SVD对2D图像执行此操作,并查看需要多少奇异值,但它看起来有3D困难。如果例如我看着S矩阵中的对角项,它们都是零,我期待奇异值。
有什么方法可以使用svd压缩3D数组(例如以某种方式展平)?还是其他方法更合适?如果有必要,我可以将体素值简化为0或1.
您可以基本上将相同的原理应用于3D数据而不会将其展平。有一些算法可以分离N维矩阵,例如CP-ALS(使用交替最小二乘法),这在包sktensor中实现。您可以使用包分解张量给予排名:
from sktensor import dtensor, cp_als
T = dtensor(X)
rank = 5
P, fit, itr, exectimes = cp_als(T, rank, init='random')
随着X
是您的数据。然后,您可以使用权重weights = P.lmbda
来重建原始阵列X
并计算重构误差,就像您使用SVD一样。
3D数据(或一般张量)的其他分解方法包括Tucker Decomposition或Canonical Decomposition(也可在同一包中)。
它不是直接的3D SVD,但是上面的所有方法都可以用来分析数据的主要组成部分。
查找波纹管(只是为了完整性)的打褶分解的图像:
而且娄分解的另一种形象,CP-ALS(优化算法)试图获取:
图片学分:
1- http://www.slideshare.net/KoheiHayashi1/talk-in-jokyonokai-12989223
你想要的是一个higher order svd/Tucker decomposition。在3D情况下,您将获得三个投影矩阵(每个维度一个)和一个低秩核心张量(三维数组)。
为此,您可以容易地使用TensorLy:
from tensorly.decomposition import tucker
core, factors = tucker(tensor, ranks=[2, 3, 4])
这里,core
将具有形状(2,3,4)和len(factors)
将3
,针对每个维度的一个因素。
您可以创建一组二维稀疏矩阵,这些矩阵可以跟踪3d矩阵第一维上每个子阵列的位置和值 –