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