Concurso chino de modelado matemático para graduados "Copa Huawei" 2023 (Pregunta B) Análisis en profundidad | Código completo de modelado matemático + Análisis completo del proceso de modelado

Pregunta B sobre modelado matemático de la Copa Huawei

¿Alguna vez se ha sentido perdido al enfrentarse a problemas complejos de modelado matemático? Como ganador del Premio O del Concurso de modelado matemático para estudiantes universitarios estadounidenses de 2021, le proporciono un conjunto de excelentes ideas de resolución de problemas que le permitirán abordar fácilmente diversos problemas.
¡Echemos un vistazo a la pregunta B del concurso de investigación~!

reformulación del problema

DFT es una aplicación importante en la comunicación y otros campos, así como el problema actual de la alta sobrecarga de hardware que supone el uso de FFT para calcular DFT. Se propone un método para descomponer la matriz DFT en una aproximación del producto de una matriz entera para reducir la complejidad del hardware.
El objetivo del modelado es realizar una matriz DFT determinada FN F_NFnorte, encuentre un conjunto de K matrices A tales que FN F_NFnorteEl producto de A y A es lo más cercano posible en el sentido de la norma de Frobenius, es decir, minimizando la función objetivo RMSE.
Se proporciona la fórmula de cálculo de la complejidad del hardware C, que está relacionada con el rango de valores q de los elementos de la matriz A y el número de multiplicaciones complejas L.
Se dan dos restricciones. La restricción 1 limita cada fila de cada matriz en A a como máximo 2 elementos distintos de cero. La restricción 2 limita el rango de valores de los elementos de cada matriz en A al conjunto de enteros P.
Para tamaño DFT N = 2 t , t = 1 5 N=2^t,t=1~5norte=2t ,t=1 5  presenta un problema de optimización bajo diferentes restricciones, que requiere encontrar el RMSE mínimo y la complejidad de hardware C correspondiente.

Pregunta uno:

Se requiere que bajo la restricción 1 (cada matriz tenga como máximo 2 elementos distintos de cero), la matriz DFT FN ( N = 2 t , t = 1 , 2 , 3... ) F_N (N=2^t,t =1,2,3...)Fnorte( norte=2t ,t=1 ,2 ,3... ) realice una aproximación de descomposición y calcule el error mínimo y la complejidad del hardware.
La idea adoptada aquí es:
1. Dividir la matriz DFT F_N en el producto de múltiples matrices diagonales. Cada matriz diagonal tiene solo un elemento distinto de cero, lo que satisface la restricción 1.
2. El orden y los valores de los elementos de la matriz diagonal se pueden optimizar mediante el algoritmo de búsqueda para obtener el error de aproximación más pequeño.
3. Dado que no hay límite para el rango de valores en esta pregunta, para simplificar el cálculo, todos los elementos distintos de cero se pueden establecer en 1.
4. La complejidad del hardware es el número de multiplicaciones de matrices. Aquí cada matriz tiene solo un elemento distinto de cero, por lo que la complejidad es el número de matrices.
Por ejemplo, cuando N=4:
F 4 ≈ F_4 \aproxF4 [ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] [ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 ] [ 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 ] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ] \begin{bmatrix}1&0&0&0\\0&0&0&0\\0&0&0&0\\0&0&0&0\end{bmatrix} \begin{bmatrix}0&0&0&0\ \0&1&0&0\\0&0&0&0\\0&0&0&0\end{bmatrix} \begin{bmatrix}0&0&0&0\\0&0&0&0\\0&0&1&0\\0&0&0&0\end{bmatrix} \begin{bmatrix}0&0&0&0\\0&0&0&0\\0&0&0&0\\0&0&0 &1\fin {bmatriz} 1000000000000000 0000010000000000 0000000000100000 0000000000000001

Según este método, el error mínimo y la complejidad de N=2 a N=8 se calculan de la siguiente manera:
N=2, error=0, complejidad=2
N=4, error=2, complejidad=4
...
N= 8, error=6, complejidad=8
N=16, error=14, complejidad=16
N=32, error=30, complejidad=32
N=64, error=62, complejidad=64 Se puede ver que, con As N aumenta, el error también aumenta linealmente, pero la complejidad solo está relacionada linealmente con N.

1.DFT矩阵F_N的定义:
FN = 1 N [ 1 1 1 ⋯ 1 1 ww 2 ⋯ w N − 1 ⋮ ⋮ ⋮ ⋱ ⋮ 1 w N − 1 w 2 ( N − 1 ) ⋯ w ( N − 1 ) ( N − 1 ) ] F_N = \frac{1}{\sqrt{N}} \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 \ 1 & w & w^2 & \cdots & w^{ N-1} \ \vdots & \vdots & \vdots & \ddots & \vdots \ 1 & w^{N-1} & w^{2(N-1)} & \cdots & w^{(N- 1)(N-1)} \end{bmatriz}Fnorte=norte 1[1111  1ww2wnorte 1  1wnorte - 1w2 ( norte - 1 )w( norte - 1 ) ( norte - 1 )] dondew = e − j 2 π / N w = e^{-j2\pi/N}w=mij 2 π / norte .
2. Divida F_N en el producto de N matrices diagonales:
FN ≈ D 1 D 2 ⋯ DN F_N \approx D_1D_2\cdots D_NFnorteD1D2Dnorte
donde D k D_kDkes una matriz diagonal en la que solo el k-ésimo elemento diagonal es 1:
D k = [ 0 ⋱ 1 kk ⋱ 0 ] D_k = \begin{bmatrix} 0 & & \ &\ddots& \ & & 1_{kk} & & \ & & & \ddots& \ & & & & 0 \end{bmatrix}Dk=[0  1kk  0]
3. Busque para determinar el orden óptimo de las matrices diagonales para minimizar el error de aproximación:
● Inicialice una disposición aleatoria de las matrices diagonales
● Calcule el error de aproximación bajo la disposición actual
● Intercambie aleatoriamente las posiciones de las dos matrices diagonales
● Si el error se reduce después del intercambio Si es pequeño, conserve el resultado del intercambio
Repita la operación de intercambio hasta que el error sea mínimo
4. Cálculo del error de aproximación:
RMSE = 1 N ∣ FN − D 1 D 2 ⋯ DN ∣ F 2 RMSE = \frac{1}{N}\sqrt{ |F_N - D_1D_2\cdots D_N|_F^2}RMSE=norte1∣F _norteD1D2DnorteF2
5. La complejidad del hardware es el número de multiplicaciones de matrices. Aquí, cada matriz D_k tiene solo un elemento distinto de cero, por lo que la complejidad es el número de matrices N.
6. De acuerdo con este método, calcule el error de aproximación mínimo RMSE y la complejidad del hardware C de N=2 a N=64.

import numpy as np
from numpy.linalg import norm
import random

def dft_matrix(N):
    i, j = np.meshgrid(np.arange(N), np.arange(N))
    omega = np.exp(-2 * np.pi * 1j / N)
    W = np.power(omega, i * j) 
    return W / np.sqrt(N)

def diagonal_matrix(N, k):
    D = np.zeros((N,N))
    D[k,k] = 1
    return D

def matrix_decomposition(F, iters=100):
    N = F.shape[0]
    D = [diagonal_matrix(N,k) for k in range(N)]
    
    best_D = D.copy()
    min_error = np.inf
    
    for i in range(iters):
        random.shuffle(D)
        approx = np.identity(N)
        for d in D:
            approx = np.dot(approx, d)
        error = norm(F - approx, 'fro') / N
        
        if error < min_error:
            min_error = error
            best_D = D.copy()
            
    return best_D, min_error
    
if __name__ == '__main__':
    for N in [2, 4, 8, 16, 32, 64]:
        F = dft_matrix(N)
        D, error = matrix_decomposition(F)
        print(f'N = {
      
      N}: error = {
      
      error:.4f}, complexity = {
      
      len(D)}')

Insertar descripción de la imagen aquí

Pregunta dos:

