Buscar

Radial Basis Function(RBFs)

Prévia do material em texto

REDES NEURAIS DE BASES RADIAIS (RBFS) AGOSTO 2021 1
Trabalho Intermediário
Redes Neurais Artificiais
Prof. Braga
2021.1
João Correia Costa
I. INTRODUÇÃO
AS Redes Neurais de Base Radial (RBFs) são ampla-mente utilizadas em aplicações envolvendo interpolação
de funções multivariadas e classificação de bases de dados
complexas e não-lineares. Um importante atributo desse tipo
de rede é a simplicidade da sua arquitetura, sendo constituı́da,
em geral, de uma camada de entrada, uma única camada
escondida e uma camada de saı́da, como indicado na Fig.
1. Essa caracterı́stica é precisamente o que justifica a rápida
convergência dos algoritmos que implementam RBFs, prin-
cipalmente se compararmos essa rede ao Perceptron Multi-
camadas (MLP), o qual necessita de múltiplas projeções dos
dados de entrada nas camadas escondidas, o que exige um
maior processamento.
A camada escondida de uma RBF é constituı́da por unidades
de processamento, neurônios artificiais. Cada unidade inclui
uma função radial própria, com um centro hiperdimensional
e um raio, caracterizando uma hiperesfera. Essa camada é
responsável por incorporar a não-linearidade à rede, tornando
a classificação possı́vel pela camada de saı́da, a qual realiza
operações lineares simples sobre as respostas dos neurônios
escondidos [1].
Em teoria, estudos demonstram que o desempenho de uma
rede RBF depende, em grande medida, da escolha do número
de neurônios escondidos, e de seus respectivos centros e
raios[2, 3]. Além disso, é importante verificar a compatibil-
idade entre os algoritmos de inicialização da rede e os dados
em questão, visto que a distribuição dos dados no hiperespaço
pode suprimir o desempenho do algoritmo, mesmo que este
tenha apresentado anteriormente bons resultados em uma
variedade de datasets.
Este artigo tem como proposta realizar uma comparação de
desempenho entre três métodos de inicialização de redes neu-
rais RBF, indicados na seção IV. Para tanto, consideraremos a
acurácia média obtida a partir do mapeamento de 4 datasets:
BreastCancer, Iris, Statlog e Wine, importados do repositório
da UCI Machine Learning.
O artigo foi organizado da seguinte forma: na seção II, consta a
revisão de literatura; na seção III, descreveremos, com maior
rigor, a rede neural implementada; na seção IV, explanare-
mos sobre os algoritmos de inicialização utilizados; na seção
V, apresentaremos gráficos relacionadas ao desempenho dos
modelos para as bases de dados supracitadas; na seção VI,
concluiremos;
II. REVISÃO DE LITERATURA
Uma escolha natural para inicialização da rede neural RBF,
seria associar cada ponto do dataset ao centro de uma função
radial de modo que o número de graus de liberdade fosse igual
ao número de amostras. Segundo Chris Bishop[3], para esse
caso, a função definida pela rede classificaria perfeitamente
cada ponto. Se a base de dados tem um comportamento
regular, mas está contamida por ruido, a rede irá aprender
todos os detalhes associados a cada ponto, ao invés de absorver
o padrão dominante. Esse fenômeno é usualmente chamado
de overfitting. A função gerada apresenta grande oscilação e
baixa capacidade de generalização.
A fim de minimizar o overfitting, Cevikalp, Larlus e Ju-
rie[1] propõe um algoritmo baseado em clusters homogêneos
(HC). Segundo o artigo desenvolvido por esses pesquisadores,
Supervised Clustering Algorithm for the Initializationof RBF
Neural Network Classifiers[1], ao evitar, simultaneamente, a
presença de clusters heterogêneos e a vizinhança entre clusters
homogêneos, o HC tende a apresentar ampla capacidade de
generalização para uma diversidade de datasets.
III. DETALHES TÉCNICOS PARA A IMPLEMENTAÇÃO DA
REDE NEURAL
A rede neural implementada neste artigo tem uma arquite-
tura de três camadas feedforward, como indicado na Fig. 1. O
vetor de entrada X é propagado para os neurônios da camada
escondida, cada um dos quais aplica uma função radial própria,
dada por:
hi = h(|x− µi|) (1)
Onde µi é o centro da função de base radial hi associada ao
i-ésimo neurônio escondido e |...| indica a distância euclidiana
entre vetores. As funções hi são todas gaussianas, como
indicado na equação (2), cujos centros e raios são determi-
nados durante o processo de aprendizado, por algoritimos de
inicialização, os quais serão descritos na seção III.
hi(x) = e
−(x−µi)2/2r2i (2)
Onde ri é o raio associado ao i-ésimo neurônio escondido.
Como as funções radiais têm centros e raios fixos, pode-se
fazer uma analogia com hiperesferas. Durante o treinamento,
2 REDES NEURAIS DE BASES RADIAIS (RBFS) AGOSTO 2021
Figure 1: Arquitetura de uma Rede Neural de Base Radial. As
setas evidenciam o caráter da rede feed-forward. Os sı́mbolos
sigma na camada de saı́da indicam operações lineares de
perceptrons
essas hiperesferas devem ser espalhadas no espaço de entrada,
evitando sobreposição entre classes distintas. Após determinar
os raios e centros das funções radiais, o vetor de entrada X é
projetado na camada intermediária, resultado na matriz H .
H =

h1(x1) h2(x1) . . . hi(x1)
h1(x2) h2(x1) . . . hi(x2)
...
... . . .
...
h1(xN ) h2(xN ) . . . hi(xN )

Onde N corresponde ao número total de amostras.
Considerando que a camada intermediária foi capaz de lin-
earizar a base de dados, obtemos a saı́da da rede a partir
da combinação linear das saı́das de cada neurônio escondido,
como indicado na equação (3).
Hw = Y (3)
O vetor de pesos w pode ser facilmente obtido,
multiplicando-se a equação (3) à esquerda pela pseudo-inversa
de H . Como indicado na equação (4):
w = H+Y (4)
Onde H+ é a pseudo-inversa de H .
Neste artigo, as bases de dados consideradas apresentam
duas ou três classes distintas. Para o caso de três classes, a
matriz-coluna Y é reescrita numa matrix (NX2), através do
mapeamento indicado:01
2
− >
0 01 0
1 1

