domingo, 13 de dezembro de 2009

Problema 9.3

Este problema envolve a criação da lista de centróides a partir do número de agrupamentos pretendidos, e do dicionário de dados. Este dicionário está organizado de modo que cada chave é um inteiro e o valor o tuplo com as coordenadas do ponto. Os membros da lista devem ser escolhidos aleatoriamente e não pode haver repetições.
Uma solução simplista será:

import random

def cria_centroides(k,dicio_dados):
“”” Devolve lista de k centroides escolhidos aleatoriamente.”””
centroides = []
chaves_centroides = []
conta_centroides = 0
while centroides < k:
chave_alea = random.randint(1,len(dicio_dados))
if chave_alea not in chaves_centroides:
centroides.append(dicio_dados[chave_alea])
chaves_centroides.append(chave_alea)
conta_centroides = conta_centroides + 1
return centroides

Existem variantes. Apresentamos uma, que se nos afigura mais elegante.

import random

def cria_centroides_b(k,dicio_dados):
“”” Devolve lista de k centroides escolhidos aleatoriamente.”””
centroides = []
chaves_centroides = []
for i in range(k):
chave_alea = random.randint(1,len(dicio_dados))
while chave_alea in chaves_centroides:
chave_alea = random.randint(1,len(dicio_dados))
centroides.append(dicio_dados[chave_alea])
chaves_centroides.append(chave_alea)
return centroides

Veja-se como o ciclo for trata do problema da contagem e como asseguramos a não repetição com um ciclo while no interior do ciclo for.

4 comentários:

  1. Stor eu ponho a dicionário e o programa nao me devolve nada....
    poderia ajudar?

    obrigado

    ResponderEliminar
  2. Sem mais elementos é difícil. Tem que criar um dicionário de dados concreto. Ou o faz com a operação cria_dicio_dados(emno_do_ficheiro_de_dados) ou inventa um para testar. Depois chama cria_centroides como um numero concreto de agrupamentos e com o dicionário criado, e manda imprimir o resultado.
    Por exemplo:

    >>> dicio_dados= {1:(1,2),2:(4,5),3:(5,6),4:(8,9),5:(2,7)}
    >>> print cria_centroides(3,dicio_dados)

    ResponderEliminar
  3. Professor, queria fazer um reparo.
    Não sei se estou correcto, mas onde está na linha 6(chave_centroides=[]) nao deveria estar(chaves_centroides=[])?
    Isto porque dentro do ciclo while estão definidas operações em relação a uma lista, denominada chaves_centroides, que não está definida anteriormente.

    ResponderEliminar
  4. Está certo sim senhor. Foi já emendado. Na realidade as soluções que apresentei aqui não foram a que inicialmente pensei e por isso não as testei...

    ResponderEliminar