-
Notifications
You must be signed in to change notification settings - Fork 0
/
agrupador.py
56 lines (46 loc) · 2.17 KB
/
agrupador.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# -*- coding: utf-8 -*-
#+--------------------------------------------------------------------------+#
# Importem mòduls #
#+--------------------------------------------------------------------------+#
import random
import numpy as np
#+--------------------------------------------------------------------------+#
# Definim les classes #
#+--------------------------------------------------------------------------+#
class Agrupador():
def __init__(self, train, k, operador):
self._train = train
self._k = k
self._operador = operador
self._results = []
self._distancies = {}
for i in range(k):
self._results.append([self._train[random.randint(0, len(self._train)-1)], []])
def calcula_distancies(self):
for fitxer in self._train:
self._distancies[fitxer] = []
for grup in range(self._k):
self._distancies[fitxer].append(self._operador.calcula_distancia(fitxer, self._results[grup][0]))
def calcula_grups(self):
for fitxer in self._distancies:
self._results[self._distancies[fitxer].index(min(self._distancies[fitxer]))][1].append(fitxer)
def calcula_representant(self):
for group in range(self._k):
vegada = 0
for arxiu in self._results[group][1]:
if vegada == 0:
mitjana = arxiu.representation
vegada += 1
else:
mitjana += np.sum(arxiu.representation)
mitjana = mitjana/len(self._results[group][1])
llista_distancies = []
for arxiu in self._results[group][1]:
llista_distancies.append((arxiu, self._operador.calcula_distancia(arxiu, mitjana, True)))
new = sorted(llista_distancies, key=lambda x: x[1])[0][0]
if self._results[group][0] == new: acaba = True
else: acaba = False
self._results[group][1] = []
return acaba
def get_results(self):
return self._results