O mapeamento reescreve cada label em um vetor de duas
dimensões. Dessa forma, a equação (3) é ajustada: modelando
dois perceptrons na camada de saı́da, necessários para classi-
ficar uma base com três classes, ou um único perceptron, caso
a base tenha apenas duas classes distintas e o mapeamento
não tenha sido aplicado.
Figure 2: Algoritmos de Inicialização: a) Não-Supervisionado,
b) Supervisionado
IV. ALGORITMOS DE INICIALIZAÇÃO
Os algoritmos de inicialização de RBFs têm como obje-
tivo determinar os centros e raios da camada intermediária.
Usualmente, métodos não-supervisionados são implementados
para seleção dos parâmetros, como o algoritmo K-means.
Duas limitações desses algoritmos são: primeiro, é necessário
determinar previamente o número de clusters da camada
intermediária, segundo, a rotulação dos dados é ignorada[1].
A primeira delas; implica em inicializar o código com vários
valores do parâmetro k (número de clusters), aumentando o
custo computacional ,até identificação da faixa de valores
que se ajusta à base de dados. A segunda, pode levar a
situações como a indicada na Fig.2(a): clusters heterogêneos,
com duas classes distintas associadas ao mesmo centro, provo-
cando queda de desempenho, e cluster homogêneos que são
separados desnecessariamente em dois ou mais grupos[1].
Ao considerar o rótulo das amostras, os algoritmos super-
visionados tendem a distribuir os clusters na configuração
indicada na Fig.2(b). Clusters heterogêneos são separados e
os homogêneos conservados.
Neste artigo, analisaremos dois algoritmos não-
supervisionados: o Random e o K-means, e um supervisionado:
o Homogeneus Clustering(HC)[1].
A. Algoritmo Random
O método Randomizado é o mais simples tratado neste
artigo. Após estabelecer o número de clusters (hiperparâmetro
k), são seleciondos aleatoriamente k pares de dados do espaço
de entrada. Para cada par de dados é calculado um centro, cor-
respondendo a média aritimética do par, e um raio, associado
a distânciaeuclidiana entre os dois pontos.
B. Algoritmo k-means
O kmeans é um algoritmo de clustering não-
superviosionado, ou seja, parciona o espaço de entrada
em K grupos sem considerar a rotulação dos dados. O
objetivo do método é encontrar a configuração de clusters
que minimize a distância euclidiana média entre as amostras
e os centros. A estabilização da posição dos centros é um
indicativo de que a configuração corrente é homogênea,
isto é as distâncias médias foram minimizadas. As estapas
implementadas pelo algoritmo são:
ROBERG et al.: HIGH-EFFICIENCY DIODE AND TRANSISTOR RECTIFIERS 3
1) Especificar o número de clusters (k).
2) Selecionar aleatoriamente (k) pontos da base de dados
para inicializar os centros
3) Calcular a distância euclidiana entre os dados e os
centros.
4) Associar os dados ao centro mais próximos, formando
clusters.
5) Determinar os novos centros a partir da média dos dados
de cada cluster.
6) Retornar a etapa 3 e repetir o processo até que o
deslocamento dos centros seja inferior a um determinado
critério de convergência.
C. Algoritmo Homogeneous Clustering (HC)
O HC é um algoritmo supervisionado, em que a quantidade
de clusters e sua localização são determinados automatica-
mente ao final do processo. O método se baseia na separação
de clusters rivais com sobreposição de classes. A ideia é
garantir a homogeneidade dos grupos, ponderada por um bias.
A seguir as etapas do agoritmo[1]:
1) Escolher o número inicial (k) de clusters como o número
de classes distintas na base de dados.
2) Para todos os clusters Hi pertencente a classe i, deter-
minar a distância di entre o centro µi e o ponto mais
distante, e atribuı́-la ao raio do cluster.
3) Associar o centro a media aritmética de cada classe.
4) Calcular a distância entre todos os centros da
configuração corrente e armazenar numa matriz trian-
gular para evitar repetições.
M =

0 d12 . . . d1k
0 0 . . . d2k
...
...
. . .
...
0 0 . . . 0

