Skip to content

Instantly share code, notes, and snippets.

@keizerzilla
Created May 10, 2021 22:57
Show Gist options
  • Save keizerzilla/b7f8e55c82346068c716362c25b766c6 to your computer and use it in GitHub Desktop.
Save keizerzilla/b7f8e55c82346068c716362c25b766c6 to your computer and use it in GitHub Desktop.
Simples gerador de amostras sintéticas a partir de distâncias. Requisitos: numpy scikit-learn.
def gera_amostras(dados, k_vizinhos=5, k_amostras=5):
"""
Simples gerador de amostras sintéticas a partir de distâncias. A partir de duas
amostras P e Q do conjunto de k_amostras, gera uma terceira R igual ao ponto médido
de P e Q.
Requisitos: numpy scikit-learn.
Parâmetros
----------
dados : - matriz numpy com de dimensão (n_amostras, n_atributos)
k_vizinhos=5 : - quantidade de vizinhos usados para amostragem
- quanto mais vizinhos maior a probabilidade de amostras esparsas
k_amostras=5 : - quantidade de amostras sintéticas a serem geradas
- a quantidade máxima possível é limitada por n_amostras
Retorno
-------
novo_dados : - matriz com (n_amostras + k_amostras, n_atributos)
"""
import numpy as np
from sklearn.neighbors import NearestNeighbors
p_indices = np.random.permutation(dados.shape[0])[:k_amostras]
p = dados[p_indices]
neigh = NearestNeighbors(k_vizinhos=k_vizinhos)
neigh.fit(dados)
kn = neigh.kneighbors(p, return_distance=False)
q_indices = kn[:,np.random.randint(1, k_vizinhos)]
q = dados[q_indices]
novo_dados = np.append(dados, (p + q) / 2, axis=0)
return novo_dados
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment