Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
funcionesKNN.cpp
00001 //#include <HardwareSerial.h> // solo para Debug 00002 00003 /*------------------------------------------ 00004 funciones para el computo del algoritmo KNN 00005 --------------------------------------------*/ 00006 //#include "dataset.h" 00007 #include "funcionesKNN.h" 00008 #include <math.h> 00009 00010 /*---------------------------------------------- 00011 calculo de distancia euclidiana entre dos puntos 00012 ------------------------------------------------*/ 00013 double distanciaEuclidiana(double pt1[], double pt2[], int co){ 00014 int i; 00015 double suma = 0; 00016 for(i=0; i<co; i++){ 00017 suma = pow(pt1[i] - pt2[i], 2) + suma; 00018 } 00019 return sqrt(suma); 00020 } 00021 00022 00023 /*--------------------------------------------------------------- 00024 calculo de distancia euclidiana entre un punto y la base de datos 00025 ----------------------------------------------------------------*/ 00026 void todasDistEuclid(double pt1[], double aux[], double** atributos, int fi, int co){ 00027 int i = 0, j = 0; 00028 double pt2[co]; 00029 00030 // falta esto 00031 for(i = 0; i<fi; i++){ 00032 // extraer un punto de la base de datos 00033 for(j=0; j<co; j++){ 00034 pt2[j] = atributos[i][j]; 00035 } 00036 00037 aux[i] = distanciaEuclidiana(pt1, pt2, co); 00038 } 00039 } 00040 00041 /*---------------------------------------------------------------- 00042 Ordenamiento de las distancias de menor a mayor 00043 ----------------------------------------------------------------*/ 00044 void ordena(double datos[], int clases[], int clasesNo[], int fi){ 00045 int i =1, j = 1, f = 1, temp[2]; 00046 00047 //crear una copia de las clases originales 00048 for(i=0; i<fi; i++){ 00049 clases[i] = clasesNo[i]; 00050 } 00051 00052 // ordenar 00053 for(i=1; (i<=fi)&&f; i++){ 00054 f = 0; 00055 for(j=0; j<(fi-1); j++){ 00056 if(datos[j+1] < datos[j]){ // orden descendente >, ascendente < 00057 temp[0] = datos[j]; temp[1] = clases[j]; 00058 datos[j] = datos[j+1]; clases[j] = clases[j+1]; 00059 datos[j+1] = temp[0]; clases[j+1] = temp[1]; 00060 f = 1; 00061 } 00062 } 00063 } 00064 } 00065 00066 /*---------------------------------------------------------------- 00067 Extraer los N primeros 00068 ----------------------------------------------------------------*/ 00069 void extraeKPrimeros(double datos[], double kPrimeros[], int clases[], 00070 int kClases[], int k){ 00071 00072 for(int i=0; i<k; i++){ 00073 kPrimeros[i] = datos[i]; 00074 kClases[i] = clases[i]; 00075 } 00076 } 00077 00078 /*---------------------------------------------------------------- 00079 Calcula la clase mas frecuente: Moda 00080 ----------------------------------------------------------------*/ 00081 int claseMasFrecuente(int clases[], int k){ 00082 00083 int cont = 0, cont2 = 0, pos = 0, num = 0, i = 0; 00084 int frec[k], mayor = 0, posmayor = 0, aux[k]; 00085 00086 // inicializar el contador de frecuencias 00087 for(i=0; i<k; i++){ 00088 frec[k] = 0; 00089 } 00090 00091 // comprobar las repeticiones de cada numero 00092 for(cont=0; cont<k; cont++){ 00093 num = clases[cont]; 00094 pos = cont; 00095 00096 for(cont2 = 0; cont2<k; cont2++){ 00097 if(clases[cont2] == num){ 00098 aux[pos]++; 00099 } 00100 } 00101 } 00102 00103 mayor =aux[0]; 00104 posmayor = 0; 00105 00106 for(cont=0; cont<k; cont++){ 00107 if(aux[cont] > mayor){ 00108 posmayor = cont; 00109 mayor = aux[cont]; 00110 } 00111 } 00112 00113 return clases[posmayor]; 00114 } 00115 00116 00117 /*---------------------------------------------------------------- 00118 Calcula la clase de un conjunto de atributos usando KNN 00119 ----------------------------------------------------------------*/ 00120 int clasificaKNN(double** datos, int clasesNum[], double dato[], int k, int fi, int co){ 00121 double distancias[fi], kPrimeros[k]; 00122 int clases[fi]; 00123 int kClases[k]; 00124 00125 todasDistEuclid(dato, distancias, datos, fi, co); 00126 ordena(distancias, clases, clasesNum, fi); 00127 extraeKPrimeros(distancias, kPrimeros, clases, kClases, k); 00128 00129 // calculo de la moda 00130 int cont = 0, cont2 = 0, pos = 0, num = 0, i = 0; 00131 int frec[k], mayor = 0, posmayor = 0, aux[k]; 00132 00133 // inicializar el contador de frecuencias 00134 for(i=0; i<k; i++){ 00135 frec[k] = 0; 00136 } 00137 00138 // comprobar las repeticiones de cada numero 00139 for(cont=0; cont<k; cont++){ 00140 num = clases[cont]; 00141 pos = cont; 00142 00143 for(cont2 = 0; cont2<k; cont2++){ 00144 if(clases[cont2] == num){ 00145 aux[pos]++; 00146 } 00147 } 00148 } 00149 00150 mayor =aux[0]; 00151 posmayor = 0; 00152 00153 for(cont=0; cont<k; cont++){ 00154 if(aux[cont] > mayor){ 00155 posmayor = cont; 00156 mayor = aux[cont]; 00157 } 00158 } 00159 00160 return clases[posmayor]; 00161 } 00162
Generated on Sun Jul 17 2022 10:16:44 by
1.7.2