Grafico para 2 dimensiones
Grafico para 4 dimensiones
Grafico para 8 dimensiones
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)
Run to view results
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")
Run to view results