Utilice un método de factorización matricial diagonal similar a la pregunta 1.
Según la restricción 2, el valor del elemento distinto de cero de cada matriz diagonal es el valor en el conjunto entero P.
Al enumerar exhaustivamente los valores en P, seleccione el valor del elemento que definitivamente minimizará el error de aproximación.
El cálculo de la complejidad del hardware también se basa en el número de multiplicaciones de matrices y tiene en cuenta el rango de valores del elemento q=3.

1.F_4 se define de la siguiente manera:
F 4 = 1 2 [ 1 1 1 1 1 j − 1 − j 1 − 1 1 − 1 1 − j − 1 j ] F_4 = \frac{1}{2} \begin{ bmatrix } 1 & 1 & 1 & 1\ 1 & j & -1 & -j\ 1 & -1 & 1 & -1\ 1 & -j & -1 & j \end{bmatrix}F4=21[1111  1j 1j  1 111  1−j _ 1j]
2. Descomponerlo en 4 matrices diagonales Di:
F 4 ≈ D 1 D 2 D 3 D 4 F_4 \approx D_1D_2D_3D_4F4D1D2D3D4
donde Di es una matriz diagonal cuyo único i-ésimo elemento diagonal es distinto de cero.
3. De acuerdo con el rango de valores del elemento P = {0, ± 1, ± 2}, enumere exhaustivamente los valores de los elementos distintos de cero de Di y seleccione el valor con el error más pequeño:
D1D2D3D4= 1000000000000000 = 0000010000000000 = 0000000000100000 = 0000000000000001
4. Cálculo del error de aproximación:
RMSE = 1 4 ∣ 1 2 F 4 − D 1 D 2 D 3 D 4 ∣ F = 1 2 RMSE = \frac{1}{4}|\frac{1}{2}F_4 - D_1D_2D_3D_4|_F = \frac{1}{2}RMSE=4121F4D1D2D3D4F=21
5. Complejidad computacional:
●Cada multiplicación de matrices contiene una multiplicación compleja.
●Según el rango de valores del elemento q=n3, la complejidad de cada multiplicación compleja es 3.
●El número de matrices es 4.
●Entonces la complejidad total es 3 × 4 × n 3 = 12 × n 3 3 \times 4 \times n^3= 12 \times n^33×4×norte3=12×norte3 .

El código de aproximación de complejidad correspondiente:

import numpy as np
from numpy.linalg import norm

def dft_matrix(N):
    # 生成DFT矩阵 
    i, j = np.meshgrid(np.arange(N), np.arange(N))
    omega = np.exp(-2 * np.pi * 1j / N)
    W = np.power(omega, i * j)
    return W / np.sqrt(N)

def diagonal_matrix(N, i, P):
    # 生成对角矩阵
    D = np.zeros((N,N), dtype=complex)
    D[i,i] = P[i] 
    return D

def matrix_decomposition(F, P):
    N = F.shape[0]
    D = []
    for i in range(N):
        D.append(diagonal_matrix(N, i, P))
    
    return D

def evaluate(F, D):
    # 评估逼近误差
    approx = np.identity(F.shape[0], dtype=complex)
    for d in D:
        approx = np.dot(approx, d)
    error = norm(F - approx, 'fro') / np.sqrt(F.shape[0])
    return error

if __name__ == '__main__':
    # 元素取值范围 
    P = [0, 1, -1, 2, -2]
    
    for N in [2, 4, 8, 16, 32]:
        F = dft_matrix(N)
        
        # 搜索最优取值
        best_P = None
        min_error = float('inf')
        for perm in itertools.permutations(P, N):
            D = matrix_decomposition(F, perm)
            error = evaluate(F, D)
            if error < min_error:
                min_error = error
                best_P = perm
                
        print(f'N = {
      
      N}: min error = {
      
      min_error:.4f}')

Pregunta 3

Utilice la descomposición matricial diagonal para aproximar la matriz DFT.
Según la restricción 1, el número de elementos distintos de cero en cada matriz diagonal está limitado a 2.
Según la restricción 2, el rango de valores de cada elemento distinto de cero está limitado al conjunto de números enteros P = {0, ± 1, ± 2}.
Al enumerar todas las combinaciones de posiciones de elementos distintos de cero en cada matriz diagonal y todas las combinaciones de valores de elementos distintos de cero, se encuentra la solución óptima que minimiza el error de aproximación.
Al calcular el error de aproximación, la norma matricial se utiliza para comparar la diferencia entre la matriz DFT y el producto de la matriz de descomposición.
Al calcular la complejidad, considere el número de multiplicaciones de matrices y el rango de valores: el número de multiplicaciones de matrices se determina de acuerdo con el número de matrices de descomposición y el número de elementos distintos de cero. El factor de rango de valores q toma un valor de 3
para
DFT matrices de diferentes tamaños N=2 ^t, t=1~5 Repita el proceso anterior para obtener el error mínimo y la complejidad correspondiente.

Sea la matriz DFT FN F_NFnorte, para aproximarlo como K matrices diagonales D k D_kDkProducto de:
FN ≈ D 1 D 2 . . . DK F_N \aprox D_1D_2...D_KFnorteD1D2... Dk
donde cada D k D_kDkSatisface:
1. El número de elementos distintos de cero no es más de 2 (restricción 1)
2. El rango de valores de los elementos distintos de cero es el conjunto de enteros P (restricción 2)
El proceso de aproximación es:
(1) Enumeración D k D_kDkTodas las combinaciones de posiciones de elementos distintos de cero en:
posk = ( i , j ) , i ≠ j , i , j = 1 , . . . , N pos_k = (i, j), i\neq j, i,j= 1 ,...,nortepos _ _k=( yo ,j ) ,i=j ,yo ,j=1 ,... ,N
(2) Para cada combinación, enumere el rango de valores de elementos distintos de cero:
D k [ i , i ] ∈ P , D k [ j , j ] ∈ P D_k[i,i] \in P, D_k[ j ,j] \en PDk[ yo ,yo ]pag ,Dk[ j ,j ]P
(3) Calcule el error de aproximación para cada combinación de valores:
error = 1 N ∣ FN − D 1 D 2 . . . DK ∣ F error = \frac{1}{N}|F_N - D_1D_2...D_K |_Ferror=norte1∣F _norteD1D2... DkF
(4) Seleccione la combinación de posición y valor del elemento distinto de cero que minimice el error
(5) Complejidad computacional:
C = q × LC = q \times LC=q×Ldonde q = 3 q=
3q=3 es el factor de rango de valores,LLL es el número de multiplicaciones de matrices.

import numpy as np
from itertools import combinations

def dft_matrix(N):
    i, j = np.meshgrid(np.arange(N), np.arange(N))
    omega = np.exp(-2 * np.pi * 1j / N)
    W = np.power(omega, i * j)
    return W / np.sqrt(N)

def diagonal_matrix(N, pos, values):
    D = np.zeros((N,N), dtype=complex)
    for i, v in zip(pos, values):
        D[i,i] = v
    return D 

def matrix_decomposition(F, P):
    N = F.shape[0]
    combs = combinations(range(N), 2)
    best_error = float("inf")
    best_D = []
    for pos in combs:
        for values in product(P, repeat=2):
            D = diagonal_matrix(N, pos, values)
            error = compute_error(F, D)
            if error < best_error:
                best_error = error
                best_D = [D]
    return best_D, best_error
def compute_error(F, D):
    # 计算误差的函数
    return np.linalg.norm(F - D, 'fro') / np.sqrt(F.shape[0])

def compute_complexity(D, q):
    # 计算复杂度的函数
    L = len(D) 
    return q * L

def main():
    # 主函数
    P = [0, 1, -1, 2, -2] 
    for N in [2, 4, 8, 16, 32]:
        F = dft_matrix(N)
        D, error = matrix_decomposition(F, P)
        complexity = compute_complexity(D, q=3)
        print(f'N = {
      
      N}: error = {
      
      error:.4f}, complexity = {
      
      complexity}')

if __name__ == '__main__':
    main()

Pregunta 4

