Fourier変換についてメモ

Fourier変換

Fourier変換って何?という話が出ていて、 結局話の流れには関係なかったけど、 そのうち使うかもしれないし、この機会に知識を書き下してみようと思った。

→結局、よく知らないことが分かったので、Fourier変換についてのメモと呼ぶには少し不十分っぽくなった。

写像

A,Bを集合とする。 Aの元それぞれに対して、Bの元を一つ指定する規則のことをAからBへの写像といい、

{ \displaystyle
f:A \rightarrow B
}

のように表す。 ただし、f写像の名前。 A定義域始域ドメインソースなどと、B値域終域ドメインターゲットなどと呼ぶ。

実数の集合を\mathbb{R}とする。\mathbb{R}から\mathbb{R}への写像には

{ \displaystyle
f(x) = 3x+5,
}

{ \displaystyle
g(x) = 3cosx +4sinx
}

などがある (もちろん、もっとたくさん、いくらでもある。式で書けるほうが珍しい)。 写像は、この例のようにターゲットが数の集合である場合には特に、関数と呼ばれることが多い。 (べつに数でなくても関数と呼んで構わないが、混乱の恐れがあるのでそうしないほうが良いと思う)

音は時刻の関数である

音とは、波である。 各時刻における波の変位(空気の圧力)が正確にわかれば、元の音を再現できる。 つまり、音とは、各時刻tに変位を対応させる規則のことである。 たとえば、開始からt秒後の変位が\sin(440t)であるような音は、「ラ」とか「A」と呼ばれる。 音とは、時刻の関数である。

音の重ね合わせ

音は波なので、重ね合わせが起こる。 関数として見れば、重ね合わせとは単純に元の関数たちを足し合わせるだけで、たとえば「ドミソ」の音は 関数

{ \displaystyle
\sin(261t)+\sin(329t)+\sin(391t)
}

で表せる(ちゃんと調べていないのでちょっとずつ違うかも)。 「ラ」と1オクターブ低い「ラ」と1オクターブ高い「ラ」が重なった音は

{ \displaystyle
\sin(440t)+\sin(220t)+\sin(880t)
}

で表せる。

音の判定

時刻の関数f(t)が(三角関数みたいなわかりやすい形に限らず)与えられたとき、それがどの音たちの重ね合わせかを調べる方法はあるか?

→ある。Fourier変換。

Fourier級数展開

Fourier変換について書こうと思ったが、結局Fourier級数展開について書くにとどまった。

予備知識

tの関数の集合

{ \displaystyle
\left\{ \frac{1}{\sqrt 2}, \sin(2 \pi t), \cos(2 \pi t), \sin(2\cdot 2\pi t), \cos(2\cdot 2\pi t), \cdots, \sin(2n \pi t), \cos(2n \pi t) \right\}
}

に属する2つの元f,gについて、積の積分

{ \displaystyle
\int_{0}^{1} f(t)g(t) dt
}

は、f=gの場合のみ\frac{1}{2}となり、 f\neq gの場合は0となる。

証明は、

{ \displaystyle
\sin \alpha \sin \beta = \frac{\cos(\alpha -\beta) -\cos(\alpha +\beta)}{2}
}

等の恒等式を知っていればやさしい。

有限和で書ける場合のFourier係数の計算

関数f(t)は、定数項と三角関数の組み合わせで

{ \displaystyle
f(t) = c +a_1\sin(2\pi t) +b_1\cos(2\pi t) +a_2\sin(2\cdot 2\pi t) +b_2\cos(2 \cdot 2\pi t) +\cdots +a_n\sin(2n\pi t) +b_n\cos(2n\pi t)
}

と書けるものとする。 このとき、

{ \displaystyle
c = \int_{0}^{1}f(t)dt,
}

{ \displaystyle
a_k = 2\int_{0}^{1}f(t)\sin(2\pi kt)dt,
}

{ \displaystyle
b_k = 2\int_{0}^{1}f(t)\cos(2\pi kt)dt
}

となる。 このことは、各式の右辺を計算することで簡単に確かめられる。(上に書いた予備知識を使う)

Fourier級数

{ \displaystyle
c +a_1\sin(2\pi t) +b_1\cos(2\pi t) +a_2\sin(2\cdot 2\pi t) +b_2\cos(2\cdot 2\pi t) +\cdots
}

の形の級数をFourier級数という。 a_k, b_kをFourier係数という。

