Ruido aleatorio
- Crea una serie de copias de la matriz original (o de parte de ella)
- Crea perturbaciones de ese tamaño:
import numpy
numcasos,numvariab = copia.shape
ruido = numpy.random.randn(numcasos,numvariab)*varianza # ¿Cómo de gordo?
- Súmale el ruido a la copia
Regresión de puntos próximos
Usando solo numpy
Revisa y corrige/adapta la siguiente función (que solo procesa un vector nuevo cada vez)
import numpy as np
def KNN(matrizconocidos,variabnuevo,numvecinos):
numvariab=len(variabnuevo)
#Calcular distancia ¿euclídea?
dist_sal = np.array([[np.sum((variabnuevo-vecviej[:numvariab])**2),vecviej[numvariab]] for vecviej in matrizconocidos])
#Ordenar por distancia
mat = dist_sal[dist_sal[:,0].argsort()]
#Calcular la ¿media? de los numvecinos
sale = np.mean(mat[0:k,numvariab])
return sale
Usando scipy para crear un árbol KD
Revisa y corrige/adapta el siguiente código, que usa toda una matriz de nuevos vectores
from scipy.spatial import KDTree
import numpy
numvariab=len(variabnuevos[0])
arbol = KDTree(matrizconocidos[:,:numvariab])
_, ind = arbol.query(variabnuevos, k=numvecinos)
#¿Mediana en vez de media?
salen=numpy.median(matrizconocidos[ind],axis=1)
Usando scikit-learn para hacer todo
Revisa y corrige/adapta el siguiente código, que usa toda una matriz de nuevos vectores
from sklearn.neighbors import NearestNeighbors
numvariab=len(variabnuevos[0])
vecprox = NearestNeighbors(n_neighbors=numvecinos,p=2) #p=1 para Manhattan
vecprox.fit(matrizconocidos[:,:numvariab],matrizconocidos[:,numvariab])
salen=vecprox.predict(variabnuevos)