Grafico para 2 dimensiones
Loading...
Loading...
Grafico para 4 dimensiones
Loading...
Loading...
Grafico para 8 dimensiones
Loading...
Loading...
Codigo Fuente
import time
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import os
import rtree
import math
import heapq
import json
class KNN:
def __init__(self, k):
self.k = k
self.data = []
def add_point(self, point):
self.data.append(point)
def euclidean_distance(self, p1, p2):
return math.sqrt(sum((a - b) ** 2 for a, b in zip(p1, p2)))
def knn_search(self, query_point):
pq = [] # Cola de prioridad para almacenar los k vecinos más cercanos
for data_point in self.data:
distance = self.euclidean_distance(query_point, data_point)
heapq.heappush(pq, (-distance, data_point))
if len(pq) > self.k:
heapq.heappop(pq)
# Utilizamos un max-heap para que los vecinos más cercanos estén al principio de la lista
neighbors = [item[1] for item in sorted(pq, key=lambda x: -x[0])]
return neighbors
tiempos_indice = dict()
tiempos_sin_indice = dict()
for D in [8]:
tiempos_indice["D="+str(D)] = list()
tiempos_sin_indice["D="+str(D)] = list()
indexes = []
for i in [2, 3, 4, 5, 6]:
N = pow(10, i)
indexes.append("N="+str(N))
for D in [8]:
# Eliminar los archivos
if os.path.exists("puntos.data"):
os.remove("puntos.data")
if os.path.exists("puntos.index"):
os.remove("puntos.index")
prop = rtree.index.Property()
prop.dimension = D
prop.buffering_capacity = 10 # M
prop.dat_extension = "data"
prop.idx_extension = "index"
# Generar los datos
data = np.random.sample((N,D))
# insertar los puntos
ind = rtree.index.Index("puntos", properties = prop)
knn = KNN(k=8)
for i in range(data.shape[0]):
punto = data[i].tolist()
ind.insert(i, punto + punto)
knn.add_point(data[i])
query = data[0]
query = query.tolist()
start_time = time.time()
ind.nearest(query+query, num_results=8)
tiempos_indice["D="+str(D)].append(time.time() - start_time)
ind.close()
start_time = time.time()
knn.knn_search(query)
tiempos_sin_indice["D="+str(D)].append(time.time() - start_time)
con_indice = tiempos_indice["D="+str(D)]
sin_indice = tiempos_sin_indice["D="+str(D)]
lista_final = sin_indice + con_indice
# Leer el contenido del archivo JSON
with open('diccionario.json', 'r') as file:
json_string = file.read()
# Cargar el JSON en un diccionario
diccionario = json.loads(json_string)
diccionario["Dimension8"] = lista_final
# Convertir el diccionario a JSON
json_string = json.dumps(diccionario)
# Escribir el JSON en el archivo
with open('diccionario.json', 'w') as file:
file.write(json_string)
Codigo para graficar
import matplotlib.pyplot as plt
import numpy as np
def crear_grafico(z,name):
# Datos para el gráfico
x = np.array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4]) # Coordenadas en el eje X
y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) # Coordenadas en el eje Y
# Configuración del gráfico 3D
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')
# Dibujar barras en 3D
ax.bar3d(x, y, np.zeros_like(z), 0.8, 0.8, z, shade=True, color='b', alpha=0.6)
# Configuración de nombres para los ejes
ax.set_yticks([0, 1])
ax.set_yticklabels(['Sin índice', 'Con índice'])
ax.set_xticks([0, 1, 2, 3, 4])
ax.set_xticklabels(['10', '100', '1000', '10000', '1000000'])
ax.set_xlabel('N')
ax.set_ylabel('Tecnicas')
ax.set_zlabel('Tiempo de ejecución (s)')
# Título del gráfico
plt.title('Gráfico de Barras 3D')
#Guardar grafico
fig.savefig(f'images/{name}.png')
#8 Dimensiones
z = np.array([0.0003974437713623047, 0.0037178993225097656, 0.03762340545654297, 0.379741907119751, 5.6130194664001465, 0.00015234947204589844, 0.00045371055603027344, 0.0008473396301269531, 0.0023872852325439453, 0.012778759002685547])
crear_grafico(z,"grafico3")