1 votos

¿Qué función kernel puede utilizarse para proyectar datos en un espacio de características que es un "círculo"?

Estoy trabajando con datos cíclicos (Días 1-7, horas 1-24). Quiero proyectarlo en un espacio de características que pueda entender que el 1 y el 7 son días cercanos y el 1 y el 24 están más cerca que el 22 y el 24, etc, y luego haré clustering k-means usando kkmeans en R.

¿Consigue esto un RBF guassiano? Sospecho que no. Si no es así, ¿puede alguien ayudarme a pensar en un núcleo, preferiblemente uno de esta lista (con parámetros modificados posiblemente) para no tener que reprogramarlo?

rbfdot Radial Basis kernel "Gaussian"
polydot Polynomial kernel
vanilladot Linear kernel
tanhdot Hyperbolic tangent kernel
laplacedot Laplacian kernel
besseldot Bessel kernel
anovadot ANOVA RBF kernel
splinedot Spline kernel
stringdot String kernel

Parece que podría ser algo así como (por días)

d(x,y) = min(d(x,y),d(x+7,y))

¿Crees que es posible programar esto en el paquete de k-means? Parece difícil de modificar ya que mucho está escrito en FORTRAN

2voto

Jamie Ide Puntos 28680

¿Qué pasa con el uso de una función cíclica como, por ejemplo, un onda sinusoidal como núcleo? Así que su transformación del núcleo sería algo así como:

$ f = 24 \\ t = (x_1 - x_2)\\ k(x_1,x_2) = \sin(t * \pi / f) $

Por supuesto, hay una ligera asimetría aquí entre las distancias, incluso mejor sería utilizar función de onda triangular :

$ f=24 \\ t = (x_1 - x_2)\\ k(x_1,x_2) = | 2 t/f - \lfloor t/f + 0.5 \rfloor | $

Lo que revela el siguiente gráfico al trazar la similitud para, digamos, la hora 0:

enter image description here

Código para generar este gráfico en python:

import matplotlib as plt
import numpy as np

def kernel1(x1,x2):
    freq = 24.0 #hours
    t = x1-x2
    value = np.abs(np.sin(t*np.pi/freq))

    return value
def kernel2(x1,x2):
    a = 24.0
    t = (x1-x2)
    value = np.abs( 2.0* (t/a - np.floor(t/a + 0.5)) )    
    return value 

hours = np.array(range(0,47))
hourtocompareto = 0
similarities1 = [kernel1(hourtocompareto,hour) for hour in hours]
similarities2 = [kernel2(hourtocompareto,hour) for hour in hours]

plt.plot(hours,similarities1,color="blue")
plt.plot(hours,similarities2,color="red")
plt.ylabel('Similarity')
plt.xlabel('Lag')
plt.show()

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