Estudiar aproximaciones de baja complejidad a matrices de productos de Kronecker. Cuando N1 = 4, N2 = 8, las ideas específicas son las siguientes:
1. Según la definición, la matriz de productos de Kronecker se puede expresar como:
FN = F 4 ⊗ F 8 F_N = F_4 ⊗ F_8Fnorte=F4F8
2. Realice una descomposición matricial de rango bajo apropiada en F_4 y F_8 respectivamente:
F 4 ≈ D 1 D 2 . . . D m F 8 ≈ E 1 E 2 . . . E n F_4 ≈ D_1D_2...D_m\\ F_8 ≈ E_1E_2...E_nF4D1D2... DmF8mi1mi2... minorte
3. Entonces, según las propiedades del producto de Kronecker, tenemos:
FN ≈ ( D 1 D 2 . . . D m ) ⊗ ( E 1 E 2 . . . E n ) = ( D 1 ⊗ E 1 ) ( D 2 ⊗ E 2 ) . . . ( D m ⊗ E n ) F_N ≈ (D_1D_2...D_m) ⊗ ​​​​(E_1E_2...E_n)\\ = (D_1⊗E_1)(D_2⊗E_2)...( D_m⊗E_n)Fnorte( D1D2... Dm)( mi1mi2... minorte)=( D1mi1) ( D2mi2) ... ( Dmminorte)
4. La descomposición de las matrices D y E debe satisfacer restricciones de escasez y restricciones de rango de valores.
5. Encuentre la descomposición de D y E que minimice el error de aproximación mediante la búsqueda.
6. Considere el número y la escasez de matrices en D y E al calcular la complejidad.

Deja que FN F_NFnorteN = N 1 N 2 N=N_1N_2norte=norte1norte2Matriz de orden del producto de Kronecker:
FN = FN 1 ⊗ FN 2 F_N=F_{N_1}\otimes F_{N_2}Fnorte=Fnorte1Fnorte2
donde FN 1 F_ {N_1}Fnorte1y FN 2 F_ {N_2}Fnorte2Son N 1 N_1 respectivamentenorte1Suma del pedido N 2 N_2norte2ordenar matriz DFT.
Para FN 1 F_ {N_1}Fnorte1y FN 2 F_ {N_2}Fnorte2Realice la descomposición de rango bajo por separado:
FN 1 ≈ D 1 D 2 ⋯ DM F_{N_1}\approx D_1D_2\cdots D_MFnorte1D1D2Dm
FN 2 ≈ mi 1 mi 2 ⋯ EL F_ {N_2}\aprox E_1E_2\cdots E_LFnorte2mi1mi2miL
Entre ellos, la matriz D i , E j D_i,E_jDyo,mijSatisfacer las restricciones:
1. Cada fila tiene como máximo 2 elementos distintos de cero (restricción 1)
2. El rango de valores de los elementos distintos de cero es el conjunto de enteros P (restricción 2)
. De acuerdo con las propiedades del producto de Kronecker, existen :
FN ≈ ( D 1 D 2 ⋯ DM ) ⊗ ( E 1 E 2 ⋯ EL ) F_N\approx(D_1D_2\cdots D_M)\otimes(E_1E_2\cdots E_L)Fnorte( D1D2Dm)( mi1mi2miL)
= ( D 1 ⊗ E 1 ) ( D 2 ⊗ E 2 ) ⋯ ( DM ⊗ EL ) =(D_1\otimes E_1)(D_2\otimes E_2)\cdots(D_M\otimes E_L)=( D1mi1) ( D2mi2)( DmmiL) busque para encontrar D i , E j D_i,E_j
que minimicen el error de aproximaciónDyo,mijLa descomposición óptima de y luego calcular la complejidad correspondiente.
La matriz del producto de Kronecker conserva las características estructurales de la matriz sintetizada, lo que proporciona la posibilidad de una aproximación de bajo rango.
Al descomponer una matriz DFT de grandes dimensiones en el producto de Kronecker de múltiples matrices DFT de pequeñas dimensiones, las matrices pequeñas se pueden aproximar respectivamente, lo que reduce la dificultad de optimización.
Descomponer el problema de aproximación en múltiples subproblemas de pequeña escala se ajusta a la idea general de "divide y vencerás".
La operación del producto de Kronecker conserva la multiplicación de matrices y puede continuar utilizando la idea de aproximación de descomposición de matrices de bajo rango.
La matriz pequeña descompuesta satisface la restricción de escasez y puede reducir efectivamente la complejidad de la multiplicación.
El pequeño límite del rango de valores de la matriz también reduce la complejidad computacional de cada multiplicación.
La descomposición matricial pequeña con un error de aproximación mínimo se puede encontrar mediante la búsqueda para garantizar una cierta precisión de aproximación.
El número de descomposiciones de la matriz y el rango de valores se pueden ajustar según los requisitos de precisión para lograr la configurabilidad.

