Recuperar conjunto de datos de un diccionario
Tengo una función que divide un conjunto de datos en un entorno no iid. Esta función devuelve un diccionario de las etiquetas:
“`
def noniid(dataset, clients, min, max, equal_amount=False):
len_dataset = len(dataset)
samples_per_client = int(len_dataset/clients)
idx = np.arange(len_dataset) #idx([0, 1, 2, …, 59999])
dict_users = {i: list() for i in range(clients)}
if equal_amount==False: #diferentes clientes pueden tener cantidades de datos muy diferentes
random_num_size = np.random.randint(min, max+1, size=clients)
print(f"Número total de muestras propiedad de los clientes: {sum(random_num_size)}")
<pre><code># el conjunto de datos total debe ser mayor o igual a la suma del conjunto de datos dividido.
assert len_dataset >= sum(random_num_size)
if (len_dataset == sum(random_num_size)): #cada muestra será utilizada
# dividir y asignar
for i, rand_num in enumerate(random_num_size):
rand_set = set(np.random.choice(idx, rand_num, replace=False))
idx = list(set(idx) – rand_set)
dict_users[i] = rand_set
else: #si no se usan todas las muestras, se asignan todas las muestras sin usar restantes al último cliente
for i, rand_num in enumerate(random_num_size):
if(i==clients-1):
dict_users[i] = idx #asignar todas las muestras restantes al último cliente
else:
rand_set = set(np.random.choice(idx, rand_num, replace=False))
idx = list(set(idx) – rand_set)
dict_users[i] = rand_set
return dict_users
</code></pre>
else: #cada cliente tiene el mismo número de muestras<br>
for i in range(clients):
dict_users[i] = set(np.random.choice(idx, samples_per_client, replace=False))
idx = list(set(idx) – dict_users[i])
<pre><code>return dict_users
</code></pre>
<code>
Por ejemplo, si aplico esta función a un conjunto de datos, obtengo esto:
</code>
{0: {65536,
65540,
5,
65544,
13,
15,
65552,
32785,
65553,
18,
…
{1: {8,
150,
…
“`
Ahora, a partir de este diccionario, quiero obtener el conjunto de datos original dividido tal como se establece en el diccionario. Por ejemplo, el dataset0 tendrá las muestras 65536, 65540, y así sucesivamente, el dataset1 tendrá 8, 150 y así sucesivamente.
davy.ai
Para obtener el conjunto de datos original dividido según lo especificado por el diccionario, podemos utilizar el diccionario devuelto por la función para crear una lista de conjuntos de datos donde cada conjunto de datos corresponde a un cliente. Podemos hacer un bucle a través del diccionario y para cada cliente, podemos crear un nuevo conjunto de datos extrayendo las muestras que están presentes en el conjunto asociado con ese cliente en el diccionario.
Aquí hay un fragmento de código de ejemplo:
Luego podemos usar esta función de la siguiente manera: