Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- r = lambda: -10 * np.random.random_sample((1, 10)) + 10
- p = np.array([[r()[0][0], r()[0][0]] for _ in range(60)])
- c = np.array([[r()[0][0], r()[0][0]] for _ in range(4)])
- import numpy as np
- import matplotlib.pyplot as plt
- import matplotlib.cm as cm
- import operator
- from scipy.spatial import Voronoi, voronoi_plot_2d
- class KM:
- def __init__(self,puntos= [],centroides= []):
- self.puntos= puntos
- self.centroides= centroides
- colors = cm.rainbow(np.linspace(0, 1, len(self.centroides)))
- def DI(self): # genera matriz de distancia de los centroides a todos los puntos
- D = [[np.sqrt((c[0]-pu[0]) **2 + (c[1]-pu[1]) **2) for pu in self.puntos] for c in self.centroides]
- MD = np.array(D).reshape(len(self.centroides),len(self.puntos)) # recorta el vector dintancias "D" y forma la matriz "MD"
- return MD
- def P(self): # matriz de pertenencia . correponde "uno" cuando pertece y "cero" cuando no
- P = np.zeros((len(self.centroides),len(self.puntos)))
- for i in range(len(self.puntos)):
- 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
- return P
- def K(self): # metodo para formar grupo de clusters
- KC = []
- d = np.vstack(self.puntos[filtro == 1.] for filtro in self.P()) #reordena los puntos en funcion de P() Uso un filtro boleano
- s=np.array(self.P().sum(axis=1), int) #optiene la cantidad de elementos de cada cluster sumando las filas del P()
- 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]
- KC=np.split(d,ss) # recorta al array "d" segun "ss"
- return KC
- def CA(self):#actualiza los centroides
- 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
- return C
- def BU(self):
- a=0
- while a<2:
- a=a+1
- self.centroides=self.CA()
- return self.show()
- def show(self): # metodo de visualizacion
- fig, ax1 = plt.subplots()
- pc = []
- colors = cm.rainbow(np.linspace(0, 1, len(self.centroides)))
- for i, c in enumerate(self.centroides):
- ax1.scatter(c[0], c[1], marker='o', color=colors[i], s=35)
- x_ = [x[0] for x in self.K()[i]] # formo un array con las coordenas x e y recoriendo cada cluster de K()
- y_ = [y[1] for y in self.K()[i]]
- ax1.scatter(x_, y_, marker='.', color=colors[i], s=25)
- #pc.append(np.array([self.centroides[i][0], self.centroides[i][1]]))
- #vor = Voronoi(pc)
- #voronoi_plot_2d(vor, ax1,show_vertices=False, line_colors='orange',line_width=2, line_alpha=0.6, point_size=1)
- plt.title('clusters')
- fig.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement