

個人的な興味から、機械学習における基本的な多層パーセプトロンについて、入力や重み行列を行列データでなく(数学的な意味での)関数として表した表現を考えています。

入力をバッチ次元xデータ次元yなf(x,y)  
重みをデータ次元yニューロン次元zなg(y,z)  
としたとき、行列積に相当する計算は、おそらく

∫f(x,y)*g(y,z)dy (でy=0〜nの定積分)

のようになるだろうという所までは考えを進めました。

そしてこの形がほぼシフト値0の相互相関関数に近いという事までは調べる事ができたのですが、相互相関関数は一般的に一変数のもので、多変数のものがあったとしてもx,y,zの3変数を用いてyを定積分で潰す形について説明している資料が見つけられませんでした。

行列積を一般化しただけなので、この形はそれほど特殊ではなく一般的な名称があるのではないかと考えたのですが、そのようなものをご存知であれば教えていただきたいのです。

* * *

**追記1**  
コメントを受け、誤解を招きそうな部分を追記で補います。最終的な目的は、行列の全てのパラメータを連続化し、xy平面を成す関数として捉え直し、それをもってパーセプトロンを記述することです。

まず行列を、2つのインデックス(i,j)を引数にとり一つの値を返す関数と見做します。このままでは(i,j)は行と列の要素を指す整数値しか取れないので、ここを一般化して中間の値を滑らかに指定できるようにすると、もはや行列はパラメータ(x,y)でxy平面を作る関数f(x,y)と見做せるであろう、という考え方をしています。

そのような関数同士の、行列積に相当する関数(汎関数でしょうか)を考えた時に上記のような形が思い当たったという経緯です。

そして、この関数の性質を更に掘り下げるため、既存の呼称やこれについて説明した資料を求めているという形になります。

行列積の関数版(パラメータ連続版)が相互相関関数であると考えた根拠として、ベクトルの内積が相互相関関数の離散版であると指摘しているサイトを参考に挙げます。

<http://hooktail.sub.jp/fourieralysis/RelationFnc/>

* * *

**追記2**  
蛇足かもしれませんが、上記の式が行列積に相当することをSympy(Python3)で確認したプログラムを貼りつけておきます。

[![行列から生成した積と関数から生成した行列積相当なものの比較](https://i.stack.imgur.com/ANQBI.png)](https://i.stack.imgur.com/ANQBI.png)

[code]

    import sympy as sp
    import numpy as np
    import matplotlib.pyplot as plt
    
    x, y, z = sp.symbols("x, y, z")
    
    
    def dot_for_functions(f, g, xs):
        h = sp.integrate(f * g, (xs, 0, 1))
        return h
    
    
    if __name__ == '__main__':
        f_xy = sp.sin(10*x) + y  # xとyの適当な関数
        g_yz = sp.sin(4*y) + sp.cos(4*z)  # yとzの適当な関数
    
        h_xz = dot_for_functions(f_xy, g_yz, y).simplify()
    
        # 値域 0to1 の 離散化した 32x32 行列として F, G, H を作成
        F = np.zeros((32, 32))
        G = np.zeros((32, 32))
        H = np.zeros((32, 32))
    
        for iy in range(0, 32):
            vy = iy / 31
            for ix in range(0, 32):
                vx = ix / 31
                vf = f_xy.subs(x, vx).subs(y, vy)
                F[ix, iy] = vf
    
        for iz in range(0, 32):
            vz = iz / 31
            for iy in range(0, 32):
                vy = iy / 31
                vg = g_yz.subs(y, vy).subs(z, vz)
                G[iy, iz] = vg
            for ix in range(0, 32):
                vx = ix / 31
                vh = h_xz.subs(x, vx).subs(z, vz)
                H[ix, iz] = vh
    
        # 行列の内積から生成したdot(F, G)が
        # 関数の内積的表現から生成したHにほぼ近いことを確認
        H_from_matrix = np.dot(F, G)
    
        plt.subplot(2, 2, 1)
        plt.imshow(F)
        plt.ylabel("F")
        plt.subplot(2, 2, 2)
        plt.imshow(G)
        plt.ylabel("G")
        plt.subplot(2, 2, 3)
        plt.imshow(H)
        plt.ylabel("H")
        plt.subplot(2, 2, 4)
        plt.imshow(H_from_matrix)
        plt.ylabel("H raw")
        plt.show()
    
[/code]

* * *

**追記3**  
頂いたコメントを読み直し、調べ直した所、関数同士の積の積分は単に関数同士の内積と呼ばれている事を理解しました。

あとははじめに示したように、行列計算と同様のf(x,y)、g(y,z)を取る場合に特別な呼称が有れば良いのですが、無ければただのそういう内積であるものとして納得しようと思います。


CC BY-SA 4.0
2021-06-16T19:40:28.697
77606
2021-06-17T14:27:26.263
2021-06-17T14:27:26.263
46896
46896
question
機械学習 数学
行列を数学的な関数と見做した時の行列積計算に相当する関数に一般的な呼称はありますか？