13 votos

¿Por qué R tiene una definición diferente sobre la convolución?

He descubierto que la convolución en R funciona de forma diferente a la de Python. En Python, se voltea la entrada y se ejecuta la convolución.

En la documentación de R, dice

Tenga en cuenta que el habitual La definición de convolución de dos secuencias x e y viene dada por convolve(x, rev(y), type = "o").

¿Hay alguna razón detrás del enfoque diferente de R? ¿La gente de la comunidad estadística utiliza la convolución de forma diferente a la de la comunidad de procesamiento de señales?

Un ejemplo en R:

x = c(c(1,2,3,4),rep(0,4))
y = c(c(5,6,7,8),rep(0,4))
convolve(x,y) 

# will return 70 56 39 20  0  8 23 44

Pero en python

x = np.hstack([np.array([1,2,3,4]), np.zeros(4)])
y = np.hstack([np.array([5,6,7,8]), np.zeros(4)])

np.convolve(x, y)

# will return 5., 16., 34., 60., 61., 52., 32.

10voto

user164061 Puntos 281

Relación con las transformadas de Fourier

El convolve en R está utilizando una transformada de Fourier para calcular la convolución (esa es una fuente potencial de la diferencia, aunque no estoy seguro y no conozco los detalles).

$$ x * y = \mathcal{F}^{-1}\{\mathcal{F}\{x\} \cdot \mathcal{F}\{y\}\}$$

Pero más concretamente está utilizando el conjugado complejo, y así es como la operación vuelve la variable hacia atrás.

x = c(c(1,2,3,4),rep(0,4))
y = c(c(5,6,7,8),rep(0,4))
zx = fft(c(x))
zy = fft(c(y)) 
round(Re(fft(zx*Conj(zy), inverse = TRUE))/8)
round(Re(fft(zx*zy, inverse = TRUE))/8)

Que devuelve

[1] 70 56 39 20  0  8 23 44
[1]  5 16 34 60 61 52 32  0

No estoy seguro de por qué se utiliza el conjugado. Esta operación con el conjugado se relaciona con la convolución según

$$\mathcal{F}\{x(t) * y^*(-t)\} = \mathcal{F}\{x(t)\}\cdot\left(\mathcal{F}\{y(t)\}\right)^*$$

y si $y$ es real entonces $y = y^*$ . Y también se relaciona un poco con la correlación cruzada. En cuyo caso

$$\mathcal{F}\{x(t) * y(-t)\} = \mathcal{F}\{x(t)\}\cdot \left(\mathcal{F}\{y(t)\}\right)^*$$

Tenga en cuenta que R convolve regula esto con un parámetro conj que es verdadero por defecto y al establecerlo como falso se obtiene la convolución "normal".

convolve(x,y,conj=FALSE)

Indirectamente la pregunta podría verse como: "¿por qué R convolve utilice conj = TRUE como opción por defecto?"

Posible razón (histórica) de la diferencia

Por qué la función estándar de R para la convolución lo hace de forma inversa, o cómo llegó esto históricamente, no lo sé. Pero posiblemente el origen podría provenir del libro Series temporales: Análisis y teoría de datos de David R. Brillinger (1981), al que se hace referencia en la documentación de R. En el libro la convolución se produce de la siguiente manera:

Supongamos que los valores $X(t)$ y $Y(t)$ , $t=0,\dots,T-1$ están disponibles. A veces necesitaremos la convolución $$\sum_{0\leq {{t}\atop{t+u}} \leq T-1} X(t+u)Y(t) \quad u = 0, \pm 1, \dots \quad (3.6.1)$$

El término convolución se utiliza en un sentido más general, y más adelante en el texto se refieren a un caso específico de este tipo de convolución

Un caso en el que se podría requerir la convolución (3.6.1) es en la estimación de la función de momento $m_{12}(u) = E[X_1(t+u)X_2(t)]$ ...

También en las primeras descripciones del uso del algoritmo de la transformada rápida de Fourier (una referencia que aparece en Brillinger) utilizan la "convolución" en un sentido más amplio. En Transformadas rápidas de Fourier: para divertirse y beneficiarse AFIPS '66 (otoño): Proceedings of the November 7-10, 1966, fall joint computer conference, Gentleman and Sande write

... Hasta la fecha, los usos más importantes de la transformada rápida de Fourier han sido en relación con el teorema de convolución de la Tabla I. Algunos usos de las convoluciones numéricas son los siguientes:

Auto y covarianzas cruzadas: ...

...

...El primer uso importante del teorema de convolución, por parte de Sande, fue para calcular la autocovarianza...

Así que parece que, al menos en algunos círculos, la convolución tiene un significado más general y posiblemente los escritores de la función R encontraron la covarianza cruzada más útil para ser la norma (se menciona que es un uso importante).


Las diferencias en las convenciones también se producen (ya) para la transformación de Fourier

Como whuber señaló en los comentarios, la transformación de Fourier, de la que se puede derivar la convolución, no está definida de forma única. Hay varias convenciones para $a$ y $b$ en las fórmulas de transformación de Fourier y de transformación inversa de Fourier definidas a continuación:

$$\begin{array}{} \mathcal{F}(x) = \sqrt{\frac{|b|}{(2\pi)^{1-a}}} \int_{-\infty}^{\infty} f(t) e^{ibxt} \text{d}t \\ f(t) = \sqrt{\frac{|b|}{(2\pi)^{1+a}}} \int_{-\infty}^{\infty} \mathcal{F}(x) e^{-ibxt} \text{d}x \end{array}$$

y los diferentes campos utilizan diferentes parámetros $a$ y $b$ . El parámetro de escala $a$ no se relaciona mucho con la operación de "convolución", sino con la dirección/signo de $b$ pueden considerarse relacionados.

Personalmente me sigo preguntando si esta relación con las transformadas de Fourier (y sus ambiguas convenciones) es la razón por la que la función R es diferente.

Podemos utilizar las transformadas de Fourier para calcular una convolución, pero ¿debería ser esa la razón de la diversidad de convenciones de las convoluciones?

(Nota: En el caso de las transformadas de Fourier puede ser útil tener diferentes convenciones, dependiendo del campo. Porque las transformaciones de funciones particulares, que son más/menos relevantes dependiendo del campo, podrían tener alguna forma simple o no dependiendo de la convención).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X