Matriz Mij representando a distância dij entre os cen-
tros i e j.
5) Checar a relação entre os raios dos clusters e as
distâncias entre os centros. Há três situações possı́veis:
a) dij ≥ di+dj ; Não há intersecção entre os clusters
Hi e Hj . Não há necessidade de separação. Como
indicado na Fig.3(a).
b) dij ≤ di + dj e |di − dj | < dij ; Há intersecção
entre as hiperesferas e existem três situações
possı́veis:
i) Não há amostras na intersecção
como indicado na Fig.3(b).
Formalmente: ||xi − µi|| < ||xi + µj ||
e ||xj − µj || < ||xj + µi||; onde xi é uma
amostra do cluster Hi. Nenhum cluster
novo é criado. Todas as amostras são
classificadas corretamente.
ii) Há amostras pertencentes a Hi
na intersecção, e elas estão mais
próximas do cluster rival Hj .
Formalmente: ||xi − µi|| > ||xi + µj ||
e ||xj − µj || < ||xj + µi||; Esse caso está
Figure 3: Possı́veis cenários de intersecção entre clusters
ilustrado na Fig.3(c). O cluster Hi deve
sofrer split em dois novos clusters, se o
número de amostras xi na intersecção for
superior ao bias estabelecido.
iii) Há amostras pertencentes aos dois clusters
Hi e Hj na intersecção, que estão mais
próximas dos centros de clusters rivais do
que dos centros ao quais elas pertencem.
Formalmente: ||xi − µi|| > ||xi + µj || e
||xj − µj || > ||xj + µi||;Este caso está
ilustrado na Fig.3(d). Portanto, se o número
de amostras na intersecção for superior ao
bias, ambos os clusters devem sofrer split.
c) dij ≤ di + dj e |di − dj | ≥ dij ; Neste caso uma
das hiperesferas engloba a outra, como indicado
na Fig.3(e). O cluster maior deve sofrer split.
6) Repetir as etapas anteriores até que nenhum split seja
aplicado.
O algoritimo HC foi obtido integralmente do artigo : A
Supervised Clustering Algorithm for the Initialization of RBF
Neural Network Classifiers. (Hakan Cevikalp, Diane Larlus,
Frederic Jurie)[1]
Embora o Homogeneus Clustering (HC) evite grupamentos
como os indicados na Fig.1(a), para bases de dados de
múltiplas dimensões, é possı́vel que a existência de muitas
regiões de intersecção entre classes distintas, leve a splits
excessivos, os quais eventualmente podem gerar queda de
desempenho e elevação do custo computacional.
A separação de clusters implementada para o caso indicado
na Fig.3(e), utiliza o método K-means, com hiperparâmetro
k=2. De forma que esse algoritmo parcione o cluster maior,
eliminando a situação de ”englobamento”.
V. RESULTADOS
Nesta seção, avaliaremos o desempenho da rede neural RBF
nas bases de dados Iris, BreastCancer, Wine e Statlog. Nas
subseções relativas a cada dataset, indicamos o número de
instâncias e de classes dsitintas. A rede neural será inicializada
a partir dos algoritmos: Random, K-means e Homogeneus
Cluster.
A métrica utilizada para avaliar o desempenho foi a acurácia
média. Para os métodos Random e k-means foram realizados
4 REDES NEURAIS DE BASES RADIAIS (RBFS) AGOSTO 2021
Figure 4: Gráfico de Desempenho com barra de desvio para
os algoritmos K-means e Random aplicados no BreastCancer;
Treinamento repetido 20 vezes
treinamentos repetidos da rede (20 vezes), variando o hiper-
parâmetro K (número de clusters), a fim de se obter uma
acurácia média e o desvio padrão. Para o método Homogeneus
Cluster, variou-se o hiperparâmetro bias, o qual interfere na
decisão do algoritmo a respeito da divisão do cluster, após
avaliar os dados da intersecção.
Como indicado na seção II, todas as unidades de pro-
cessamento da camada intemediária, têm como função de
ativação uma normal Gaussiana eq.(2), cujos parâmetros serão
ajustados pelos algoritmos supracitados.
O tratamento dos dados consistiu na normalização entre 0 e
1, como indicado na eq. (5). Não foi aplicado nenhum método
de seleção de caracterı́sticas essenciais. 70% das amostras
foram selecionadas para treinamento e os outros 30% foram
selecionados para teste.
xi = (xi − xmin)/(xmax − xmin) (5)
A. Dataset BreastCancer
Os atributos foram computados a partir de uma imagem
digitalizada de uma amostra de massa mamária[4]. A base de
dados é composta de 569 instâncias e 2 classes. Cada amostra
é um vetor de 30 dimensões. A classificação dos dados implica
em determinar a presença ou não de câncer nas imagens.
O gráfico indicado na Fig.4 apresenta o desempenho da
rede para os algoritmos k-means e Random. O hiperparâmetro
K foi variado entre 1 e 30. Observou-se um desempenho
acima de 90% para ambos os métodos. Comparativamente, o
Random obteve desempenho pouco superior. Possivelmente, o
desempenho do K-means poderia ser melhorado com um novo
mapeamento, que checasse clusters homogêneos próximos e
os unisse, além de identificar clusters heterogêneos visando a
separação.
B. Dataset Statlog
A base de dados Statlog é, assim como o BreastCancer,
binária. São 270 instâncias, cada uma com 20 atributos.
Plotamos o desempenho do modelo para o Statlog na Fig.5.
Nos dados de treinamento, observa-se, para ambos os métodos,
o aumento da acurácia média a medida que o número de
clusters aumenta. O k-means atinge os 85% de acurácia a
partir de 17 clusters, o random, a partir de 10 clusters. No
entanto, a comparação de desempenho com os dados de teste,
evidencia um overffiting, visto que o aumento de desempenho
nos dados de treinamento é acompanhado da diminuição da
acurácia nos dados de teste, a partir de 20 clusters.
Analisando o desempenho nos dados de treinamento, o K-
means apresenta um pico de desempenho entre 4 e 6 clusters,
logo em seguida é superado pelo random até os 20 neurônios,
quando o desempenho de ambos os modelos se aproxima e
decai.
Figure 5: Gráfico de Desempenho com barra de desvio para os
algoritmos K-means e Random aplicados no Statlog; Treina-
mento repetido 20 vezes
C. Dataset Iris
Essa base inclui três espécies iris: Iris setosa, Iris virginica
e Iris versicolor, com 50 amostras cada. Quatro atributos são
medidos para cadaamostra: o comprimento e a espessura da
sépala e da pétala. Como se trata de 3 classes distintas, é
necessário aplicar o mapeamento indicado na seção II. Dessa
forma, a rede neural terá dois perceptrons na camada de saı́da.
Plotamos o desempenho do modelo para inicialização a
partir do K-means e do Random na Fig.6. Observa-se um
desempenho inferior do algoritmo K-means, excetuando as
acurácias para k=3 e k=8.
Surpreendentemente, o algoritmo aleatório apresentou exce-
lente generalização, que é evidenciada pelas acurácias acima
de 90% nos dados de teste. O k-means, por outro lado,
apresentou bom desempenho para os dados de treinamento, e
queda das acurácias nos dados de teste a medida que o número
de clusters aumenta, indicando overfitting.
D. Dataset Wine
Essa base de dados é resultado da análise quı́mica de vinhos
produzidos na mesma região da Itália, porém provenientes de
diferentes platações. A análise determinou 13 constituintes
para cada um dos três tipos de vinhos. São no total 178
instâncias. Plotamos o desempenho do modelo da rede na
Fig.7. Nessa base de dados, o Random superou significati-
vamente o K-means. Os algoritmos se igualam para poucos
ROBERG et al.: HIGH-EFFICIENCY DIODE AND TRANSISTOR RECTIFIERS 5
Figure 6: Gráfico de Desempenho com barra de desvio para os
algoritmos K-means e Random aplicados no Iris; Treinamento
repetido 20 vezes
clusters, porém a partir de k=8, observa-se a melhoria das
acurácias de teste e de treinamento do Random, acompanhada
do decaimento do desempenho k-means.
Supõe-se que a sobreposição das classes, tenha gerado
muitos clusters heterogêneos que suprimiram o desempenho
do K-means.
Figure 7: Gráfico de Desempenho com barra de desvio para
os algoritmos K-means e Random aplicados no Wine; Treina-
mento repetido 20 vezes
E. Desempenho do Homogeneus Clustering (HC)
O desempenho do Homogeneus Clustering sobre as bases
de dados foi medido variando-se o bias e o hiperparâmetro
nclusters, o qual está associado a partição do cluster maior
no caso indicado na Fig.3(e). Construı́mos a tabela abaixo
explicitando o desempenho do modelo para os dados de teste.
Observou-se um baixo desempenho geral, exetuando-se as
cobinações dos hiperparâmetros (bias, ncluster) para o Statlog.
Supõe-se que o ajuste automático do número de centros im-
plementado pelo HC, tenha provocado um aumento demasiado
do fator k, levando a queda do desempenho.
(Bias/ncluster) (10, 4) (35, 2) (40, 20)
BreastCancer 0.66(3) 0.75(2) 0.60(2)
Statlog 0.50(8) 0.82(3) 0.83(2)
Iris 0.65(5) 0.65(7) 0.64(6)
Wine 0.51(9) 0.64(5) 0.65(4)
VI. CONCLUSÃO
O algoritmo aleatório Random, surpreendentemente, apre-
sentou as melhores acurácias em quase todas as bases de
dados. Alguns fatores podem ter afetado o desempenho do
K-means e do Homogeneus Clustering(HC). Por exemplo,
não foi implementado um método de extração de variáveis.
A motagem de uma matriz de correlação, poderia eliminar
atributos desnecessários, simplificando a base de dados e
evitando sopreposição, de forma que o K-means e o HC
pudessem escalar em desempenho. A introdução do K-means
como um dos métodos de split aplicados pelo algoritmo
HC, pode ter contribuido negativamente. O hiperparâmetro
ncluster, no caso indicado na Fig.3(e), parciona o cluster maior
em muitos grupos, criando, em demasia, clusters vizinhos de
mesma classe, o que se contrapõe a própria proposta do HC,
visualmente explicitada na Fig.2(b).
A determinação do raio no K-means, aparentemente não
repercutiu negativamente, porém, a implementação de novos
métodos para determinação dos raios poderia gerar melhores
resultados. Por exemplo, tomando-se o raio como a distância
euclidiana entre o ponto mais extremo e centro, tal como foi
aplicado na seleção de raios do HC.
Uma outra abordagem interessante, seria realizar um novo
mapeamento dos clusters após aplicado o K-means ou o HC,
identificando clusters homogêneos vizinhos e fundindo-os.
Isso poderia reduzir o parâmetro K e evitar overfitting.
REFERÊNCIAS BIBLIOGRÁFICAS
[1] A Supervised Clustering Algorithm for the Initialization
of RBF Neural Network Classifiers. (Hakan Cevikalp, Diane
Larlus, Frederic Jurie)
[2] Z. Uykan, C. Guzelis, M. E. Celebi, and H. N. Koivo,
“Analysis of input-output clustering for determining centers of
RBFN,” IEEE Trans. on Neural Networks, vol. 11, 2000
[3] Chris Bishop, Improving the Generalization Properties
of Radial Basis Function Neural Networks, Received 6 March
1991; accepted 18 April 1991.
6
APPENDIX
Algoritmo 1: RBF
i m p o r t numpy as np
i m p o r t pandas as pd
from s k l e a r n i m p o r t d a t a s e t s
from s k l e a r n . c l u s t e r i m p o r t KMeans
i m p o r t s e a b o r n as sbn
i m p o r t random
i m p o r t s e a b o r n as sbo
i m p o r t w a r n i n g s
i m p o r t s t a t i s t i c s
i m p o r t random
from s k l e a r n . c l u s t e r i m p o r t KMeans
from copy i m p o r t deepcopy
w a r n i n g s . f i l t e r w a r n i n g s ( ’ i g n o r e ’ )
i m p o r t m a t p l o t l i b . p y p l o t a s p l t
”””
1− dados de e n t r a d a n o r m a l i z a d o s e n t r e 0 e 1 ,
2− c e n t r o s a l o c a d o s no i n t e r i o r do h i p e r e s p a o d e f i n i d o p e l o s v e t o r e s de e n t r a d a .
3− r a i o s foram o b t i d o s a p a r t i r da d i s t n c i a m d i a e n t r e os p o n t o s a s s o c i a d o s a cada c e n t r o .
4− p a r c i o n a r o h i p e r e s p a o de e n t r a d a em c l u t e r s de ac o rd o com a p r o x i m i d a d e de cada c e n t r o .
”””
c l a s s Neuron :
d e f i n i t ( s e l f , c e n t e r , r a d i u s ) :
s e l f . c e n t e r = c e n t e r
s e l f . r a d i u s = r a d i u s
d e f a c t i v a t i o n ( s e l f , u ) :
i f s e l f . r a d i u s == 0 :
r e t u r n 0
r a d i u s = s e l f . r a d i u s
r e t u r n np . exp ( − 0 . 5 * ( 1 / ( r a d i u s **2) ) * ( u **2) )
d e f g e t o u t p u t ( s e l f , X) :
”””
r e t o r n a uma l i s t a c o n t e n d o um o u t p u t p a r a cada
x de e n t r a d a
”””
c e n t e r = np . a r r a y ( s e l f . c e n t e r )
s i z e = l e n (X)
o u t p u t = [ ]
f o r x i n X:
x = np . a r r a y ( x )
u = np . l i n a l g . norm ( x − c e n t e r )
o u t p u t . append ( s e l f . a c t i v a t i o n ( u ) )
r e t u r n np . a r r a y ( o u t p u t ) . r e s h a p e ( s i z e , 1 )
c l a s s RBF :
”””
k : n m e r o de n e u r n i o s na camada e s c o n d i d a ,
nd imens ion : d i m e n s o do v e t o r de e n t r a d a ,
X: v e t o r 2d dados de e n t r a d a n o r m a l i z a d o s e n t r e 0 e 1 ,
”””
d e f i n i t ( s e l f ) :
s e l f . k = None
s e l f . nd imens ion = None
s e l f . n e u r o n s = None
s e l f .w = None
s e l f . c e n t e r s = None
s e l f . h c b i a s = None
d e f g e t r a d i u s ( s e l f , X, l a b e l s ) :
”””
Os r a i o s a s s o c i a d o s a cada c e n t r o foram d e t e r m i n a d o s
p e l a d e s v i o p a d r o da d i s t n c i a e n t r e os p o n t o s de
cada c l u s t e r e seu r e s p e c t i v o c e n t r o .
”””
c e n t e r s = s e l f . c e n t e r s
c l u s t e r s s i z e s = [ l a b e l s . c o u n t ( l a b e l ) f o r l a b e l i n r a n g e ( s e l f . k ) ]
c l u s t e r s r a d i u s = [0 f o r i i n r a n g e ( s e l f . k ) ]
f o r x , l a b e l i n z i p (X, l a b e l s ) :
7
c l u s t e r s r a d i u s [ l a b e l ] += ( np . l i n a l g . norm ( np . a r r a y ( x ) − c e n t e r s [ l a b e l ] ) ) **2 / c l u s t e r s s i z e s [
↪→ l a b e l ]
r e t u r n np . s q r t ( c l u s t e r s r a d i u s )
d e f t r a i n ( s e l f , X, Y, a l g o r i t h m , b i a s h c =None , n c l u s t e r s =None , k=None ) :
# s e l f . c e n t e r s uma l i s t a de a r r a y s numpy
# cada c e n t r o uma a r r a y numpy
X arr = np . a r r a y (X)
sample s = l e n (X)
s e l f . nd imens ion = l e n (X[ 0 ] )
i f a l g o r i t h m == ’ random ’ :
i n d e x s = np . random . r a n d i n t ( low =0 , h igh = samples, s i z e =( k , 2 ) )
c e n t e r s = [ ( X arr [ i 1 ]+ X arr [ i 2 ] ) * ( 0 . 5 ) f o r ( i1 , i 2 ) i n i n d e x s ]
s e l f . c e n t e r s = c e n t e r s
s e l f . k = k
r a d i u s = [ np . l i n a l g . norm ( X arr [ i 1 ] − X arr [ i 2 ] ) f o r ( i1 , i 2 ) i n i n d e x s ]
i f a l g o r i t h m == ’ kmeans ’ :
km = KMeans ( n c l u s t e r s =k )
km . f i t (X)
c e n t e r s = [ l i s t ( c e n t e r ) f o r c e n t e r i n km . c l u s t e r c e n t e r s ]
s e l f . c e n t e r s = c e n t e r s
s e l f . k = k
l a b e l s = l i s t (km . l a b e l s )
r a d i u s = s e l f . g e t r a d i u s (X, l a b e l s )
i f a l g o r i t h m == ’ hc ’ :
hc = HC( X t r a i n , Y t r a i n )
hc . c l u s t e r i n g ( b i a s h c , n c l u s t e r s )
s e l f . b i a s h c = b i a s h c
c e n t e r s , r a d i u s = [ ] , [ ]
f o r c l u s t e r i n hc . c l u s t e r s :
c e n t e r s . append ( c l u s t e r . c e n t e r )
r a d i u s . append ( c l u s t e r . w id th )
n e u r o n s = [ Neuron ( c e n t e r , r ) f o r c e n t e r , r i n z i p ( c e n t e r s , r a d i u s ) ]
s i z e = l e n (X)
H = np . ones ( ( s i z e , 1 ) )
f o r neuron i n r e v e r s e d ( n e u r o n s ) :
o u t p u t = neuron . g e t o u t p u t (X)
H = np . c o n c a t e n a t e ( ( o u t p u t , H) , a x i s =1)
H = np . nan to num (H)
pseudo H = np . l i n a l g . p inv (H)
Y = np . a r r a y (Y)
#W, * = np . l i n a l g . l s t s q (H, Y t r a i n )
W = np . d o t ( pseudo H , Y t r a i n )
W = np . nan to num (W)
s e l f . n e u r o n s = n e u r o n s
s e l f .w = W
r e t u r n W
d e f c l a s s i f y ( s e l f , X, neurons , c l a s s e s ) :
s i z e = l e n (X)
H = np . ones ( ( s i z e , 1 ) )
f o r neuron i n r e v e r s e d ( n e u r o n s ) :
o u t p u t = neuron . g e t o u t p u t (X)
H = np . c o n c a t e n a t e ( ( o u t p u t , H) , a x i s =1)
i f c l a s s e s == 2 :
Y aprox = np . d o t (H, s e l f .w)
r e t u r n [1 i f y>= 0 . 5 e l s e 0 f o r y i n Y aprox ]
i f c l a s s e s == 3 :
8
Y aprox = np . d o t (H, s e l f .w)
Y a p r o x l i s t = [ l i s t ( y ) f o r y i n Y aprox ]
Y p r e d i c t = [ ]
f o r y i n Y a p r o x l i s t :
i f y [ 0 ] <=0.5 and y [ 1 ] <=0.5:
Y p r e d i c t . append ( [ 0 , 0 ] )
e l i f y [ 0 ] > 0 . 5 and y [ 1 ] > 0 . 5 :
Y p r e d i c t . append ( [ 1 , 1 ] )
e l s e :
Y p r e d i c t . append ( [ 1 , 0 ] )
r e t u r n Y p r e d i c t
d e f a c u r a c i a ( s e l f , Y p , Y) :
s i z e = l e n (Y)
a c e r t o s = 0
f o r y p , y i n z i p ( Y p , Y) :
i f y p == y :
a c e r t o s += 1
r e t u r n a c e r t o s / s i z e
Algoritmo 2: Homogeneus Clustering (HC)
c l a s s C l u s t e r :
”””
Modelo de c l u s t e r em um h i p e r e s p a o .
( wid th ) d i s t n c i a e n t r e o pon to mais d i s t a n t e e o c e n t r o do c l u s t e r
( c e n t e r ) m d i a e n t r e os p o n t o s p e r t e n c e n t e s ao c l u s t e r
”””
d e f i n i t ( s e l f , X, i n d e x s ) :
s e l f . c e n t e r = None
s e l f . w id th = None
s e l f . p o i n t s = None
s e l f . i n d e x s = i n d e x s
# E s p e c i f i c a n d o p r o p r i e d a d e s do c l u s t e r
s e l f . g e t p o i n t s (X, i n d e x s )
s e l f . g e t c e n t e r ( )
s e l f . g e t w i d t h ( )
d e f g e t p o i n t s ( s e l f , X, i n d e x s ) :
# Armazena os p o n t o s p e r t e n c e n t e s ao c l u s t e r
s e l f . p o i n t s = [X[ i ] f o r i i n i n d e x s ]
d e f g e t c e n t e r ( s e l f ) :
# C a l c u l a o h i p e r c e n t r o a s s o c i a d o ao c l u s t e r
s e l f . c e n t e r = np . mean ( np . a r r a y ( s e l f . p o i n t s ) , a x i s =0)
d e f g e t w i d t h ( s e l f ) :
# C a l c u l a o r a i o do c l u s t e r
d i s t a n c e s = np . a r r a y ( [ np . l i n a l g . norm ( np . a r r a y ( p o i n t ) − s e l f . c e n t e r ) f o r p o i n t i n s e l f . p o i n t s ] )
s e l f . w id th = np . max ( d i s t a n c e s )
c l a s s HC:
”””
Modelo de c l u s t e r i n g u t i l i z a n d o o a l g o r i t i m o deos c l u s t e r s
h o m o g n e o s i n d i c a d o s no a r t i g o −−− R e f e r n c i a −−−
Cada l i s t a ( s e l f . l a b e l s ) d e f i n e uma c o n f i g u r a o do s i s t e m a ( c l u s t e r s , c e n t e r s , w i d t h s )
”””
d e f i n i t ( s e l f , X, Y) :
# l a b e l i n i c i a l
s e l f . l a b e l s = Y
# Dados de e n t r a d a
s e l f .X = X
# C o n f i g u r a o i n i c i a l
s e l f . c l u s t e r s = [ ]
s e l f . d i s t a n c e s m e a n = None
# F lag do s i s t e m a
s e l f . f l a g = True
9
d e f g e t c l u s t e r s ( s e l f ) :
”””
D ef in e o e s t a d o do s i s t e m a com base
no a t r i b u t o no a t r i b u t o s e l f . l a b e l s
”””
s e l f . c l u s t e r s = [ ]
c l u s t e r s i n d e x s = [ ]
# l a b e l s p o s s v e i s
l a b e l s s e t = s e t ( s e l f . l a b e l s )
# I d e n t i f i c a n d o i n d e x s de cada c l u s t e r
f o r l a b e l i n l a b e l s s e t :
c l u s t e r i n d e x = [ i f o r i , l b l i n enumera t e ( s e l f . l a b e l s ) i f l b l == l a b e l ]
c l u s t e r s i n d e x s . append ( c l u s t e r i n d e x )
# I n i c i a l i z a n d o C l u s t e r s
f o r i n d e x s i n c l u s t e r s i n d e x s :
c l u s t e r = C l u s t e r ( s e l f . X, i n d e x s )
s e l f . c l u s t e r s . append ( c l u s t e r )
d e f g e t d i s t a n c e s m e a n ( s e l f ) :
”””
C a l c u l a n d o m a t r i z t r a i n g u l a r de d i s t n i c i a s e n t r e t o d o s os c e n t r o s
da c o n f i g u r a o ( s e l f . l a b e l s / s e l f . c l s u t e r s ) a t u a l do s i s t e m a
”””
d i s t a n c e s m e a n = [ ]
f o r i , c l u s t e r l i n enumera t e ( s e l f . c l u s t e r s ) :
d i s t a n c e s l = [ ]
f o r j , c l u s t e r c i n enumera t e ( s e l f . c l u s t e r s ) :
# M a t r i z t r i a n g u l a r
i f i >= j :
d i s t a n c e s l . append ( 0 )
c o n t i n u e
d i s t a n c e s l . append ( np . l i n a l g . norm ( np . a r r a y ( c l u s t e r l . c e n t e r ) − np . a r r a y ( c l u s t e r c . c e n t e r ) ) )
d i s t a n c e s m e a n . append ( d i s t a n c e s l )
s e l f . d i s t a n c e s m e a n = d i s t a n c e s m e a n
d e f r e l a b e l ( s e l f , b i a s , n c l u s t e r s =4) :
”””
M o d i f i c a l a b e l c o r r e n t e com base na r e l a o e n t r e d i s t a n c e s m e a n e
w i d t h s dos c l u s t e r s .
”””
s e l f . f l a g = F a l s e
n = l e n ( s e l f . c l u s t e r s )
f o r i i n r a n g e ( n ) :
f o r j i n r a n g e ( n ) :
i f i >= j :
c o n t i n u e
d i s t a n c e m e a n = np . a r r a y ( s e l f . d i s t a n c e s m e a n ) [ i , j ]
# Par de c l u s t e r s em a n l i s e
c l u s t e r l = s e l f . c l u s t e r s [ i ]
w l i ne = c l u s t e r l . w id th
c l u s t e r c = s e l f . c l u s t e r s [ j ]
w col = c l u s t e r c . w id th
# I n t e r s e c t i o n
i f ( d i s t a n c e m e a n < ( w l i ne + w col ) ) and ( abs ( w l i ne − w col ) < d i s t a n c e m e a n ) :
s e l f . i n t e r s e c ( c l u s t e r l , c l u s t e r c , b i a s )
# Um c l u s t e r e n g l o b a o o u t r o
i f ( d i s t a n c e m e a n < ( w l i ne + w col ) ) and ( abs ( w l i ne − w col ) >= d i s t a n c e m e a n ) :
i f w l i ne > w col and ( l e n ( c l u s t e r c . p o i n t s ) > b i a s ) :
s e l f . r e l a b e l o n e i n ( c l u s t e r l , n c l u s t e r s )
e l i f w col > w l i ne and ( l e n ( c l u s t e r l . p o i n t s ) > b i a s ) :
s e l f . r e l a b e l o n e i n ( c l u s t e r c , n c l u s t e r s )
d e f r e l a b e l o n e i n ( s e l f , c l u s t e r , n c l u s t e r s ) :
”””
10
A t u a l i z a n d o o e s t a d o do s i s t e m a ( s e l f . l a b e l s ) ao p a r c i o n a r o c l u s t e r de maior wid th
”””
km = KMeans ( n c l u s t e r s )
km . f i t ( c l u s t e r . p o i n t s )
l a b e l s = km . l a b e l s
max labe l = np . max ( s e l f . l ab e l s )
f o r i , i n d e x i n enumera t e ( c l u s t e r . i n d e x s ) :
i f l a b e l s [ i ] == 0 :
c o n t i n u e
e l s e :
s e l f . l a b e l s [ i n d e x ] = ( l a b e l s [ i ] + max labe l )
s e l f . f l a g = True
d e f i n t e r s e c ( s e l f , c l u s t e r l , c l u s t e r c , b i a s ) :
i n d e x s o u t l = s e l f . g e t o u t p o i n t s ( c l u s t e r l , c l u s t e r c )
i n d e x s o u t c = s e l f . g e t o u t p o i n t s ( c l u s t e r c , c l u s t e r l )
i f l e n ( i n d e x s o u t l ) > b i a s :
s e l f . u p d a t e l a b e l ( i n d e x s o u t l )
s e l f . f l a g = True
i f l e n ( i n d e x s o u t c ) > b i a s :
s e l f . u p d a t e l a b e l ( i n d e x s o u t c )
s e l f . f l a g = True
d e f g e t o u t p o i n t s ( s e l f , m a i n c l u s t e r , r i v a l c l u s t e r ) :
”””
I d e n t i f i c a n d o p o n t o s mais p r x i m o s do c l u s t e r r i v a l
”””
i n d e x s o u t = [ ]
f o r p o i n t , i i n z i p ( m a i n c l u s t e r . p o i n t s , m a i n c l u s t e r . i n d e x s ) :
i f np . l i n a l g . norm ( p o i n t − m a i n c l u s t e r . c e n t e r ) > np . l i n a l g . norm ( p o i n t − r i v a l c l u s t e r . c e n t e r ) :
# i n d e x s em X
i n d e x s o u t . append ( i )
r e t u r n i n d e x s o u t
d e f u p d a t e l a b e l ( s e l f , i n d e x s o u t ) :
max labe l = np . max ( s e l f . l a b e l s )
f o r i n d e x i n i n d e x s o u t :
s e l f . l a b e l s [ i n d e x ] = max labe l +1
d e f c l u s t e r i n g ( s e l f , b i a s , n c l u s t e r s ) :
s e l f . g e t c l u s t e r s ( )
s e l f . g e t d i s t a n c e s m e a n ( )
w h i l e s e l f . f l a g :
s e l f . r e l a b e l ( b i a s , n c l u s t e r s )
s e l f . g e t c l u s t e r s ( )
s e l f . g e t d i s t a n c e s m e a n ( )
Algoritmo 3: Funções Auxiliares
d e f n o r m a l i z e f e a t u r e s (X, min , max ) :
X normal ize = [ ]
f o r x i n X:
x n o r m a l i z e = ( x−min ) / ( max−min )
X normal ize . append ( x n o r m a l i z e )
r e t u r n X normal ize
d e f m a k e t r a i n t e s t d a t a (X, Y) :
Y = l i s t ( d f [ ’ t a r g e t ’ ] )
Y new = [ ]
f o r y i n Y:
i f y == 1 :
Y new . append ( [ 1 , 0 ] )
i f y == 0 :
Y new . append ( [ 0 , 0 ] )
i f y == 2 :
Y new . append ( [ 1 , 1 ] )
i n d e x s = [ i n d e x f o r i n d e x i n r a n g e ( l e n (X) ) ]
i n d e x s t r a i n = random . sample ( indexs , i n t ( 0 . 7 * l e n ( i n d e x s ) ) )
11
i n d e x s t e s t = [ i n d e x f o r i n d e x i n i n d e x s i f i n d e x n o t i n i n d e x s t r a i n ]
X t r a i n = [ l i s t (X[ i n d e x ] ) f o r i n d e x i n i n d e x s t r a i n ]
X t e s t = [ l i s t (X[ i n d e x ] ) f o r i n d e x i n i n d e x s t e s t ]
Y t r a i n = [ Y new [ i n d e x ] f o r i n d e x i n i n d e x s t r a i n ]
Y t e s t = [ Y new [ i n d e x ] f o r i n d e x i n i n d e x s t e s t ]
r e t u r n X t r a i n , Y t r a i n , X te s t , Y t e s t
d e f norm ( d f i n p u t ) :
r e t u r n ( d f − df . min ( ) ) / ( d f . max ( ) − d f . min ( ) )
Algoritmo 4: Estatı́stica
c l a s s S t a t s :
d e f i n i t ( s e l f ) :
s e l f . a c r s t e s t = [ ]
s e l f . a c r s t r a i n = [ ]
s e l f . s t d v s t e s t = [ ]
s e l f . s t d v s t r a i n = [ ]
s e l f . ks = None
d e f g e t a c u r a c i a s ( s e l f , X, Y, X tes t , Y te s t , t imes , k , c l a s s e s ) :
nd imens ion = l e n (X[ 0 ] )
a c r s t e s t r a n d o m , a c r s t r a i n r a n d o m , a c r s t e s t k m , a c r s t r a i n k m = [ ] , [ ] , [ ] , [ ]
f o r i i n r a n g e ( t i m e s ) :
r b f = RBF( k , nd imens ion = nd imens ion )
r b f . t r a i n (X, Y, True )
Y p t e s t = r b f . c l a s s i f y ( X te s t , r b f . neurons , c l a s s e s )
Y p t r a i n = r b f . c l a s s i f y (X, r b f . neurons , c l a s s e s )
a c r s t e s t r a n d o m . append ( r b f . a c u r a c i a ( Yp tes t , Y t e s t ) )
a c r s t r a i n r a n d o m . append ( r b f . a c u r a c i a ( Yp t r a in , Y) )
r b f . t r a i n (X, Y, F a l s e )
Y p t e s t = r b f . c l a s s i f y ( X te s t , r b f . neurons , c l a s s e s )
Y p t r a i n = r b f . c l a s s i f y (X, r b f . neurons , c l a s s e s )
a c r s t e s t k m . append ( r b f . a c u r a c i a ( Yp tes t , Y t e s t ) )
a c r s t r a i n k m . append ( r b f . a c u r a c i a ( Yp t r a in , Y) )
s e l f . a c r s t e s t . append ( [ s e l f . mean ( a c r s t e s t r a n d o m ) , s e l f . mean ( a c r s t e s t k m ) ] )
s e l f . a c r s t r a i n . append ( [ s e l f . mean ( a c r s t r a i n r a n d o m ) , s e l f . mean ( a c r s t r a i n k m ) ] )
s e l f . s t d v s t e s t . append ( [ s e l f . s t d v ( a c r s t e s t r a n d o m ) , s e l f . s t d v ( a c r s t e s t k m ) ] )
s e l f . s t d v s t r a i n . append ( [ s e l f . s t d v ( a c r s t r a i n r a n d o m ) , s e l f . s t d v ( a c r s t r a i n k m ) ] )
d e f t r a i n f o r k c l u s t e r s ( s e l f , X, Y, X tes t , Y te s t , t imes , ks = [ 1 , 5 , 10 , 15 , 20 , 25 , 30 , 50 , 1 0 0 ] ,
↪→ c l a s s e s =2) :
s e l f . ks = ks
f o r k i n ks :
s e l f . g e t a c u r a c i a s (X, Y, X tes t , Y te s t , t imes , k , c l a s s e s )
d e f s t d v ( s e l f , a c r s ) :
r e t u r n s t a t i s t i c s . s t d e v ( a c r s )
d e f mean ( s e l f , a c r s ) :
r e t u r n s t a t i s t i c s . mean ( a c r s )
d e f view ( s e l f , t i t l e ) :
s e l f . a c r s t e s t = np . a r r a y ( s e l f . a c r s t e s t )
s e l f . a c r s t r a i n = np . a r r a y ( s e l f . a c r s t r a i n )
s e l f . s t d v s t e s t = np . a r r a y ( s e l f . s t d v s t e s t )
s e l f . s t d v s t r a i n = np . a r r a y ( s e l f . s t d v s t r a i n )
sbn . a x e s s t y l e ( )
sbn . s e t s t y l e ( ” d a r k g r i d ” , {” axes . f a c e c o l o r ” : ” . 9 ” } )
f i g = p l t . f i g u r e ( )
p l t . e r r o r b a r ( s e l f . ks , s e l f . a c r s t r a i n [ : , 0 ] , y e r r = s e l f . s t d v s t r a i n [ : , 0 ] , l s = ”None” , c o l o r =
↪→ ( 0 , 0 , 0 . 6 , 0 . 2 ) )
p l t . p l o t ( s e l f . ks , s e l f . a c r s t r a i n [ : , 0 ] , marker = ” h ” , c o l o r = ( 0 , 0 , 0 . 6 ) , l a b e l =” Tra in −random ” )
12
p l t . e r r o r b a r ( s e l f . ks , s e l f . a c r s t e s t [ : , 0 ] , y e r r = s e l f . s t d v s t e s t [ : , 0 ] , l s = ”None” , c o l o r =
↪→ ( 0 . 6 , 0 , 0 , 0 . 2 ) )
p l t . p l o t ( s e l f . ks , s e l f . a c r s t e s t [ : , 0 ] , marker = ” h ” , c o l o r = ( 0 . 6 , 0 , 0 ) , l a b e l =” Tes t −random ” )
p l t . e r r o r b a r ( s e l f . ks , s e l f . a c r s t r a i n [ : , 1 ] , y e r r = s e l f . s t d v s t r a i n [ : , 1 ] , l s = ”None” , c o l o r =
↪→ ( 0 , 0 . 6 , 0 . 6 , 0 . 2 ) )
p l t . p l o t ( s e l f . ks , s e l f . a c r s t r a i n [ : , 1 ] , marker = ” h ” , c o l o r = ( 0 , 0 . 6 , 0 . 6 ) , l a b e l =” Tra in −Kmeans” )
p l t . e r r o r b a r ( s e l f . ks , s e l f . a c r s t e s t [ : , 1 ] , y e r r = s e l f . s t d v s t e s t [ : , 1 ] , l s = ”None” , c o l o r =
↪→ ( 0 . 6 , 0 . 6 , 0 , 0 . 2 ) )
p l t . p l o t ( s e l f . ks , s e l f . a c r s t e s t [ : , 1 ] , marker = ” h ” , c o l o r = ( 0 . 6 , 0 . 6 , 0 ) , l a b e l =” Tes t −Kmeans” )
p l t . t i t l e ( f ” A c u r c i a s m d i a s p a r a t r e i n a m e n t o com K c l u s t e r s r e p e t i d o 20 v e z e s ({ t i t l e } ) ” ,
↪→ f o n t s i z e =16)
p l t . x l a b e l ( ”K c l u s t e r s na camada e s c o n d i d a ” , f o n t s i z e =16)
p l t . y l a b e l ( ” A c u r c i a s Medias ” , f o n t s i z e =16)
p l t . l e g e n d ( f o n t s i z e = 16)
f i g . s e t s i z e i n c h e s ( 1 4 . 5 , 8 . 5 , f o r w a r d =True )
# f i g . s u b p l o t s a d j u s t ( l e f t = 0 . 0 , bot tom = 0 . 1 , r i g h t = 1 . 0 , t o p = 0 . 9 , wspace = 0 . 2 , h sp a ce = 0 . 2 )
f i g
p l t . show ( )
	Introdução
	Revisão de Literatura
	DetalhesTécnicos para a Implementação da Rede Neural
	Algoritmos de Inicialização
	Algoritmo Random
	Algoritmo k-means
	Algoritmo Homogeneous Clustering (HC)
	Resultados
	Dataset BreastCancer
	Dataset Statlog
	Dataset Iris
	Dataset Wine
	Desempenho do Homogeneus Clustering (HC)
	Conclusão
	Appendix

Continue navegando