【連続系】MATLAB、Pythonで株価予測 その74【フーリエ変換⑪】

【連続系】MATLAB、Pythonで株価予測 その74【フーリエ変換⑪】 株価予測
【連続系】MATLAB、Pythonで株価予測 その74【フーリエ変換⑪】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/

はじめに

前回は、元の数式を確認後、MATLABによるフーリエ変換、逆フーリエ変換をfor文無しの行列演算を書いてみた。
予想通りではあるが、1発の演算になる。
for文版、行列版のどちらを採用しても良いが、本シリーズに於いてはfor文版をベースとする。

そして、前回のコードでちょっと気になる点が出てくる・・・。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

前回のコードで気になる点

太郎くん
太郎くん

ちょっと前回のコードで気になる点があるんだけど?

フクさん
フクさん

気になる点?
どこの話?

太郎くん
太郎くん

ちょっと、元の数式と前回のコードを再掲するね。

\(
\displaystyle \left[\begin{array}{c} F\left(x_{-N/2}\right) \\ \vdots \\ F\left(x_{N/2}\right) \end{array}\right]^{T}=\left[\begin{array}{c} f\left(x_{-N/2}\right) \\ \vdots \\ f\left(x_{N/2}\right) \end{array}\right]^{T}\left[\begin{array}{ccc} e^{-i \omega_{-N/2} t_{-N / 2} \pi} & \cdots & e^{-i \omega_{-N / 2} t_{N / 2} \pi} \\ \vdots & \ddots & \vdots \\ e^{-i \omega_{N / 2} t_{-N / 2} \pi} & \cdots & e^{-i \omega_{N / 2} t_{N / 2} \pi} \end{array}\right] \Delta t
\)

\(
\displaystyle \left[\begin{array}{c} f\left(x_{-N/2}\right) \\ \vdots \\ f\left(x_{N/2}\right) \end{array}\right]^{T}=\frac{1}{2 \pi}\left(\left[\begin{array}{c} F\left(\omega_{-N/2}\right) \\ \vdots \\ F\left(\omega_{N/2}\right) \end{array}\right]^{T}\left[\begin{array}{ccc} e^{i \omega_{-N/2} t_{-N / 2} \pi} & \cdots & e^{i \omega_{-N / 2} t_{N / 2} \pi} \\ \vdots & \ddots & \vdots \\ e^{i \omega_{N / 2} t_{-N / 2} \pi} & \cdots & e^{i \omega_{N / 2} t_{N / 2} \pi} \end{array}\right]\right) \Delta \omega
\)

% F(ω)=∫f(t)e^(-iωt)dt
Fw=ft*exp(-1j*w'*t)*dt;

% f(x)=(1/2π)∫F(ω)e^(iωt)dω
x=t;
fx=Fw*exp(1j*w'*x)*dw/(2*pi);
太郎くん
太郎くん

数式と一緒と言ってたけど、
よくよく見ると、どこがどう一緒なのかがわからんな・・・。
って思って。

フクさん
フクさん

なるほど。
確かにコード上では直接、行列を作ってるところは無いからな。
その疑問もうなづける。

太郎くん
太郎くん

臭いところとしては「w’t」と「w’x」だけど、
これらって行列じゃなくてベクトルだよね?
そして、それらの内積を計算してる?

フクさん
フクさん

臭いポイントとしてはあってる。
ただし、その部分の演算は内積ではないな。
列ベクトルと行ベクトルの直積を取って、元の数式上の行列を実現している。

太郎くん
太郎くん

直積?

フクさん
フクさん

普通、ベクトルの積は内積になるのだけど、
内積の前提条件は行ベクトル×列ベクトル
今回やってるのは列ベクトル×行ベクトル
って形でやってる。

太郎くん
太郎くん

何を言ってるのかわからん。

内積と直積

フクさん
フクさん

まぁ簡単な処理を見せた方が早そうだな。

>> A=1:9

A =

     1     2     3     4     5     6     7     8     9

>> B=(1:9)'

B =

     1
     2
     3
     4
     5
     6
     7
     8
     9

>> A*B

ans =

   285

>> B*A

ans =

     1     2     3     4     5     6     7     8     9
     2     4     6     8    10    12    14    16    18
     3     6     9    12    15    18    21    24    27
     4     8    12    16    20    24    28    32    36
     5    10    15    20    25    30    35    40    45
     6    12    18    24    30    36    42    48    54
     7    14    21    28    35    42    49    56    63
     8    16    24    32    40    48    56    64    72
     9    18    27    36    45    54    63    72    81

>> 
太郎くん
太郎くん

!!
最初のA*Bは内積だけど、 次のB*Aが直積か!
確かに行列になってる!

フクさん
フクさん

まぁ例でも書いたように九九のようなことが出来る。

太郎くん
太郎くん

演算順序で性格が変わるとは・・・。

フクさん
フクさん

ベクトル、行列は交換法則が使えないことが多いからね。
入れ替えた際の処理の違いは注意が必要だ。

太郎くん
太郎くん

しかし、一発で九九の表が完成するのは面白いな。

太郎くん
太郎くん

でも、これってPython(Numpy)でも出来るものなのかな?

フクさん
フクさん

私もそこが気になっている。
まぁ実際に試してみるしかないな。
いきなりフーリエ変換、逆フーリエ変換のコードを書く前に
Numpyでも直積が効くかを確認した方が安全かも。

太郎くん
太郎くん

うーん、なんか罠があるパターンに見えるな・・・。

まとめ

フクさん
フクさん

まとめだよ。

  • 前回のコード上で数式上の行列にあたる部分が見当たらない。
    • 列ベクトルと行ベクトルによる直積を行って行列を生成している。
  • 直積は九九の表をイメージすると分かり易いかも。
  • Python(Numpy)で同様のことができるかは不明。
    • よって、先に直積相当のことができる確認した方が吉。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました