In[]:=
x=ImageData[ExampleData[{"TestImage","Airplane2"}]];(*サンプルデータの読み込みと数値化*)Image[x](*画像の表示*)Dimensions[x](*データのサイズ*)
Out[]=
Out[]=
{512,512}
xx=x[[1;;512,1;;500]];(*画像データを512x500の行列に成形*){u,s,v}=SingularValueDecomposition[xx,MatrixRank[xx]];(*SVD、u:左特異行列、s:特異値行列、v:右特異行列*)ListPlot[Diagonal[s],AxesLabel->{"rank","σ"},PlotRange->{{0,500},{0,25}},PlotLabel->"Singular Values"](*sの対角成分のプロット*)ac=Accumulate[Diagonal[s]]/Max[Accumulate[Diagonal[s]]]*100;(*Sの対角成分の累積*)ind=Nearest[ac->"Index",80];(*80%に最も近い値のインデクス*)Show[ListPlot[ac,AxesLabel->{"rank","Cumlative sum[%]"},PlotRange->{{0,500},{0,100}},PlotLabel->"Cumlative sum",PlotHighlighting->Placed["Dropline",ind]],ListPlot[{Flatten[{ind,ac[[ind]]}]},PlotStyle->PointSize[Large]]]
Out[]=
Out[]=
In[]:=
{u2,s2,v2}=SingularValueDecomposition[xx,UpTo[52]]; (*SVD、u2:左特異行列、s2:特異値行列、v2:右特異行列*)Dimensions[s2]Image[xx](*元イメージ*)Image[u2.s2.Transpose[v2]](*圧縮し次元削減したイメージ*)
Out[]=
{52,52}
Out[]=
Out[]=
In[]:=