Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. r = lambda: -10 * np.random.random_sample((1, 10)) + 10
  2. p = np.array([[r()[0][0], r()[0][0]] for _ in range(60)])
  3. c = np.array([[r()[0][0], r()[0][0]] for _ in range(4)])
  4.  
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7. import matplotlib.cm as cm
  8. import operator
  9. from scipy.spatial import Voronoi, voronoi_plot_2d
  10.  
  11. class KM:
  12. def __init__(self,puntos= [],centroides= []):
  13. self.puntos= puntos
  14. self.centroides= centroides
  15. colors = cm.rainbow(np.linspace(0, 1, len(self.centroides)))
  16.  
  17. def DI(self): # genera matriz de distancia de los centroides a todos los puntos
  18. D = [[np.sqrt((c[0]-pu[0]) **2 + (c[1]-pu[1]) **2) for pu in self.puntos] for c in self.centroides]
  19. MD = np.array(D).reshape(len(self.centroides),len(self.puntos)) # recorta el vector dintancias "D" y forma la matriz "MD"
  20. return MD
  21.  
  22. def P(self): # matriz de pertenencia . correponde "uno" cuando pertece y "cero" cuando no
  23. P = np.zeros((len(self.centroides),len(self.puntos)))
  24. for i in range(len(self.puntos)):
  25. P[np.where(self.DI()[:,i] == np.min(self.DI()[:,i]))[0][0]][i]=1 # np.min(self.DI()[:,i], es el minimo de la columana "i" de DI(). Entrega el indice donde ensta el minimo de la columna
  26. return P
  27.  
  28.  
  29.  
  30. def K(self): # metodo para formar grupo de clusters
  31. KC = []
  32. d = np.vstack(self.puntos[filtro == 1.] for filtro in self.P()) #reordena los puntos en funcion de P() Uso un filtro boleano
  33. s=np.array(self.P().sum(axis=1), int) #optiene la cantidad de elementos de cada cluster sumando las filas del P()
  34.  
  35. ss=[sum(s[:y]) for y in range(1, len(s) + 1)] # suma acumulada de los elemento de "s" [1,2,3]-->[1,3,6]
  36. KC=np.split(d,ss) # recorta al array "d" segun "ss"
  37. return KC
  38.  
  39. def CA(self):#actualiza los centroides
  40. C = [np.array(self.K()[i].sum(axis=0), float)/len(self.K()[i]) for i in range(len(c))] #calcula la media de las coordenadas
  41.  
  42. return C
  43.  
  44. def BU(self):
  45. a=0
  46. while a<2:
  47. a=a+1
  48. self.centroides=self.CA()
  49. return self.show()
  50.  
  51. def show(self): # metodo de visualizacion
  52. fig, ax1 = plt.subplots()
  53. pc = []
  54. colors = cm.rainbow(np.linspace(0, 1, len(self.centroides)))
  55. for i, c in enumerate(self.centroides):
  56. ax1.scatter(c[0], c[1], marker='o', color=colors[i], s=35)
  57. x_ = [x[0] for x in self.K()[i]] # formo un array con las coordenas x e y recoriendo cada cluster de K()
  58. y_ = [y[1] for y in self.K()[i]]
  59. ax1.scatter(x_, y_, marker='.', color=colors[i], s=25)
  60.  
  61.  
  62.  
  63. #pc.append(np.array([self.centroides[i][0], self.centroides[i][1]]))
  64. #vor = Voronoi(pc)
  65. #voronoi_plot_2d(vor, ax1,show_vertices=False, line_colors='orange',line_width=2, line_alpha=0.6, point_size=1)
  66.  
  67. plt.title('clusters')
  68. fig.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement