me escribió un método para calcular la distancia entre dos matrices coseno:método optimizado para el cálculo de la distancia del coseno en Python
def cosine_distance(a, b):
if len(a) != len(b):
return False
numerator = 0
denoma = 0
denomb = 0
for i in range(len(a)):
numerator += a[i]*b[i]
denoma += abs(a[i])**2
denomb += abs(b[i])**2
result = 1 - numerator/(sqrt(denoma)*sqrt(denomb))
return result
Correr puede ser muy lento en una gran variedad. ¿Hay una versión optimizada de este método que se ejecute más rápido?
Actualización: He intentado todas las sugerencias hasta la fecha, incluso scipy. Aquí está la versión de superar, incorporando las sugerencias de Mike y Steve:
def cosine_distance(a, b):
if len(a) != len(b):
raise ValueError, "a and b must be same length" #Steve
numerator = 0
denoma = 0
denomb = 0
for i in range(len(a)): #Mike's optimizations:
ai = a[i] #only calculate once
bi = b[i]
numerator += ai*bi #faster than exponent (barely)
denoma += ai*ai #strip abs() since it's squaring
denomb += bi*bi
result = 1 - numerator/(sqrt(denoma)*sqrt(denomb))
return result
¿Existen matrices a y b de números complejos? –
He intentado todas las sugerencias hasta ahora, y actualmente las sugerencias de Mike Dunlavey de racionalizar el código existente han dado los mejores resultados. Supongo que dejaré la pregunta abierta en caso de que haya otras estrategias para tratar el problema, pero la mayoría de las sugerencias terminaron funcionando más despacio que el código original, por lo que Python debe hacer un muy buen trabajo optimizando sobre la marcha. Y @gnibbler, no estoy usando ningún número complejo. – Dan
No entiendo por qué tomas los abdominales antes de llegar a la plaza. –