-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
327e4b1
commit eea45c4
Showing
1 changed file
with
75 additions
and
45 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,60 +1,90 @@ | ||
# Codigo que calcula a tendencia de agrupamento dos dados | ||
# Andrey Menezes - versão 2.0 (Fevereiro 2013) | ||
# Andrey Menezes - versão 2.0 (Fevereiro 2013) | ||
|
||
dados = read.csv("dados/TabelaParaPerfis.csv") | ||
dados = dados[,2:6] | ||
# Tabela normalizada e com as características correlatas eliminadas | ||
dados = read.csv("dados/TabelaParaPerfisNormal.csv") | ||
caracteristicas = dados[,-1] | ||
|
||
library("FNN") | ||
# Funções para calcular a estatística de hoopkins | ||
intervalo.confianca<-function(dados, significancia = 0.05){ | ||
tamanho = length(dados) | ||
confianca = 1-(significancia/2) | ||
desvio.padrao = sd(dados) | ||
media = mean(dados) | ||
erro <- qnorm(confianca)*desvio.padrao/sqrt(tamanho) | ||
return(data.frame(media - erro, media + erro, media)) | ||
} | ||
|
||
distancia = function(ponto1, ponto2){ | ||
resultado = 0 | ||
for (i in 1:ncol(ponto1)){ | ||
resultado = resultado + ((ponto1[,i] - ponto2[,i])^2) | ||
} | ||
resultado = sqrt(resultado) | ||
} | ||
|
||
ponto.mais.proximo = function(ponto, dados){ | ||
distancia = distancia(ponto, dados[1,]) | ||
for (i in 2:nrow(dados)){ | ||
d = distancia(ponto, dados[i,]) | ||
if (!(d==0) && d < distancia){ | ||
distancia = d | ||
} | ||
} | ||
return(distancia) | ||
} | ||
|
||
hopkins = function(dados, p, objetos, minimos) { | ||
gerar.pontos = function(dados, tamanho){ | ||
pontos = NA | ||
for (i in 1:ncol(dados)){ | ||
sample = sample(0:100, tamanho)/100 | ||
pontos = cbind(pontos, sample) | ||
} | ||
pontos = pontos[,-1] | ||
colnames(pontos) = colnames(dados) | ||
return(pontos) | ||
|
||
} | ||
|
||
amostragem = function(dados, tamanho){ | ||
sample = sample(nrow(dados), tamanho) | ||
amostra = dados[sample,] | ||
} | ||
|
||
hopkins = function(dados, n){ | ||
amostra = amostragem(caracteristicas, n) | ||
novos.pontos = as.data.frame(gerar.pontos(caracteristicas, n)) | ||
|
||
amostra = sample(length(dados[,1]), size=p, replace = FALSE) | ||
w = 0 | ||
u = 0 | ||
|
||
soma_w = 0 | ||
for(i in 1:length(amostra)) { | ||
soma_w = soma_w + minimos[i] | ||
for (i in 1:n){ | ||
w = w + ponto.mais.proximo(amostra[i,], dados) | ||
u = u + ponto.mais.proximo(novos.pontos[i,], dados) | ||
} | ||
|
||
soma_u = 0 | ||
for(i in 1:length(objetos[,1])) { | ||
dist = knnx.dist(as.matrix(dados),as.matrix(objetos),2,"kd_tree") | ||
soma_u = sum(dist[,2]) | ||
} | ||
if(soma_u > 0) { | ||
return(soma_u/(soma_u + soma_w)) | ||
} else {return(0)} | ||
hopkins = u/(u+w) | ||
} | ||
|
||
hopkins.table = data.frame() | ||
|
||
#Calcula a menor distancia de cada linha da tabela para ser utilizado em hopkins | ||
minimo = knn.dist(dados, k=1, algorithm="kd_tree") | ||
stats = 0 | ||
|
||
# Monta a tabela com as estatísticas de hopkins | ||
col=0 | ||
for(n in 1:10) { | ||
count=0 | ||
col=col+1 | ||
for(i in 1:(length(dados)-1)) { | ||
for(e in (i+1):length(dados)) { | ||
if(i != e) { | ||
objetos = data.frame(runif(25, min(dados[,i]), max(dados[,i])), runif(25, min(dados[,e]), max(dados[,e]))) | ||
parcial = hopkins(dados[,c(i,e)], 25, objetos, minimo) | ||
if (parcial > stats) { | ||
stats = parcial | ||
atrib1 = i | ||
atrib2 = e | ||
} | ||
count = count+1 | ||
hopkins.table[col,count] = parcial | ||
} | ||
hopkins.para.combinacoes = function(caracteristicas, combinacoes){ | ||
intervalos = NA | ||
for (i in 1:ncol(combinacoes)){ | ||
valores = 0 | ||
for (j in 1:50){ | ||
valor = hopkins(caracteristicas[combinacoes[,i],], 10) | ||
valores = c(valores, valor) | ||
} | ||
valores = valores[2:length(valores)] | ||
ic = intervalo.confianca(valores) | ||
|
||
intervalos = rbind(intervalos, data.frame(Atributos=paste(colnames(caracteristicas[combinacoes[,i]]),collapse="+"), | ||
Hopkins=ic)) | ||
} | ||
|
||
intervalos = intervalos[-1,] | ||
} | ||
# | ||
|
||
colnames(hopkins.table) = c("1_2", "1_3", "1_4", "1_5", "2_3", "2_4", "2_5", "3_4", "3_5", "4_5") | ||
combinacoes = combn(ncol(caracteristicas),3) | ||
|
||
png(filename="BoxSplot Tendencia Agrupamento.png") | ||
boxplot(hopkins.table) | ||
dev.off() | ||
intervalos = hopkins.para.combinacoes(caracteristicas, combinacoes) |