Ruido aleatorio

  1. Crea una serie de copias de la matriz original (o de parte de ella)
  2. Crea perturbaciones de ese tamaño:
    import numpy
    
    numcasos,numvariab = copia.shape 
    ruido = numpy.random.randn(numcasos,numvariab)*varianza # ¿Cómo de gordo?
    
  3. 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)