sql >> Database >  >> RDS >> PostgreSQL

Postgres:index op cosinus-overeenkomst van float-arrays voor een-op-veel-zoekopdracht

Ik begrijp dat er geen extensie is die dit doet, dus ik heb een beperkte oplossing gevonden:

Als A en B beide genormaliseerd zijn (lengte 1), cos(A, B) = 1 - 0.5 * ||A - B||^2 . ||A - B|| is de Euclidische afstand, en cos(A, B) is de cosinus-overeenkomst. Dus grotere Euclidische afstand <=> kleinere cosinus-overeenkomst (intuïtief logisch als je je een eenheidscirkel voorstelt), en als je niet-normale vectoren hebt, heeft het veranderen van hun grootte zonder hun richtingen te veranderen geen invloed op hun cosinus-overeenkomsten. Geweldig, dus ik kan mijn vectoren normaliseren en hun Euclidische afstanden vergelijken...

Er is een leuk antwoord hier over Kubus , die n-dimensionale punten en GiST-indexen op Euclidische ondersteunt afstand, maar het ondersteunt slechts 100 of minder dimensies (kan hoger worden gehackt, maar ik had problemen rond 135 en hoger, dus nu ben ik bang). Vereist ook Postgres 9.6 of hoger.

Dus:

  1. Zorg ervoor dat ik er niet om geef dat ik maximaal 100 dimensies heb. Upgrade naar Postgres 9.6 of hoger.
  2. Vul mijn tabel met arrays om vectoren weer te geven.
  3. Normaliseer de vectoren om een ​​extra kolom van cube te maken punten. Maak een GiST-index op deze kolom.
  4. Order op Euclidische afstand oplopend om cosinus-overeenkomst aflopend te krijgen:EXPLAIN SELECT * FROM mytable ORDER BY normalized <-> cube(array[1,2,3,4,5,6,7,8,9,0]) LIMIT 10;

Als ik meer dan 100 dimensies nodig heb, kan ik dit misschien bereiken met behulp van meerdere geïndexeerde kolommen. Zal het antwoord in dat geval bijwerken.

Bijwerken: Vrij zeker dat ik niets kan doen met het splitsen van de> 100-dimensie vector in meerdere kolommen. Uiteindelijk moet ik de hele tafel scannen.



  1. Gebruiksstatistieken SQL Server-index

  2. MySQL verkeerde uitvoer met IN-clausule en parameter

  3. Registreer en voer PostgreSQL 9.0 uit als Windows-service

  4. Wat is het verschil tussen CHAR en VARCHAR in SQL Server - SQL Server / T-SQL-zelfstudie, deel 31