畳み込み

1.畳み込みとは
 畳み込み(たたみこみ、英: Convolution)とは、2つの関数を合わせて新しい関数を作る数学的な操作です。主に信号処理や画像処理、機械学習(特に畳み込みニューラルネットワーク、CNN)で広く使用されます。
 畳み込みの基本的な概念を理解するために、1次元の畳み込みについて説明します。2つの関数fとgの連続的な畳み込み(畳み込み積分)は、以下のように定義されます。

2.連続的な畳み込み(畳み込み積分)
 畳み込みは2つの関数を操作して新しい関数を生成する数学的な操作です。

畳み込みを視覚的に理解するために、例として、次の関数の畳み込みを考えます。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad

# Parameters
t = np.linspace(-10, 10, 800)  # Time range
tau_shift = 5  # Shift for the g(τ - t) plot
a = 1  # Parameter for the exponential function

# Define the functions
def f(t, a):
    return np.exp(-a * t) * (t >= 0)

def g(t):
    return np.heaviside(t, 1)

# Numerical convolution using scipy's quad
def numerical_convolution(t, a):
    result = np.zeros_like(t)
    for i in range(len(t)):
        if t[i] >= 0:
            result[i], _ = quad(lambda tau: f(tau, a) * g(t[i] - tau), 0, t[i])
    return result

# Compute the functions
f_tau = f(t, a)
g_tau = g(t)
y_t = numerical_convolution(t, a)

# Compute g(τ - t)
g_tau_t = g(tau_shift - t)

# Plot the functions
plt.figure(figsize=(10, 10))

# Plot f(τ)
plt.subplot(4, 1, 1)
plt.plot(t, f_tau, label=r'$f(\tau) = e^{-a\tau}$')
plt.xlabel('Time $\tau$')
plt.ylabel(r'$f(\tau)$')
plt.title(r'Function $f(\tau)$')
plt.legend()
plt.grid(True)

# Plot g(τ)
plt.subplot(4, 1, 2)
plt.plot(t, g_tau, label=r'$g(\tau) = u(\tau)$')
plt.xlabel('Time $\tau$')
plt.ylabel(r'$g(\tau)$')
plt.title(r'Step Function $g(\tau)$')
plt.legend()
plt.grid(True)

# Plot g(τ - t)
plt.subplot(4, 1, 3)
plt.plot(t, g_tau_t, label=r'$g(\tau - t)$ with $\tau = ' + str(tau_shift) + r'$')
plt.xlabel('Time $t$')
plt.ylabel(r'$g(\tau - t)$')
plt.title(r'Reversed and Shifted Step Function $g(\tau - t)$ with $\tau = ' + str(tau_shift) + r'$')
plt.legend()
plt.grid(True)

# Plot y(t) (Convolution result)
plt.subplot(4, 1, 4)
plt.plot(t, y_t, label=r'$y(t)$ (Numerical Convolution)', linestyle='--')
plt.xlabel('Time $t$')
plt.ylabel('$y(t)$')
plt.title(r'Convolution of $f(t)$ and Step Function $g(t)$')
plt.legend()
plt.grid(True)

# Adjust layout
plt.tight_layout()
plt.show()

3.離散的な畳み込み(畳み込み和)

y=[0. 1. 2.5 4. 5.5 7. 2.5]

# -*- coding: utf-8 -*-
import numpy as np

f = np.array([1, 2, 3, 4, 5])
g = np.array([0, 1, 0.5])

# 畳み込みの計算
conv_result = np.convolve(f, g, mode='full')
print(conv_result)