Advertisement
11eimilia11

Reshipi

Apr 11th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 30.60 KB | None | 0 0
  1. import pandas as pd
  2. from numpy import ndarray
  3. from sklearn import preprocessing
  4. from sklearn.neighbors import KNeighborsClassifier
  5. from scipy import stats
  6. from sklearn.naive_bayes import GaussianNB
  7. import statistics
  8. from sklearn.metrics import pairwise_distances_argmin_min
  9. import numpy as np
  10. from random import randint
  11. import matplotlib.pyplot as plt
  12. import cv2
  13. from sklearn.decomposition import PCA
  14. import glob
  15. from sklearn.metrics import pairwise_distances_argmin_min
  16. from sklearn.metrics import accuracy_score
  17. from sklearn.metrics import jaccard_similarity_score
  18. from operator import itemgetter
  19. import math
  20.  
  21.  
  22. # função que calcula a quantidade de elementos por classe
  23. # a partir do data frame original, o nome da classe e a classificação
  24.  
  25. def quantidade_por_classe (dados, nome_classe, classe):
  26.     cont = 0
  27.     for x in range(len(dados.index)):
  28.         if (dados[nome_classe].iloc[x] == classe):
  29.             cont += 1
  30.     return cont
  31. # função de inicialização do algoritmo KNN , recebe o k
  32. # e a distância que vai ser usada como referência
  33.  
  34. def inicializacao_KNN (k):
  35.  
  36.     knn = KNeighborsClassifier(n_neighbors=k, metric='euclidean')
  37.     return knn
  38.  
  39.  
  40. # função de normalização dos dados usando o modelo de
  41. # normalização por reescala
  42.  
  43. def normalizar(dados):
  44.     x = dados.values
  45.     min_max_scaler = preprocessing.MinMaxScaler()
  46.     x_scaled = min_max_scaler.fit_transform(x)
  47.     dados_norm = pd.DataFrame(x_scaled)
  48.     return dados_norm
  49.  
  50. # função que calcula os valores de média, moda , mediana e desvio padrão
  51. # para os vetores de acerto de um algoritmo, recebe como parâmetro o vetor
  52. # de acerto e o nome do algoritmo
  53.  
  54. def tendencia_central (nomeAlgoritmo, vetorAcerto, vetorTempo):
  55.     print('________________________________________________\n')
  56.     print(nomeAlgoritmo)
  57.     print('Tempo Média = ', np.mean(vetorTempo))
  58.     print('Tempo Desvio padrão = ', statistics.pstdev(vetorTempo))
  59.     print('Tempo Moda = ', stats.mode(vetorTempo, axis=None))
  60.     print('Tempo Mediana =', np.median(vetorTempo))
  61.     print('----------------------------------------------')
  62.     print('Acurácia Média = ', np.mean(vetorAcerto))
  63.     print('Acurácia Desvio padrão = ', statistics.pstdev(vetorAcerto))
  64.     print('Acurácia Moda = ', stats.mode(vetorAcerto, axis=None))
  65.     print('Acurácia Mediana = ', np.median(vetorAcerto))
  66.  
  67.     print('________________________________________________\n')
  68.  
  69. # função que cria amostras estratificadas a partir
  70. # dos Data frame, o tamanho desejado para a amostra
  71. # e a classe dos dados
  72.  
  73. def amostra_estrat(dados, tamanho_amostra, classe):
  74.     classes = dados[classe].unique()
  75.     qtde_por_classe = round(tamanho_amostra / len(classes))
  76.     amostras_por_classe = []
  77.     for c in classes:
  78.         indices_c = dados[classe] == c
  79.         obs_c = dados[indices_c]
  80.         amostra_c = obs_c.sample(qtde_por_classe)
  81.         amostras_por_classe.append(amostra_c)
  82.  
  83.     amostra_estratificada = pd.concat(amostras_por_classe)
  84.     return amostra_estratificada
  85.  
  86. # função que realiza o treinamento dos algoritmos usados na base de dados
  87.  
  88. def treinaralgoritmos(noclass_train, class_train , tree, knnp1 , knnp2 , knnp3, knn1 , knn2 , knn3, naive, svmlinear , svmrbf):
  89.  
  90.     knn1.fit(noclass_train, class_train)
  91.     knn2.fit(noclass_train, class_train)
  92.     knn3.fit(noclass_train, class_train)
  93.     naive.fit(noclass_train, class_train)
  94.     tree.fit(noclass_train, class_train)
  95.     knnp1.fit(noclass_train, class_train)
  96.     knnp2.fit(noclass_train, class_train)
  97.     knnp3.fit(noclass_train, class_train)
  98.     svmlinear.fit(noclass_train, class_train)
  99.     svmrbf.fit(noclass_train, class_train)
  100.  
  101. # função de inicialização do algoritmo KNN Ponderado
  102. # recebe como parâmentro o valor do k
  103.  
  104. def inicializando_KNNW (k):
  105.  
  106.     knnp = KNeighborsClassifier(n_neighbors=k, weights='distance', metric='euclidean')
  107.     return knnp
  108.  
  109.  
  110.  
  111. def geneticlabels(dataframe,centers):
  112.     return pairwise_distances_argmin_min(dataframe,centers,metric='minkowski')
  113.  
  114. def find_clusters(X, n_clusters, rng, max_it):
  115.  
  116.     i = rng.permutation(X.shape[0])[:n_clusters]
  117.     centers = X[i]
  118.  
  119.     max_iterator = 0
  120.     distances = []
  121.     while True:
  122.  
  123.         labels,distance = pairwise_distances_argmin_min(X,centers,metric='minkowski')
  124.         distances.append(distance)
  125.  
  126.         new_centers = np.array([X[labels == i].mean(0)
  127.                                 for i in range(n_clusters)])
  128.  
  129.  
  130.         if np.all(centers == new_centers) or max_iterator > max_it:
  131.             break
  132.         centers = new_centers
  133.         max_iterator += 1
  134.  
  135.     return centers, labels, distances
  136.  
  137. def accuracy_majority_vote(base, predict_labels, real_labels, n_clusters):
  138.  
  139.     classes = real_labels.unique()
  140.  
  141.     majority = []
  142.     groups = []
  143.     k = 0
  144.     for i in range(n_clusters):
  145.         group = []
  146.         for a in range(len(base)):
  147.             if predict_labels[a] == i:
  148.                 group.append(real_labels[a])
  149.         groups.append(group)
  150.         majority.append(initialize_dic_majority(classes))
  151.         for real_label in group:
  152.             majority[k][real_label] += 1
  153.         k += 1
  154.  
  155.     label_groups = []
  156.     for m in majority:
  157.         label_groups.append(max(m.items(), key=itemgetter(1))[0])
  158.  
  159.     pred_labels = []
  160.     true_labels = []
  161.     for g in range(len(groups)):
  162.         pred_labels = pred_labels + ([label_groups[g]]*len(groups[g]))
  163.         true_labels = true_labels + [a for a in groups[g]]
  164.  
  165.     return accuracy_score(pred_labels, true_labels)
  166.  
  167.  
  168. def find_clustersGENETIC(X, n_clusters, max_it, array):
  169.  
  170.     centers = array
  171.  
  172.     max_iterator = 0
  173.     distances = []
  174.     while True:
  175.  
  176.         labels,distance = pairwise_distances_argmin_min(X,centers,metric='minkowski')
  177.         distances.append(distance)
  178.  
  179.         new_centers = np.array([X[labels == i].mean(0)
  180.                                 for i in range(n_clusters)])
  181.  
  182.  
  183.         if np.all(centers == new_centers) or max_iterator > max_it:
  184.             break
  185.         centers = new_centers
  186.         max_iterator += 1
  187.  
  188.     return centers, labels, distances
  189.  
  190. # Carregando fotos da pasta
  191. def loadFiles(path, array):
  192.  
  193.     for i in glob.glob(path):
  194.  
  195.         img = cv2.imread(i)
  196.         array.append(img)
  197.  
  198.     return array
  199.  
  200. # Função que aplic o filtro blur nas fotos do array
  201. def blurConversion(arrayphotos ,val1, val2):
  202.  
  203.     for x in range(len(arrayphotos)):
  204.         arrayphotos[x] = cv2.GaussianBlur(arrayphotos[x],(val1,val1), val2)
  205.  
  206.     return arrayphotos
  207.  
  208. #Função que faz a binarização das fotos
  209. def binaryConversion(arrayphotos,threshold,val1):
  210.  
  211.     for x in range(len(arrayphotos)):
  212.         arrayphotos[x] = cv2.adaptiveThreshold(arrayphotos[x],threshold,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,val1,10)
  213.  
  214.     return arrayphotos
  215.  
  216. #Função que inverte as fotos binárias
  217. def invertConversion(arrayphotos):
  218.  
  219.     for x in range(len(arrayphotos)):
  220.         arrayphotos[x] = cv2.bitwise_not(arrayphotos[x])
  221.  
  222.     return arrayphotos
  223.  
  224. # Função que faz o filtro cinza nas fotos
  225. def grayConversion(arrayphotos):
  226.  
  227.     size = len(arrayphotos)
  228.     for x in range (0,size):
  229.         arrayphotos[x] = cv2.cvtColor(arrayphotos[x], cv2.COLOR_BGR2GRAY)
  230.  
  231.     return arrayphotos
  232.  
  233.  
  234. def WCSSgenetic(x, population):
  235.  
  236.     arrayint = []
  237.     for a in x:
  238.         arrayint.append(int(a))
  239.  
  240.     print(arrayint)
  241.     soma = 0
  242.     for b in arrayint:
  243.         labels, distances = pairwise_distances_argmin_min(population[b],population, metric='minkowski')
  244.         for x in distances:
  245.             soma += x**2
  246.     return soma
  247.  
  248.  
  249. def generatepopulation(X,numberpopu, K, rng):
  250.  
  251.     population = []
  252.  
  253.     for x in range(numberpopu):
  254.         first = rng.permutation(X.shape[0])[:K]
  255.         print(first)
  256.         population.append(np.concatenate(X[first]))
  257.  
  258.     return population
  259.  
  260.  
  261. def find_clustersgenetic(X, n_clusters, max_it, array):
  262.  
  263.     centers = array
  264.  
  265.     max_iterator = 0
  266.     distances = []
  267.     while True:
  268.  
  269.         labels,distance = pairwise_distances_argmin_min(X,centers,metric='minkowski')
  270.         distances.append(distance)
  271.  
  272.         new_centers = np.array([X[labels == i].mean(0)
  273.                                 for i in range(n_clusters)])
  274.  
  275.         if np.all(centers == new_centers) or max_iterator > max_it:
  276.             break
  277.         centers = new_centers
  278.         max_iterator += 1
  279.  
  280.     return centers, labels, distances
  281.  
  282.  
  283. #FUNÇÃO DE NORMALIZAÇÃO
  284.  
  285.  
  286. def normalize(df1):
  287.     x = df1.values.astype(float)
  288.     min_max_scaler = preprocessing.MinMaxScaler()
  289.     scaled = min_max_scaler.fit_transform(x)
  290.     df_normalized = pd.DataFrame(scaled)
  291.     return df_normalized
  292.  
  293. def normalizearray(array):
  294.     scaled = preprocessing.MinMaxScaler().fit_transform(array)
  295.     return scaled
  296.  
  297. def normalizeArrayofArrays(arrayphotos):
  298.  
  299.     size = len(arrayphotos)
  300.     for x in range (0,size):
  301.         arrayphotos[x] = preprocessing.MinMaxScaler().fit_transform(arrayphotos[x])
  302.  
  303.     return arrayphotos
  304.  
  305. def Turntogray(arrayphotos):
  306.  
  307.     size = len(arrayphotos)
  308.     for x in range (0,size):
  309.         arrayphotos[x] = cv2.cvtColor(arrayphotos[x], cv2.COLOR_BGR2GRAY)
  310.  
  311.     return arrayphotos
  312.  
  313.  
  314. def gaussianblurArray(arrayphotos,val1,val2):
  315.  
  316.     for x in range(len(arrayphotos)):
  317.         arrayphotos[x] = cv2.GaussianBlur(arrayphotos[x],(val1,val1), val2)
  318.  
  319.     return arrayphotos
  320.  
  321. def binaryadaptive(arrayphotos,threshold,val1):
  322.  
  323.     for x in range(len(arrayphotos)):
  324.         arrayphotos[x] = cv2.adaptiveThreshold(arrayphotos[x],threshold,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,val1,10)
  325.  
  326.     return arrayphotos
  327.  
  328. def initialize_dic_majority(classes):
  329.     majority = {}
  330.     for c in classes:
  331.         majority[c] = 0
  332.  
  333.     return majority
  334.  
  335. def invertbinaryphotos(arrayphotos):
  336.  
  337.     for x in range(len(arrayphotos)):
  338.         arrayphotos[x] = cv2.bitwise_not(arrayphotos[x])
  339.  
  340.     return arrayphotos
  341.  
  342.  
  343. def loadfolderimgs(path):
  344.  
  345.     arrayphotos = []
  346.  
  347.     for img in glob.glob(path):
  348.         n = cv2.imread(img)
  349.         arrayphotos.append(n)
  350.  
  351.     return arrayphotos
  352.  
  353.  
  354. def imgtoarray(arrayphotos):
  355.  
  356.     size = len(arrayphotos)
  357.     for x in range (0,size):
  358.         arrayphotos[x] = np.array(arrayphotos[x] , dtype=float)
  359.  
  360.     return arrayphotos
  361.  
  362. def gethumoments(arrayphotos):
  363.  
  364.     for x in range(len(arrayphotos)):
  365.  
  366.         arrayphotos[x] = cv2.HuMoments(cv2.moments(arrayphotos[x]), True).flatten()
  367.  
  368.     return arrayphotos
  369.  
  370. def WCSS2(distance):
  371.     soma = 0
  372.     for x in distance:
  373.         soma += x ** 2
  374.  
  375.     return soma
  376.  
  377. def extratorCaracteristicas(arrayimgs):
  378.  
  379.     squarescarac = []
  380.  
  381.  
  382.     for x in arrayimgs:
  383.  
  384.         aux = []
  385.  
  386.         im2, countours, hierachy = cv2.findContours(x, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  387.  
  388.         if len(countours) == 0:
  389.  
  390.             for b in range(0,45):
  391.  
  392.                 aux.append(0)
  393.  
  394.         elif len(countours) > 0:
  395.             peri = cv2.arcLength(countours[0], True)  # perimetro
  396.             aux.append(peri)
  397.  
  398.             aproxx = cv2.approxPolyDP(countours[0], 0.04 * peri, True)  # vertices
  399.             vertc = len(aproxx)
  400.             aux.append(vertc)
  401.  
  402.             area = cv2.contourArea(countours[0])  # area
  403.             aux.append(area)
  404.  
  405.             if peri > 0:
  406.                 compactness = (4 * math.pi * area) / (peri ** 2)  # compacidade
  407.                 aux.append(compactness)
  408.             elif peri == 0:
  409.                 aux.append(0)
  410.  
  411.             momentum = cv2.moments(x)
  412.             momentum = list(dict.values(momentum))  # momentos
  413.             for i in momentum:
  414.                 aux.append(i)
  415.  
  416.             moments = cv2.HuMoments(momentum, True).flatten()  # Hu moments
  417.  
  418.             for i in moments:
  419.                 aux.append(i)
  420.  
  421.             histogram = get_histogram(aproxx)  # Frequencia de angulos
  422.  
  423.             for h in histogram:
  424.                 aux.append(h)
  425.  
  426.         squarescarac.append(aux)
  427.  
  428.  
  429.     return squarescarac
  430.  
  431. def niveisCinza(image):
  432.  
  433.     gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
  434.  
  435.     return gray
  436.  
  437.  
  438. def filtroGaussiano(image):
  439.  
  440.     gaussianb = cv2.GaussianBlur(image,(5,5),0)
  441.  
  442.     return gaussianb
  443.  
  444. def turnToBinary(image):
  445.  
  446.     binary = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,31,10)
  447.  
  448.     return binary
  449.  
  450. def inverterCores(image):
  451.  
  452.     invert = cv2.bitwise_not(image)
  453.  
  454.     return invert
  455.  
  456. def resizeImages(images,width,height):
  457.  
  458.     i = len(images)
  459.     for x in range(0,i):
  460.  
  461.         images[x] = cv2.resize(images[x],(width,height))
  462.  
  463.     return images
  464.  
  465.  
  466. def angle3pt(a, b, c):
  467.     """Counterclockwise angle in degrees by turning from a to c around b
  468.        Returns a float between 0.0 and 360.0"""
  469.     ang = math.degrees(
  470.         math.atan2(c[1] - b[1], c[0] - b[0]) - math.atan2(a[1] - b[1], a[0] - b[0]))
  471.  
  472.     return ang + 360 if ang < 0 else ang
  473.  
  474. def get_vertices(imagem):
  475.  
  476.     im2, countours, hierachy = cv2.findContours(imagem, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  477.  
  478.     peri = cv2.arcLength(countours[0], True)  # perimetro
  479.  
  480.     aproxx = cv2.approxPolyDP(countours[0], 0.04 * peri, True)  # vertices
  481.  
  482.     return aproxx
  483.  
  484. def get_angle(p0, p1, p2):
  485.  
  486.     v0 = np.array(p0) - np.array(p1)
  487.     v1 = np.array(p2) - np.array(p1)
  488.  
  489.     angle = np.math.atan2(np.linalg.det([v0, v1]), np.dot(v0, v1))
  490.     return np.degrees(angle)
  491.  
  492.  
  493. def get_histogram(aproxx):
  494.     zero = []
  495.     zero.append(0)
  496.     zero.append(0)
  497.     zero.append(0)
  498.     zero.append(0)
  499.     zero.append(0)
  500.     zero.append(0)
  501.     zero.append(0)
  502.     zero.append(0)
  503.     zero.append(0)
  504.     zero.append(0)
  505.     zero.append(0)
  506.     #transformando em um array bidimensional
  507.     retornopollyDP = np.reshape(aproxx, (aproxx.shape[0], (aproxx.shape[1] * aproxx.shape[2])))
  508.  
  509.     #checando se não é uma linha
  510.     if (len(retornopollyDP) < 3):
  511.  
  512.         return zero
  513.  
  514.     arraysdeangulo = []
  515.  
  516.     for x in range(len(retornopollyDP)):
  517.         # caso especial : quando a primeira posição do array for o angulo central
  518.         if x == 0:
  519.  
  520.             bla3 = get_angle(retornopollyDP[x + 1], retornopollyDP[x], retornopollyDP[len(retornopollyDP) - 1])
  521.             arraysdeangulo.append(math.fabs(bla3))
  522.  
  523.         # caso especial : quando a última posição do array for o ângulo central
  524.         if x == len(retornopollyDP) - 1:
  525.  
  526.             bla4 = get_angle(retornopollyDP[x - 1], retornopollyDP[x], retornopollyDP[0])
  527.             arraysdeangulo.append(math.fabs(bla4))
  528.  
  529.         if x > 0 and x < len(retornopollyDP) - 1:
  530.  
  531.             bla5 = get_angle(retornopollyDP[x + 1], retornopollyDP[x], retornopollyDP[x - 1])
  532.             arraysdeangulo.append(math.fabs(bla5))
  533.  
  534.     hist, bins = np.histogram(arraysdeangulo, bins=[15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180])
  535.  
  536.     return hist
  537.  
  538. import pandas as pd
  539. from numpy import ndarray
  540. from sklearn import preprocessing
  541. from sklearn.neighbors import KNeighborsClassifier
  542. from scipy import stats
  543. from sklearn.naive_bayes import GaussianNB
  544. import statistics
  545. from sklearn.metrics import pairwise_distances_argmin_min
  546. import numpy as np
  547. from random import randint
  548. import matplotlib.pyplot as plt
  549. import cv2
  550. import glob
  551. import math
  552. import os
  553. import random
  554.  
  555.  
  556. '''
  557.  
  558. Funções para pré-processamento dos dados
  559.  
  560. '''
  561. # Carregando fotos da pasta
  562. def loadFiles(path, array):
  563.  
  564.     for i in glob.glob(path):
  565.  
  566.         img = cv2.imread(i)
  567.         array.append(img)
  568.  
  569.     return array
  570.  
  571. # Função que faz o filtro cinza nas fotos
  572. def grayConversion(arrayphotos):
  573.  
  574.     size = len(arrayphotos)
  575.     for x in range (0,size):
  576.         arrayphotos[x] = cv2.cvtColor(arrayphotos[x], cv2.COLOR_BGR2GRAY)
  577.  
  578.     return arrayphotos
  579.  
  580. # Função que aplic o filtro blur nas fotos do array
  581. def blurConversion(arrayphotos ,val1, val2):
  582.  
  583.     for x in range(len(arrayphotos)):
  584.         arrayphotos[x] = cv2.GaussianBlur(arrayphotos[x],(val1,val1), val2)
  585.  
  586.     return arrayphotos
  587.  
  588. #Função que faz a binarização das fotos
  589. def binaryConversion(arrayphotos,threshold,val1):
  590.  
  591.     for x in range(len(arrayphotos)):
  592.         arrayphotos[x] = cv2.adaptiveThreshold(arrayphotos[x],threshold,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,val1,10)
  593.  
  594.     return arrayphotos
  595.  
  596. #Função que inverte as fotos binárias
  597. def invertConversion(arrayphotos):
  598.  
  599.     for x in range(len(arrayphotos)):
  600.         arrayphotos[x] = cv2.bitwise_not(arrayphotos[x])
  601.  
  602.     return arrayphotos
  603.  
  604.  
  605. # função de normalização dos dados usando o modelo de
  606. # normalização por reescala
  607.  
  608. def normalizar(dados):
  609.     x = dados.values
  610.     min_max_scaler = preprocessing.MinMaxScaler()
  611.     x_scaled = min_max_scaler.fit_transform(x)
  612.     dados_norm = pd.DataFrame(x_scaled)
  613.     return dados_norm
  614.  
  615.  
  616.  
  617. def extratorCaracteristicas(arrayimgs):
  618.  
  619.     squarescarac = []
  620.  
  621.  
  622.     for x in arrayimgs:
  623.  
  624.         aux = []
  625.  
  626.         im2, countours, hierachy = cv2.findContours(x, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  627.  
  628.         if len(countours) == 0:
  629.  
  630.             for b in range(0,45):
  631.  
  632.                 aux.append(0)
  633.  
  634.         elif len(countours) > 0:
  635.  
  636.             momentum = cv2.moments(x)
  637.             momentum = list(dict.values(momentum))  # momentos
  638.             for i in momentum:
  639.                 aux.append(i)
  640.  
  641.             moments = cv2.HuMoments(momentum, True).flatten()  # Hu moments
  642.  
  643.             for i in moments:
  644.                 aux.append(i)
  645.  
  646.             area = cv2.contourArea(countours[0])  # area
  647.             aux.append(area)
  648.  
  649.             peri = cv2.arcLength(countours[0], True)  # perimetro
  650.             aux.append(peri)
  651.  
  652.             if peri > 0:
  653.                 compactness = (4 * math.pi * area) / (peri ** 2)  # compacidade
  654.                 aux.append(compactness)
  655.             elif peri == 0:
  656.                 aux.append(0)
  657.  
  658.             aproxx = cv2.approxPolyDP(countours[0], 0.04 * peri, True)  # vertices
  659.             vertc = len(aproxx)
  660.             aux.append(vertc)
  661.  
  662.             histogram = get_histogram(aproxx)  # Histograma da Frequencia de angulos
  663.  
  664.             for h in histogram:
  665.                 aux.append(h)
  666.  
  667.         squarescarac.append(aux)
  668.  
  669.  
  670.     return squarescarac
  671.  
  672.  
  673. def resizeImages(images,width,height):
  674.  
  675.     i = len(images)
  676.     for x in range(0,i):
  677.  
  678.         images[x] = cv2.resize(images[x],(width,height))
  679.  
  680.     return images
  681.  
  682.  
  683. def get_angle(p0, p1, p2):
  684.  
  685.     v0 = np.array(p0) - np.array(p1)
  686.     v1 = np.array(p2) - np.array(p1)
  687.  
  688.     angle = np.math.atan2(np.linalg.det([v0, v1]), np.dot(v0, v1))
  689.     return np.degrees(angle)
  690.  
  691.  
  692. def get_histogram(aproxx):
  693.     zero = []
  694.     zero.append(0)
  695.     zero.append(0)
  696.     zero.append(0)
  697.     zero.append(0)
  698.     zero.append(0)
  699.     zero.append(0)
  700.     zero.append(0)
  701.     zero.append(0)
  702.     zero.append(0)
  703.     zero.append(0)
  704.     zero.append(0)
  705.  
  706.     #transformando em um array bidimensional
  707.     retornopollyDP = np.reshape(aproxx, (aproxx.shape[0], (aproxx.shape[1] * aproxx.shape[2])))
  708.  
  709.     #checando se não é uma linha
  710.     if (len(retornopollyDP) < 3):
  711.  
  712.         return zero
  713.  
  714.     arraysdeangulo = []
  715.  
  716.     for x in range(len(retornopollyDP)):
  717.         # caso especial : quando a primeira posição do array for o angulo central
  718.         if x == 0:
  719.  
  720.             bla3 = get_angle(retornopollyDP[x + 1], retornopollyDP[x], retornopollyDP[len(retornopollyDP) - 1])
  721.             arraysdeangulo.append(math.fabs(bla3))
  722.  
  723.         # caso especial : quando a última posição do array for o ângulo central
  724.         if x == len(retornopollyDP) - 1:
  725.  
  726.             bla4 = get_angle(retornopollyDP[x - 1], retornopollyDP[x], retornopollyDP[0])
  727.             arraysdeangulo.append(math.fabs(bla4))
  728.  
  729.         if x > 0 and x < len(retornopollyDP) - 1:
  730.  
  731.             bla5 = get_angle(retornopollyDP[x + 1], retornopollyDP[x], retornopollyDP[x - 1])
  732.             arraysdeangulo.append(math.fabs(bla5))
  733.  
  734.     hist, bins = np.histogram(arraysdeangulo, bins=[0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180])
  735.  
  736.     return hist
  737.  
  738.  
  739. # funcão que seleciona num quantidade de imagens aleatoriamente
  740. # em um vetor e retorna um vetor auxiliar apenas com as imagens
  741. # selecionadas
  742.  
  743. def seleciona_imagens (arrayImgs, num):
  744.     tamanho = len(arrayImgs)
  745.     selecionadas = []
  746.     nao_selecionadas = []
  747.     aux = []
  748.     var = 0
  749.  
  750.     for x in range(0, num):
  751.  
  752.         if x == 0:
  753.  
  754.             var = randint(0, tamanho - 1)
  755.             aux.append(var)
  756.             selecionadas.append(arrayImgs[var])
  757.  
  758.         elif x > 0:
  759.  
  760.             var = randint(0, tamanho - 1)
  761.  
  762.             while np.isin(var ,aux):
  763.  
  764.                 var = randint(0, tamanho - 1)
  765.  
  766.             selecionadas.append(arrayImgs[var])
  767.             aux.append(var)
  768.  
  769.     for x in range(0, tamanho):
  770.         if np.isin(x,aux):
  771.             continue
  772.         else:
  773.             nao_selecionadas.append(arrayImgs[x])
  774.  
  775.     return selecionadas, nao_selecionadas
  776.  
  777.  
  778. #função que salva as imagens na pasta dada como parâmetro
  779. def save_images(images, path):
  780.     cont = 0
  781.  
  782.     for i in images:
  783.         y = str(cont)
  784.         cv2.imwrite(path + y + '.jpg', i)
  785.         cont += 1
  786.  
  787.     return 0
  788.  
  789.  
  790. # função que retorna população de cromossomos e tem como parametros
  791. # tamanho da população (número de cromossomos) e tamanho dos cromossomos
  792. def create_population(size_population, size_chromossome):
  793.     population = []
  794.  
  795.     for y in range(0, size_population):
  796.         aux = []
  797.         for i in range(0, size_chromossome):
  798.             x = randint(0, 200)
  799.             if x % 2 == 0:
  800.                 aux.append(0)
  801.             elif x % 2 != 0:
  802.                 aux.append(1)
  803.         population.append(aux)
  804.  
  805.     return population
  806.  
  807.  
  808. # função que identifica o tamanho do cromossomo e retorna o vetor de características correspondente
  809. def decode_chromossome(chromossome):
  810.  
  811.     images_class = []
  812.  
  813.     if chromossome[0] == 0 and chromossome[1] == 0:
  814.  
  815.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_16_s.csv')
  816.         images_class = pd.DataFrame(images_class)
  817.  
  818.     elif chromossome[0] == 0 and chromossome[1] == 1:
  819.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_32_s.csv')
  820.         images_class = pd.DataFrame(images_class)
  821.  
  822.     elif chromossome[0] == 1 and chromossome[1] == 0:
  823.  
  824.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_64_s.csv')
  825.         images_class = pd.DataFrame(images_class)
  826.  
  827.     elif chromossome[0] == 1 and chromossome[1] == 1:
  828.  
  829.         images_class = pd.read_csv('C:/Users/Auricelia/Desktop/DataSetsML/Images_128_s.csv')
  830.         images_class = pd.DataFrame(images_class)
  831.  
  832.     return images_class
  833.  
  834. '''
  835.  
  836.  
  837. def fitness(chromossome):
  838.  
  839.    if chromossome[0] == 0 and chromossome[1] == 0:
  840.  
  841.        #DOFITNESS
  842.  
  843.    elif chromossome[0] == 0 and chromossome[1] == 1:
  844.  
  845.        #DOFITNESS
  846.  
  847.    elif chromossome[0] == 1 and chromossome[1] == 0:
  848.  
  849.        #DOFITNESS
  850.  
  851.    elif chromossome[0] == 1 and chromossome[1] == 1:
  852.  
  853.        #DOFITNESS
  854.  
  855. '''
  856.  
  857. #fucção que retorna as posições do array que
  858. #são usadas pelo cromossomo para a classificação
  859. def positions_chromossome(chromossome):
  860.  
  861.     selected_pos = []
  862.  
  863.     for c in range(2,len(chromossome)):
  864.         aux = []
  865.         if chromossome[c] == 1:
  866.             selected_pos.append(c)
  867.  
  868.         elif chromossome[c] == 0:
  869.             continue
  870.  
  871.     return selected_pos
  872.  
  873.  
  874.  
  875. # função que retorna o array com características selecionadas
  876. # pelo cromossomo passando as posicoes selecionadas
  877. # e o vetor com as características
  878. def carac_imagens(selected_position,array_images):
  879.     arrayzao = []
  880.     z = 0
  881.     for j in range(0,len(array_images)):
  882.         aux = []
  883.         for i in range(0,len(selected_position)):
  884.             z = selected_position[i]
  885.             aux.append(array_images[j][z])
  886.  
  887.         arrayzao.append(aux)
  888.  
  889.     return arrayzao
  890.  
  891.  
  892. #gera o conjunto dos dois melhores cromossomos para
  893. #garantir o elitismo no algoritmo genético
  894. def get_best_cromossomos(acuracias,cromossomos):
  895.     index = []
  896.     melhor = []
  897.     best_acuracia = []
  898.  
  899.     print('index antes',index)
  900.     index.append(acuracias.index(max(acuracias)))
  901.     print('index melhor',acuracias.index(max(acuracias)))
  902.     best_acuracia.append(max(acuracias))
  903.     print('best acc',max(acuracias))
  904.     acuracias[acuracias.index(max(acuracias))] = 0
  905.  
  906.  
  907.     index.append(acuracias.index(max(acuracias)))
  908.     print('index melhor',acuracias.index(max(acuracias)))
  909.     best_acuracia.append(max(acuracias))
  910.     print('best acc',max(acuracias))
  911.     acuracias[acuracias.index(max(acuracias))] = 0
  912.  
  913.     print('index dpeois',index)
  914.  
  915.     for i in range(0,len(index)):
  916.         melhor.append(cromossomos[index[i]])
  917.         cromossomos[index[i]] = 0
  918.         print('melhor',cromossomos[i])
  919.     # melhor.append(cromossomos[index[0]])
  920.     # melhor.append(cromossomos[index[1]])
  921.  
  922.     return melhor, best_acuracia, cromossomos
  923.  
  924.  
  925. # seleção por torneio gera aleatoriamente dois
  926. # cromossomos e retorna o melhor deles
  927. def tournament_selection(acuracias, cromossomos):
  928.     melhor = []
  929.     aux =[]
  930.     rand1 = randint(0,len(cromossomos)-1)
  931.     rand2 = randint(0,len(cromossomos)-1)
  932.  
  933.     while rand2 == rand1:
  934.         rand2 = randint(0,len(cromossomos)-1)
  935.  
  936.     aux.append(rand1)
  937.     aux.append(rand2)
  938.  
  939.  
  940.     if acuracias[rand1] > acuracias[rand2]:
  941.         melhor.append(cromossomos[rand1])
  942.         cromossomos[rand1] = 0
  943.  
  944.     elif acuracias[rand2] > acuracias[rand1]:
  945.         melhor.append(cromossomos[rand2])
  946.         cromossomos[rand2] = 0
  947.  
  948.  
  949.     return melhor, cromossomos
  950.  
  951.  
  952. #função que retorna o casal gerado a partir do torneio
  953. def generate_parents(melhores):
  954.     duplas = []
  955.     usados = []
  956.  
  957.     for i in range(int(len(melhores)/2)):
  958.         aux = []
  959.         rand = randint(0, len(melhores)-1)
  960.         if i == 0:
  961.  
  962.             aux.append(melhores[rand])
  963.             usados.append(rand)
  964.             rand2 = randint(0,len(melhores)-1)
  965.  
  966.             while usados.__contains__(rand2):
  967.                 rand2 = randint(0,len(melhores)-1)
  968.             aux.append(melhores[rand2])
  969.  
  970.             usados.append(rand2)
  971.             duplas.append(aux)
  972.  
  973.  
  974.         elif i > 0:
  975.  
  976.             while usados.__contains__(rand):
  977.                 rand = randint(0,len(melhores)-1)
  978.  
  979.             aux.append(melhores[rand])
  980.             usados.append(rand)
  981.  
  982.             rand2 = randint(0,len(melhores)-1)
  983.             while usados.__contains__(rand2):
  984.                 rand2 = randint(0,len(melhores)-1)
  985.             aux.append(melhores[rand2])
  986.  
  987.             usados.append(rand2)
  988.             duplas.append(aux)
  989.  
  990.  
  991.     return duplas
  992.  
  993.  
  994. #função que realiza o crossover entre os dois cromossomos
  995. #pais para a geração
  996. def crossover(taxa_crossover, parents):
  997.  
  998.     offspring = []
  999.     seed = random.uniform(0,1)
  1000.  
  1001.  
  1002.     if seed < taxa_crossover:
  1003.         cromo1_a = parents[0][:19]
  1004.         cromo1_b = parents[0][19:]
  1005.         cromo2_a = parents[1][:19]
  1006.         cromo2_b = parents[1][19:]
  1007.         offspring.append(cromo1_a+cromo2_b)
  1008.         offspring.append(cromo2_a+cromo1_b)
  1009.  
  1010.     elif seed > taxa_crossover or seed == taxa_crossover :
  1011.         offspring.append(parents[0].copy())
  1012.         offspring.append(parents[1].copy())
  1013.  
  1014.     return offspring
  1015.  
  1016.  
  1017. # função que inverte os bits de uma posição
  1018. # do cromossomo caso a seed seja superior à taxa de mutação
  1019. def mutation(taxa_mutation, offsp_1):
  1020.     seed = 0
  1021.     for i in range(0,len(offsp_1)):
  1022.         seed = random.uniform(0,1)
  1023.         if seed < taxa_mutation:
  1024.  
  1025.             if offsp_1[i] == 0:
  1026.                 offsp_1[i] = 1
  1027.  
  1028.             elif offsp_1[i] == 1:
  1029.                 offsp_1[i] = 0
  1030.  
  1031.         elif seed > taxa_mutation or seed == taxa_mutation:
  1032.             continue
  1033.  
  1034.     return offsp_1,
  1035.  
  1036. # função que calcula os valores de média, moda , mediana e desvio padrão
  1037. # para os vetores de acerto de um algoritmo, recebe como parâmetro o vetor
  1038. # de acerto e o nome do algoritmo
  1039.  
  1040. # def tendencia_central (nomeAlgoritmo, vetorAcerto, vetorTempo):
  1041. #     print('________________________________________________\n')
  1042. #     print(nomeAlgoritmo)
  1043. #     print('Tempo Média = ', np.mean(vetorTempo))
  1044. #     print('Tempo Desvio padrão = ', statistics.pstdev(vetorTempo))
  1045. #     print('Tempo Moda = ', stats.mode(vetorTempo, axis=None))
  1046. #     print('Tempo Mediana =', np.median(vetorTempo))
  1047. #     print('----------------------------------------------')
  1048. #     print('Acurácia Média = ', np.mean(vetorAcerto))
  1049. #     print('Acurácia Desvio padrão = ', statistics.pstdev(vetorAcerto))
  1050. #     print('Acurácia Moda = ', stats.mode(vetorAcerto, axis=None))
  1051. #     print('Acurácia Mediana = ', np.median(vetorAcerto))
  1052. #
  1053. #     print('________________________________________________\n')
  1054.  
  1055. def jaccard_index(receita1, receita2):
  1056.  
  1057.     index = jaccard_similarity_score(receita1, receita2)
  1058.  
  1059.     return index
  1060.  
  1061.  
  1062. def major_jaccard_index(receita1, dataframe):
  1063.  
  1064.     aux = []
  1065.  
  1066.     for receita in dataframe:
  1067.  
  1068.         jac = jaccard_index(receita1, receita)
  1069.         if jac > 0.5 or jac == 0.5:
  1070.             aux.append(jac)
  1071.  
  1072.     nearest = max(aux)
  1073.     posicao = aux.index(max(aux))
  1074.     classe = dataframe.at[posicao, 'Class']
  1075.  
  1076.     return nearest,classe
  1077.  
  1078. def mean_jaccard_index(receita1, dataframe):
  1079.     aux = []
  1080.  
  1081.     for receita in dataframe:
  1082.         jac = jaccard_index(receita1,receita)
  1083.         aux.append(jac)
  1084.  
  1085.     media = np.mean(aux)
  1086.     return media
  1087.  
  1088. # def get_probabilities():
  1089. #
  1090. #     for i in range(df_1.shape[0]):
  1091. #         soma = df_1[i].sum()
  1092. #         prob_ingrediente = soma / total_rec_1
  1093. #         p_ingrediente_1.append(prob_ingrediente)
  1094.  
  1095.  
  1096. def p_ingredientes(cromossomo, p_ingrediente_classe):
  1097.  
  1098.     aux = 1
  1099.     for i in range(len(cromossomo)):
  1100.  
  1101.         if cromossomo[i] == 1:
  1102.             aux *= p_ingrediente_classe[i]
  1103.  
  1104.         elif cromossomo[i] == 0:
  1105.             continue
  1106.     return aux
  1107.  
  1108. # função que decodifica os dois primeiros bits do cromossomo
  1109. # para identificar a sua classe
  1110. def decode_cromoossome_recipe(cromossomo):
  1111.     classe = -1
  1112.     if cromossomo[0] == 0 and cromossomo[1] == 0:
  1113.         classe = 1
  1114.     elif cromossomo[0] == 0 and cromossomo[1] == 1:
  1115.         classe = 2
  1116.     elif cromossomo[0] == 1 and cromossomo[1] == 0:
  1117.         classe = 3
  1118.     elif cromossomo[0] == 1 and cromossomo[1] == 1:
  1119.         classe = 4
  1120.  
  1121.     return classe
  1122.  
  1123.  
  1124. def total_ing_classe(p_ingrediente_classe):
  1125.  
  1126.     cont = 0
  1127.  
  1128.     for i in range(len(p_ingrediente_classe)):
  1129.  
  1130.         if p_ingrediente_classe[i] > 0:
  1131.             cont += 1
  1132.  
  1133.         elif p_ingrediente_classe == 0:
  1134.             continue
  1135.  
  1136.     return cont
  1137.  
  1138. def total_ing_receita(receita):
  1139.  
  1140.     cont = 0
  1141.  
  1142.     for i in range(len(receita)):
  1143.  
  1144.         if receita[i] == 1:
  1145.             cont += 1
  1146.  
  1147.         elif receita[i] == 0:
  1148.             continue
  1149.  
  1150.     return cont
  1151.  
  1152.  
  1153. # def fitness_receita(p_ingredientes, p_ingrediente_classe):
  1154. #     fitness = p_ingredientes *
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement