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.
Stor eu ponho a dicionário e o programa nao me devolve nada....
ResponderEliminarpoderia ajudar?
obrigado
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.
ResponderEliminarPor exemplo:
>>> dicio_dados= {1:(1,2),2:(4,5),3:(5,6),4:(8,9),5:(2,7)}
>>> print cria_centroides(3,dicio_dados)
Professor, queria fazer um reparo.
ResponderEliminarNã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.
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