Refatoração dos particionadores; Início da implementação do particionamento pelo c-means
This commit is contained in:
parent
84b29bcdf7
commit
8cdbfbf537
@ -1,20 +0,0 @@
|
|||||||
import numpy as np
|
|
||||||
import math
|
|
||||||
from pyFTS import *
|
|
||||||
|
|
||||||
#print(common.__dict__)
|
|
||||||
|
|
||||||
def GridPartitionerTrimf(data,npart,names = None,prefix = "A"):
|
|
||||||
sets = []
|
|
||||||
dmax = max(data)
|
|
||||||
dmax = dmax + dmax*0.10
|
|
||||||
dmin = min(data)
|
|
||||||
dmin = dmin - dmin*0.10
|
|
||||||
dlen = dmax - dmin
|
|
||||||
partlen = math.ceil(dlen / npart)
|
|
||||||
partition = math.ceil(dmin)
|
|
||||||
for c in range(npart):
|
|
||||||
sets.append(common.FuzzySet(prefix+str(c),common.trimf,[round(partition-partlen,3), partition, partition+partlen], partition ) )
|
|
||||||
partition = partition + partlen
|
|
||||||
|
|
||||||
return sets
|
|
75
partitioners/CMeans.py
Normal file
75
partitioners/CMeans.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import numpy as np
|
||||||
|
import math
|
||||||
|
import random as rnd
|
||||||
|
import functools,operator
|
||||||
|
from pyFTS import *
|
||||||
|
|
||||||
|
def distancia(x,y):
|
||||||
|
if isinstance(x, list):
|
||||||
|
tmp = functools.reduce(operator.add, [(x[k] - y[k])**2 for k in range(0,len(x))])
|
||||||
|
else:
|
||||||
|
tmp = (x - y) ** 2
|
||||||
|
return math.sqrt(tmp)
|
||||||
|
|
||||||
|
|
||||||
|
def c_means(k, dados, tam):
|
||||||
|
|
||||||
|
# Inicializa as centróides escolhendo elementos aleatórios dos conjuntos
|
||||||
|
centroides = [dados[rnd.randint(0, len(dados))] for kk in range(0, k)]
|
||||||
|
|
||||||
|
grupos = [-1 for x in range(0, len(dados))]
|
||||||
|
|
||||||
|
it_semmodificacao = 0
|
||||||
|
|
||||||
|
# para cada instância
|
||||||
|
iteracoes = 0
|
||||||
|
while iteracoes < 1000 and it_semmodificacao < 10:
|
||||||
|
inst_count = 0
|
||||||
|
|
||||||
|
modificacao = False
|
||||||
|
|
||||||
|
for instancia in dados:
|
||||||
|
|
||||||
|
# verifica a distância para cada centroide
|
||||||
|
grupo_count = 0
|
||||||
|
dist = 10000
|
||||||
|
|
||||||
|
grupotmp = grupos[inst_count]
|
||||||
|
|
||||||
|
for grupo in centroides:
|
||||||
|
tmp = distancia(instancia, grupo)
|
||||||
|
if tmp < dist:
|
||||||
|
dist = tmp
|
||||||
|
# associa a a centroide de menor distância à instância
|
||||||
|
grupos[inst_count] = grupo_count
|
||||||
|
grupo_count = grupo_count + 1
|
||||||
|
|
||||||
|
if grupotmp != grupos[inst_count]:
|
||||||
|
modificacao = True
|
||||||
|
|
||||||
|
inst_count = inst_count + 1
|
||||||
|
|
||||||
|
if not modificacao:
|
||||||
|
it_semmodificacao = it_semmodificacao + 1
|
||||||
|
else:
|
||||||
|
it_semmodificacao = 0
|
||||||
|
|
||||||
|
# atualiza cada centroide com base nos valores médios de todas as instâncias à ela associadas
|
||||||
|
grupo_count = 0
|
||||||
|
for grupo in centroides:
|
||||||
|
total_inst = functools.reduce(operator.add, [1 for xx in grupos if xx == grupo_count], 0)
|
||||||
|
if total_inst > 0:
|
||||||
|
if tam > 1:
|
||||||
|
for count in range(0, tam):
|
||||||
|
soma = functools.reduce(operator.add,
|
||||||
|
[dados[kk][count] for kk in range(0, len(dados)) if grupos[kk] == grupo_count])
|
||||||
|
centroides[grupo_count][count] = soma / total_inst
|
||||||
|
else:
|
||||||
|
soma = functools.reduce(operator.add,
|
||||||
|
[dados[kk] for kk in range(0, len(dados)) if grupos[kk] == grupo_count])
|
||||||
|
centroides[grupo_count] = soma / total_inst
|
||||||
|
grupo_count = grupo_count + 1
|
||||||
|
|
||||||
|
iteracoes = iteracoes + 1
|
||||||
|
|
||||||
|
return centroides
|
23
partitioners/Grid.py
Normal file
23
partitioners/Grid.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import numpy as np
|
||||||
|
import math
|
||||||
|
import random as rnd
|
||||||
|
import functools,operator
|
||||||
|
from pyFTS import *
|
||||||
|
|
||||||
|
#print(common.__dict__)
|
||||||
|
|
||||||
|
def GridPartitionerTrimf(data,npart,names = None,prefix = "A"):
|
||||||
|
sets = []
|
||||||
|
dmax = max(data)
|
||||||
|
dmax = dmax + dmax*0.10
|
||||||
|
dmin = min(data)
|
||||||
|
dmin = dmin - dmin*0.10
|
||||||
|
dlen = dmax - dmin
|
||||||
|
partlen = math.ceil(dlen / npart)
|
||||||
|
partition = math.ceil(dmin)
|
||||||
|
for c in range(npart):
|
||||||
|
sets.append(common.FuzzySet(prefix+str(c),common.trimf,[round(partition-partlen,3), partition, partition+partlen], partition ) )
|
||||||
|
partition = partition + partlen
|
||||||
|
|
||||||
|
return sets
|
||||||
|
|
0
partitioners/__init__.py
Normal file
0
partitioners/__init__.py
Normal file
Loading…
Reference in New Issue
Block a user