重要な定理

[ 0,1 ] で定義された関数f(t)は、あまり変なものでなければ*1、Fourier級数で表せる。*2 具体的には、

{ \displaystyle
c = \int_{0}^{1}f(t)dt,
}

{ \displaystyle
a_k = 2\int_{0}^{1}f(t)\sin(2\pi kt)dt,
}

{ \displaystyle
b_k = 2\int_{0}^{1}f(t)\cos(2\pi kt)dt
}

として、

{ \displaystyle
c +a_1\sin(2\pi t) +b_1\cos(2\pi t) +a_2\sin(2\cdot 2\pi t) +b_2\cos(2\cdot 2\pi t) +\cdots
}

と書ける。*3 このことから、周期関数はFourier級数で表せることが分かる。

Fourier級数展開

上の定理のように、関数をFourier級数で表すことをFourier級数展開という。 音の話に戻れば、Fourier級数展開とは、音を一定の高さの音の重ね合わせとして表示することにあたる。

たとえば、音fをFourier級数展開して

{ \displaystyle
f(t) = 3\sin(220t) +10\sin(440t) +2\sin(880t) +(\mbox{無視できるほど小さい係数の項})
}

となったとすると、f倍音の混じった「ラ」の音を表していると解釈できる。

Fourier変換

関数fと「周波数」kから、 fにおける周波数kの成分の「強さ」を、 積分を使って計算できることがわかった。 この「ある周波数成分の強さ」を計算する操作を一般化したもの*4がFourier変換である。 必要ならちゃんと調べて書くけど、とりあえずここまで。

*1:ここで詳しく説明するつもりはないが、例えばL^{2}([0,1])の元であればよい

*2:厳密には、各点で級数が収束してfに一致するという意味ではない。この等しさの意味をきちんと説明しようとすると長くなる

*3:このことは、有限和の場合と違って明らかではない。無限級数の扱いの難しさについては、機会があればそのうち書きたい

*4:ある区間に限った関数とか周期関数でなくても計算する

回帰と分類についてメモ

回帰

回帰(かいき) regression りぐれっしょん

回帰の例

ある森のヒノキの直径から、高さを推定する。

数学的には

ヒノキの直径をX, 高さをYとして、

{ \displaystyle
Y = f(X)
}

となるような関数fを作ればよい。 もちろん厳密に等しくなることは期待できないので、誤差が小さくなるようなfを目指す。

機械学習では

fがたとえば

{ \displaystyle
f(X) = aX +b
}

という形の場合は、このモデルはa,bという2つのパラメータを持つことになる。 訓練データを使って、パラメータa,bを正解に近づくように(誤差が小さくなるように)調整することを、学習と呼ぶ。

モデルの選択の仕方はいろいろ考えられる。

{ \displaystyle
f(X) = aX^{2} +bX +c
}

とか。 どのモデルを選択するかは、たぶんかなり難しい問題。

分類

クラス化(classification、くらしふぃけいしょん)とクラスタリング(clustering)がある。

classificationの例

数字が一つ書かれた画像が、何を表すものかを分類する。

数学的には

画像は、ベクトル(数値の並び)として扱うことができる。 たとえば10×10ピクセルの白黒の画像であれば、 すべての成分が0(黒)か1(白)であるようなサイズ100のベクトルと見ることができる。 このベクトルXに対して、 g(X)がその画像の表す数になるような関数gを作ればよい。

回帰との関連

画像Xの「3っぽさ」「3以外ではないっぽさ」に点数をつける関数hがある場合、

  • h(X)がある値以上であれば、画像Xは3を表すものと判断する

という方法が考えられる。 この方法で分類を試みる場合、hを構成するプロセスは回帰である。

clusteringの例

ECサイトユーザの商品購買履歴から、利用の傾向を分類する (ことで、同じグループのユーザが買う傾向にある商品をおすすめとして表示する)。

classificationとclustering

classificationでは、分類の各クラスにラベルがついている。 (画像が「0」,「1」,「2」,...のどれに属するかを判定する、みたいな。)

clusteringでは、ラベルはつかない。 (このユーザとこのユーザは似ている、みたいな。どういうグループかは考えない。) (分類した後で「ミステリーばっかり買う人たち」「野菜ジュースをよく買う人たち」みたいな分析をしてもよいけど。)

機械学習の言葉では、教師あり学習による分類はclassification, 教師なし学習による分類はclusteringと言える。