fastknn
Description
L'action fastknn effectue une recherche des k-plus proches voisins (k-nearest neighborAlgorithme de classification ou régression qui prédit la valeur d'une observation en identifiant les $k$ points les plus proches dans l'espace des données, basé sur une mesure de dista) dans SAS Viya. Elle permet de trouver rapidement quels points d'un ensemble de données de référence sont les plus similaires à des points d'un ensemble de requête. Cette action est particulièrement efficace pour les grands jeux de données grâce à son mode approximatif basé sur des graphes (HNSWAlgorithme de recherche de plus proches voisins (ANN) utilisant des graphes hiérarchiques. Il permet une indexation ultra-rapide et une recherche vectorielle efficace sur des données massives.), mais elle propose aussi une recherche exacte. C'est l'outil idéal pour la recommandation, la détection d'anomalies ou simplement pour savoir qui ressemble à qui dans votre voisinage de données !
Paramètres Clés
| Nom du paramètre | Description |
|---|---|
| query | Spécifie la table d'entrée contenant les observations pour lesquelles vous souhaitez trouver des voisins. |
| table | Spécifie la table de référence (ou d'entraînement) dans laquelle les voisins seront recherchés. |
| k | Le nombre de voisins les plus proches à identifier pour chaque point de requête (par défaut 2). |
| method | Définit si l'on veut une recherche 'EXACT' (parcourir tout) ou 'APPROXIMATE' (plus rapide sur de gros volumes). |
| distanceMetric | La mesure de distance : L2 (Euclidienne), COSINE (Cosinus) ou IP (Produit intérieur). |
| outDist | Table de sortie optionnelle pour stocker les distances calculées entre les points. |
| output | Définit la table de sortie principale contenant les identifiants des voisins trouvés. |
| id | Variables servant d'identifiants uniques pour les lignes dans les tables d'entrée. |
| inputs | Variables numériques à utiliser pour calculer les distances. |
| efConstruction | Pour la méthode APPROXIMATE, contrôle la précision de la construction de l'index (plus élevé = plus précis mais plus lent). |
| efSearch | Pour la méthode APPROXIMATE, contrôle la profondeur de recherche dans l'index (plus élevé = plus précis). |
| impute | Si true, remplace les valeurs manquantes dans la table de requête en utilisant la moyenne/mode des k voisins. |
Préparation des données
Création de données pour k-NN
Génération d'une table de référence (référence) et d'une table de test (requête) avec des coordonnées X et Y.
| 1 | DATA casuser.reference; |
| 2 | DO id = 1 to 1000; |
| 3 | x = rannor(1); |
| 4 | y = rannor(1); |
| 5 | OUTPUT; |
| 6 | END; |
| 7 | RUN; |
| 8 | DATA casuser.requete; |
| 9 | DO id = 1 to 5; |
| 10 | x = rannor(2); |
| 11 | y = rannor(2); |
| 12 | OUTPUT; |
| 13 | END; |
| 14 | RUN; |
Exemples d'utilisation
Recherche exacte de base
Trouver les 3 voisins les plus proches de manière exacte pour chaque point de la table 'requete' en utilisant les points de 'reference'.
| 1 | PROC CAS; |
| 2 | fastKnn.fastknn / |
| 3 | TABLE={name="reference"}, |
| 4 | query={name="requete"}, |
| 5 | k=3, |
| 6 | id="id", |
| 7 | inputs={"x", "y"}, |
| 8 | OUTPUT={casOut={name="knn_out", replace=true}}; |
| 9 | RUN; |
Résultat Attendu :
Recherche approximative haute performance avec distances
Utilise la méthode approximative (HNSW) pour aller plus vite que la lumière, calcule les distances cosinus, et sauvegarde les distances dans une table séparée.
| 1 | PROC CAS; |
| 2 | fastKnn.fastknn / |
| 3 | TABLE={name="reference"}, |
| 4 | query={name="requete"}, |
| 5 | method="APPROXIMATE", |
| 6 | k=5, |
| 7 | distanceMetric="COSINE", |
| 8 | efConstruction=100, |
| 9 | efSearch=50, |
| 10 | id="id", |
| 11 | inputs={"x", "y"}, |
| 12 | OUTPUT={casOut={name="knn_approx_out", replace=true}}, |
| 13 | outDist={name="knn_distances", replace=true}; |
| 14 | RUN; |
Résultat Attendu :
Imputation de valeurs manquantes par k-NN
Cette option permet de nettoyer vos données en remplaçant les trous par la 'sagesse du voisinage'.
| 1 | PROC CAS; |
| 2 | fastKnn.fastknn / |
| 3 | TABLE={name="reference"}, |
| 4 | query={name="requete"}, |
| 5 | impute=true, |
| 6 | k=10, |
| 7 | id="id", |
| 8 | inputs={"x", "y"}, |
| 9 | outImpute={name="query_imputed", replace=true}, |
| 10 | OUTPUT={casOut={name="knn_impute_log", replace=true}}; |
| 11 | RUN; |