2016-08-20 6 views
2

私はボクセルとしてセルを持つオブジェクトを表す3Dのnumpy配列を持っています。ボクセルは1から10の値を持ちます。イメージを圧縮して小さくしたいです。イメージが元のイメージとの最小限の合意レベルに圧縮することによってイメージがどれだけ複雑であるかについて後で簡単に考えてください。3dpyのnumpyでの圧縮

私はこれを2D画像で行い、必要な特異値の数を確認するのにSVDを使用しましたが、3D画像では問題があるように見えます。たとえば私はS行列の対角項を見ると、それらはすべてゼロであり、特異値を期待していました。

svdを使用して3D配列を圧縮する方法はありますか(たとえば、何らかの方法で平坦化するなど)?または、他の方法がより適切ですか?必要に応じてボクセル値を0または1に単純化することもできます。

+0

あなたの3Dマトリックスの第1の次元に沿うサブアレイの各々に対する位置及び値を追跡することになる2Dスパース行列のセットを作成することができ –

答えて

2

3Dデータには基本的に同じ原理を適用することができます。 CP-ALS(Alternating Least Squaresを使用)などのN次元行列を分離するアルゴリズムがあり、これはパッケージ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ではなく、上記のすべての方法を使用してデータの主要コンポーネントを分析することができます。

(単に完全性のため)怒鳴るタッカー分解の画像検索:

enter image description here

そして、CP-ALS(最適化アルゴリズム)を取得しようとする分解の別の画像を怒鳴る:

enter image description here

イメージ・クレジットへ:

の1- http://www.slideshare.net/KoheiHayashi1/talk-in-jokyonokai-12989223

2 - http://www.bsp.brain.riken.jp/~zhougx/tensor.html

0

何が欲しいのはhigher order svd/Tucker decompositionです。

3Dの場合、3つの投影行列(各次元に1つ)と低ランクのコアテンソル(3D配列)が得られます。

あなたは簡単にTensorLyを使用してこれを行うことができます。

ここ
from tensorly.decomposition import tucker 
core, factors = tucker(tensor, ranks=[2, 3, 4]) 

coreは形状があります(2、3、4)とlen(factors)3、各次元に対して1つの要因となります。