|
3.8.5 たたみ込みと相関
たたみ込みと相関はデータリストに関する多くの演算の中核をなす.信号および画像処理,統計データ解析,偏微分方程式の近似や,数値列やベキ級数に対する演算等の分野で使用される.
たたみ込みと相関の基本的な考え方は核のリストをデータリストのサブリストと連続的に結合することである.核 とリスト とのたたみ込みの一般的な形式は で,相関の一般的な形式は である.

リストのたたみ込みと相関
核{x, y}とデータリストとのたたみ込みを形成する.
In[1]:= ListConvolve[{x,y}, {a,b,c,d,e}]
Out[1]= 
相関を形成する.
In[2]:= ListCorrelate[{x,y}, {a,b,c,d,e}]
Out[2]= 
この場合,核を反転するとListConvolveと全く同じ結果が得られる.
In[3]:= ListCorrelate[{y, x}, {a,b,c,d,e}]
Out[3]= 
データの連続した差分を形成する.
In[4]:= ListCorrelate[{-1,1}, {a,b,c,d,e}]
Out[4]= 
核と結合させるサブリストを構成する際,データリストの最後をどう扱うかが常に問題になる.デフォルトではListConvolveおよびListCorrelateはデータリストの最後から「はみ出す」サブリストは作成しない.これは得られる結果が通常はもとのデータリストより短いことを意味している.
長さ6の入力リストに関して,この場合出力の長さは4である.
In[5]:= ListCorrelate[{1,1,1}, Range[6]]
Out[5]= 
実際上,もとのデータリストと同じ長さの出力を得たい場合がしばしばある.この為にはデータリストの片側または両側がはみ出すようなサブリストが必要となる.こういったサブリストの形成に必要な追加要素は,ある種の「パディング」で充填される必要がある.デフォルトではMathematicaは,もとのリストの複製を作り,パディングを与え, リストを循環的に扱うようになっている.

データリストの両端での処理を制御する
デフォルトでは,はみ出しはない.
In[6]:= ListCorrelate[{x, y}, {a, b, c, d}]
Out[6]= 
最後の要素の最後の項がリストの最初から取られている.
In[7]:= ListCorrelate[{x, y}, {a, b, c, d}, 1]
Out[7]= 
最初の要素の第1項と最後の要素の最終項は共にラップされている.
In[8]:= ListCorrelate[{x, y}, {a, b, c, d}, {-1, 1}]
Out[8]= 
一般的な場合,ListCorrelate[kernel, list,  ,  ]は,結果の最初の要素ではlistの最初の要素が核の位置 にある要素と掛けられ,結果の最後の要素ではlistの最後の要素が核の位置 にある要素と掛けられるようになっている.したがって,はみ出しがどちら側にも許されないとされるデフォルトの場合はListCorrelate[kernel, list, 1, -1 ]に相当する.
長さ3の核に関して,{-1, 2}で揃えると,常に結果の最初および最後の要素を同じにする.
In[9]:= ListCorrelate[{x, y, z}, {a, b, c, d}, {-1, 2}]
Out[9]= 
多くの種類のデータでは,データは循環せずに,ある固定した要素,例えば0やある要素列でどちらかの最後に充填されると仮定すると便利である.

データリストのパディングを制御する
要素pで充填する.
In[10]:= ListCorrelate[{x, y}, {a, b, c, d}, {-1, 1}, p]
Out[10]= 
一般的にはゼロで充填する.
In[11]:= ListCorrelate[{x, y}, {a, b, c, d}, {-1, 1}, 0]
Out[11]= 
この場合qが一方の端に現れ,pが他方の端に現れる.
In[12]:= ListCorrelate[{x, y}, {a, b, c, d}, {-1, 1}, {p, q}]
Out[12]= 
異なる核を選択することでListConvolveおよびListCorrelateを異なる種類の計算に使用できる.
データの移動平均を見付ける.
In[13]:= ListCorrelate[{1,1,1}/3, {a,b,c,d,e}, {-1,1}]
Out[13]= 
これはガウス型の核である.
In[14]:= kern = Table[Exp[-n^2/100]/Sqrt[2. Pi], {n, -10, 10}] ;
データを生成する.
In[15]:= data = Table[BesselJ[1, x] + 0.2 Random[ ], {x, 0, 10, .1}] ;
このデータをプロットしたものである.
In[16]:= ListPlot[data];

核にデータをたたみ込む.
In[17]:= ListConvolve[kern, data, {-1, 1}] ;
結果はデータが滑らかになる.
In[18]:= ListPlot[%]

Out[18]= 
ListConvolveおよびListCorrelateを用いて,数値と同様に記号を扱うことができる.
要素が記号の2つのリストのたたみ込みを形成する.
In[19]:= ListConvolve[{a,b,c}, {u,v,w}, {1, -1}, 0]
Out[19]= 
結果は多項式の積を展開した係数と合致する.
In[20]:= Expand[(a + b x + c x^2)(u + v x + w x^2)]
Out[20]= 
ListConvolveおよびListCorrelateは任意次元のデータに使用できる.
ファイルから画像データをインポートする.
In[21]:= g = ReadList["fish.data", Number, RecordLists->True];
画像を示す.
In[22]:= Show[Graphics[Raster[g], AspectRatio->Automatic]]

Out[22]= 
データを2次元の核とたたみ込む.
In[23]:= ListConvolve[{{1,1,1},{1,-8,1},{1,1,1}}, g] ;
データに対応する画像を示す.
In[24]:= Show[Graphics[Raster[%], AspectRatio->Automatic]]

Out[24]= 

多次元データを処理するための他の関数
|