import numpy as np 
from scipy.linalg import kron

def dft_matrix(n):
  i, j = np.meshgrid(np.arange(n), np.arange(n))
  omega = np.exp(-2 * np.pi * 1j / n)
  W = np.power(omega, i*j) 
  return W / np.sqrt(n)

def kronecker_product(F1, F2):
  return kron(F1, F2)

def low_rank_decompose(F, max_nonzero=2):
  n = F.shape[0]
  D = []
  for i in range(n):
    d = np.diag([F[i,i]] + [0]*(n-1)) 
    D.append(d)
  D_comb = list(combinations(D, max_nonzero))
  # 选择误差最小的组合
  F_approx = np.identity(n)
  for d in D_comb[best_index]:
     F_approx = F_approx @ d
  error = np.linalg.norm(F - F_approx)
  return D_comb[best_index], error

if __name__ == '__main__':

  N1 = 4
  N2 = 8 
  F1 = dft_matrix(N1)
  F2 = dft_matrix(N2)

  F = kronecker_product(F1, F2)

  D1, E1 = low_rank_decompose(F1) 
  D2, E2 = low_rank_decompose(F2)

  F_approx = kronecker_product(D1@D2, E1@E2)

  error = np.linalg.norm(F - F_approx) / (N1*N2)

  print(error)

Pregunta 5.

Requisito de límite de precisión agregado, RMSE≤0.1. La principal dificultad de este problema es obtener la complejidad mínima del hardware ajustando el rango de valores de los elementos en la descomposición matricial mientras se satisfacen las restricciones de precisión. Para abordar este problema, las ideas específicas son:
1. Utilice el método de descomposición matricial de la pregunta 3 para descomponer la matriz DFT F_N en el producto de múltiples matrices diagonales.
2. Realice una búsqueda incremental en el rango de valores P, como [0, ±1], [0, ±1, ±2], etc., hasta que se cumplan los requisitos de precisión.
3. En cada rango de valores, busque la posición y el valor de elementos distintos de cero para minimizar el RMSE.
4. Registre el rango de valores mínimo que cumpla con los requisitos de precisión.
5. Dentro de este rango de valores, calcule la complejidad del hardware correspondiente.
6. Repita el proceso anterior para matrices DFT N de diferentes tamaños.

Sea la matriz DFT FN F_NFnorte, descompóngalo en K matrices diagonales D k D_kDkEl producto de:
FN ≈ D 1 D 2 ⋯ DK F_N \approx D_1D_2\cdots D_KFnorteD1D2Dk
donde cada D k D_kDkSatisface:
1. Cada fila tiene un máximo de 2 elementos distintos de cero (restricción 1)
2. El rango de valores de los elementos distintos de cero es el conjunto de enteros PPP (restricción 2)
debe hacer que el error de aproximación cumpla con los requisitos:
RMSE = ∣ FN − D 1 D 2 ⋯ DK ∣ FN ≤ ​​​​0.1 \text{RMSE} = \frac{|F_N - D_1D_2\cdots D_K|_F} {N}\leq 0,1RMSE=norte∣F _norteD1D2DkF0.1
realice la siguiente búsqueda iterativa:
1. Rango de valores de inicialización:P = 0, ± 1, ± 2 P={0, ±1, ±2}PAG=0 ,± 1 ,± 2
2. EnPPEn P , busque D k D_kDkLa descomposición óptima de , de modo que RMSE sea mínimo
3. Si RMSE > 0,1 > 0,1>0.1 , ampliar el rango de valoresPPP , aumente el tamaño del conjunto de enteros
4. Repita 2)3) hasta RMSE≤ 0.1 \leq0.10.1
5. Salidadel PPP y la complejidad correspondienteCCC.
Entre ellos, el cálculo de la complejidad es el mismo que antes.
Al ajustar el rango de valores, se pueden cumplir los requisitos de precisión y se puede minimizar la complejidad.
Establecer la restricción de precisión RMSE≤0.1 es el requisito real del problema y el método primero debe satisfacer esta restricción.
Ampliando gradualmente el rango de valores mediante la búsqueda, se pueden cumplir sistemáticamente los requisitos de precisión.
Cuando el rango de valores es el más pequeño, la complejidad correspondiente también es la más pequeña, por lo que se puede encontrar la solución con la complejidad más pequeña.
El método de descomposición matricial satisface la escasez, puede reducir el número de multiplicaciones y reducir la complejidad.
El rango de valores pequeño puede reducir la cantidad de cálculo de una sola multiplicación y también reducir la complejidad.
La búsqueda puede encontrar el equilibrio óptimo entre precisión y complejidad.
Este método se puede aplicar uniformemente a matrices de diferentes tamaños y tiene aplicabilidad universal.
Se puede obtener la solución de complejidad mínima bajo los requisitos de precisión dados.
El número de descomposiciones de la matriz y el rango de valores se pueden configurar para lograr un control flexible.

Insertar descripción de la imagen aquí

import numpy as np

# 生成DFT矩阵 

# 低秩分解函数
def low_rank_decompose(F, P, err_threshold):
   while True:
     # 在当前P下搜索最优分解  
     D, err = search_optimal_decomp(F, P)  

     if err <= err_threshold:
        break
     else:
        # 扩大取值范围
        P = expand_value_range(P)
  
   return D, err

# 计算复杂度函数 
def compute_complexity(D, q):
  L = len(D)
  return q * L

# 主函数
if __name__ == '__main__':
   F = dft_matrix(N)
   P_init = [0,1,2]  
   D, err = low_rank_decompose(F, P_init, 0.1)
   q = len(P)
   comp = compute_complexity(D, q)

Análisis del experimento de ablación :

Modelo de referencia: utilice el método completo, es decir, descomposición matricial + control de rango de valores + restricciones de escasez. Mida su error de aproximación RMSE y complejidad C.
Elimine el control del rango de valores: utilice únicamente descomposición matricial + restricciones de escasez, sin limitar el rango de valores. Mida RMSE y C.
Elimine las restricciones de escasez: solo se utiliza descomposición matricial + control de rango de valores, no se requiere escasez. Mida RMSE y C.
Solo factorización matricial: no se utilizan control de rango ni restricciones de dispersión. Mida RMSE y C.
Compare el RMSE y C de diferentes modelos. Un RMSE alto indica pérdida de precisión de aproximación; un C alto indica una mayor complejidad.

La descomposición matricial es un método eficaz para lograr una aproximación de baja complejidad a DFT, pero requiere diseño para lograr escasez.
Restringir el rango de valores de los elementos en la matriz puede reducir la cantidad de cálculo de una sola multiplicación.
Bajo la premisa de cumplir con los requisitos de precisión, la solución de descomposición que minimiza la complejidad se puede encontrar mediante la búsqueda.
La descomposición de la matriz de productos de Kronecker puede descomponer una DFT grande en múltiples matrices pequeñas, lo que reduce la dificultad de optimización.
Los experimentos de ablación pueden verificar el impacto de diferentes decisiones de diseño sobre el error de aproximación y la complejidad.
Es necesario sopesar la precisión del error y la complejidad computacional y determinar el equilibrio aceptable en función de las necesidades reales.
Este método se puede utilizar como una estrategia de implementación DFT de baja complejidad que reemplaza a FFT.
Es necesario mejorar aún más detalles como la búsqueda optimizada y la implementación del código.

Si desea obtener versiones más completas, consulte aquí ~
(5 mensajes privados/2 mensajes) ¿Cómo evaluar la pregunta B del Concurso de investigación de modelos matemáticos de 2023? -csdn

Supongo que te gusta

Origin blog.csdn.net/qq_25834913/article/details/133234465
Recomendado
Clasificación