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á:
01.import random
02. 
03.def cria_centroides(k,dicio_dados):
04.    “”” Devolve lista de k centroides escolhidos aleatoriamente.”””
05.   centroides = []
06.   chaves_centroides = []
07.   conta_centroides = 0
08.   while centroides < k:
09.      chave_alea = random.randint(1,len(dicio_dados))
10.      if chave_alea not in chaves_centroides:
11.         centroides.append(dicio_dados[chave_alea])
12.         chaves_centroides.append(chave_alea)
13.         conta_centroides = conta_centroides + 1
14.    return centroides

Existem variantes. Apresentamos uma, que se nos afigura mais elegante.
01.import random
02. 
03.def cria_centroides_b(k,dicio_dados):
04.    “”” Devolve lista de k centroides escolhidos aleatoriamente.”””
05.   centroides = []
06.   chaves_centroides = []
07.   for i in range(k):
08.      chave_alea = random.randint(1,len(dicio_dados))
09.      while chave_alea in chaves_centroides:
10.         chave_alea = random.randint(1,len(dicio_dados))
11.       centroides.append(dicio_dados[chave_alea])
12.       chaves_centroides.append(chave_alea)
13.    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