2 votos

¿Qué función del núcleo para el clasificador Watson Nadaraya?

Estoy tratando de implementar un Clasificador Watson Nadaraya . Hay una cosa que no he entendido de la ecuación:

$${F}(x)=\frac{\sum_{i=1}^n K_h(x-X_i) Y_i}{\sum_{i=1}^nK_h(x-X_i)}$$

¿Qué debo utilizar para el núcleo K?

Tengo un conjunto de datos bidimensional que tiene 1000 muestras (cada muestra es así: [-0.10984628, 5.53485135] ).

Lo que me confunde es que, basándome en mis datos, la entrada de la función kernel será algo así:

K([-0.62978309,  0.10464536])

Y por lo que entiendo, producirá algún número en lugar de un array, por lo que puedo seguir calculando F(x) que también será un número. Luego comprobaré si es > o <= que cero. Pero no he podido encontrar ningún núcleo que produzca un número. Así que confundido.

Edición: He intentado implementar mi clasificador basado en los comentarios, pero he obtenido una precisión muy baja. Agradezco si alguien se da cuenta de lo que está mal.

def gauss(x):
        return (1.0 / np.sqrt(2 * np.pi)) * np.exp(- 0.5 * x**2)

def transform(X, h):
        A = []
        for i in X:
                A.append(stats.norm.pdf(i[0],0,h)*stats.norm.pdf(i[1],0,h))
        return A

    N = 100
    # pre-assign some mean and variance
    mean1 = (0,9)
    mean2 = (0,5)
    cov = [[0.3,0.7],[0.7,0.3]]

    # generate a dataset
    dataset1 = np.random.multivariate_normal(mean1,cov,N)
    dataset2 = np.random.multivariate_normal(mean2,cov,N)
    X = np.vstack((dataset1, dataset2))

    # pre-assign labels
    Y1 = [1]*N
    Y2 = [-1]*N
    Y = Y1 + Y2
    # assing a width
    h = 0.5

    #now, transform the data
    X2 = transform(X, h)

    j = 0
    predicted = []

    for i in X2:
            # apply the equation
            fx = sum((gauss(i-X2))*Y)/float(np.sum(gauss(i-X2)))
            # if fx>0, it belongs to class 1
            if fx >0:
                    predicted.append(1)
            else:
                    predicted.append(-1)
            j = j+1

2voto

Peter Puntos 11

Podrías tomar $K_h$ sea la función de densidad de una distribución gaussiana bivariada, con media $x$ , matriz de covarianza $hI$ y evaluado en $X_i$ ...

2voto

Marc-Andre R. Puntos 789

En su ejemplo, la función del núcleo sólo toma un argumento: $x-X_i$ Así que definitivamente no pasarás

K([-0.62978309,  0.10464536])

En general, el núcleo siempre tiene otro argumento, $h$ -- el ancho de banda. Puedes usar el consejo de @DavidR, sólo para el caso univariante. Entonces tu función kernel será:

K <- function(x,h)dnorm(x,mu=0,sd=h)

Así que para sus datos el $F$ podría calcularse de la siguiente manera:

F <- function(x,X,Y,h) {
   kk <- K(x-X,h)
   sum(kk*Y)/sum(kk)
}

Puede encontrar otros ejemplos en wikipedia. En esta lista se supone que $K_h(x)=K(x/h).$

Actualización

Si $X$ es bidimensional, entonces el consejo de @DavidR se aplica directamente:

K <- function(X,h) {
  dnorm(X[,1],mu=0,sigma=h)*dnorm(X[,2],mu=0,sd=h)
}

aquí utilicé el hecho de que la densidad de la normal multivariante con media cero y matriz de covarianza $hI$ es sólo un producto de densidades normales univariantes. Nótese que tomo sd=h no sd=\sqrt{h} para que la fórmula $K_h(x)=K(x/h)$ se mantiene, por lo que la matriz de covarianza de la normal es en realidad $h^2I$ en mi código.

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