rakha asyrofi
/
KNN_coba
machine learning mbed
main.cpp@0:b78c322e81d0, 2018-04-14 (annotated)
- Committer:
- asyrofi
- Date:
- Sat Apr 14 04:02:05 2018 +0000
- Revision:
- 0:b78c322e81d0
semoga bisa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
asyrofi | 0:b78c322e81d0 | 1 | #include "mbed.h" |
asyrofi | 0:b78c322e81d0 | 2 | #include "dataset.h" |
asyrofi | 0:b78c322e81d0 | 3 | #include "funcionesKNN.h" |
asyrofi | 0:b78c322e81d0 | 4 | #include <string> |
asyrofi | 0:b78c322e81d0 | 5 | Serial pc(USBTX, USBRX); |
asyrofi | 0:b78c322e81d0 | 6 | #define FI 100 // filas de la base de datos |
asyrofi | 0:b78c322e81d0 | 7 | #define CO 4 // numero de caracteristicas |
asyrofi | 0:b78c322e81d0 | 8 | |
asyrofi | 0:b78c322e81d0 | 9 | // variables |
asyrofi | 0:b78c322e81d0 | 10 | /*char* clasesSt[3]; // strings con las clases |
asyrofi | 0:b78c322e81d0 | 11 | char* nomAtr[CO]; // strings con los nombres de atributos |
asyrofi | 0:b78c322e81d0 | 12 | double atributos[FI][CO]; // atributos |
asyrofi | 0:b78c322e81d0 | 13 | int clasesNo[FI]; // clases |
asyrofi | 0:b78c322e81d0 | 14 | */ |
asyrofi | 0:b78c322e81d0 | 15 | double dato[CO]; // dato a clasificar |
asyrofi | 0:b78c322e81d0 | 16 | long actual = 0, previo = 0; |
asyrofi | 0:b78c322e81d0 | 17 | |
asyrofi | 0:b78c322e81d0 | 18 | //----------------------------------------------------------------------- |
asyrofi | 0:b78c322e81d0 | 19 | // Extrae caracteres dados los identificadores y los convierte a double |
asyrofi | 0:b78c322e81d0 | 20 | //----------------------------------------------------------------------- |
asyrofi | 0:b78c322e81d0 | 21 | void extraeDatos(string str, double dato[], char dlm[]){ |
asyrofi | 0:b78c322e81d0 | 22 | |
asyrofi | 0:b78c322e81d0 | 23 | string auxstr = ""; |
asyrofi | 0:b78c322e81d0 | 24 | int posdlm[5], tamstr = 0; |
asyrofi | 0:b78c322e81d0 | 25 | int i= 0, j = 0; |
asyrofi | 0:b78c322e81d0 | 26 | |
asyrofi | 0:b78c322e81d0 | 27 | // buscar caracteres de identificacion |
asyrofi | 0:b78c322e81d0 | 28 | posdlm[0] = str.indexOf(dlm[0]); // ( |
asyrofi | 0:b78c322e81d0 | 29 | posdlm[1] = str.indexOf(dlm[1]); // , |
asyrofi | 0:b78c322e81d0 | 30 | posdlm[2] = str.indexOf(dlm[1], posdlm[1] + 1); // , |
asyrofi | 0:b78c322e81d0 | 31 | posdlm[3] = str.indexOf(dlm[1], posdlm[2] + 1); // , |
asyrofi | 0:b78c322e81d0 | 32 | posdlm[4] = str.indexOf(dlm[2]); // ) |
asyrofi | 0:b78c322e81d0 | 33 | |
asyrofi | 0:b78c322e81d0 | 34 | for(j=0; j<CO; j++){ |
asyrofi | 0:b78c322e81d0 | 35 | // extraer datos numericos |
asyrofi | 0:b78c322e81d0 | 36 | for(i=posdlm[j]+1; i<posdlm[j+1]; i++){ |
asyrofi | 0:b78c322e81d0 | 37 | auxstr = auxstr + str[i]; |
asyrofi | 0:b78c322e81d0 | 38 | } |
asyrofi | 0:b78c322e81d0 | 39 | |
asyrofi | 0:b78c322e81d0 | 40 | //convertir a double |
asyrofi | 0:b78c322e81d0 | 41 | int y = auxstr.length(); |
asyrofi | 0:b78c322e81d0 | 42 | char buf[y+1]; |
asyrofi | 0:b78c322e81d0 | 43 | auxstr.toCharArray(buf, y+1); |
asyrofi | 0:b78c322e81d0 | 44 | dato[j] = atof(buf); |
asyrofi | 0:b78c322e81d0 | 45 | |
asyrofi | 0:b78c322e81d0 | 46 | //Serial.println(dato[j],3); |
asyrofi | 0:b78c322e81d0 | 47 | auxstr=""; // reset del auxiliar |
asyrofi | 0:b78c322e81d0 | 48 | } |
asyrofi | 0:b78c322e81d0 | 49 | } |
asyrofi | 0:b78c322e81d0 | 50 | |
asyrofi | 0:b78c322e81d0 | 51 | //----------------------------------------------------------------------- |
asyrofi | 0:b78c322e81d0 | 52 | // Impresion de confirmacion |
asyrofi | 0:b78c322e81d0 | 53 | //----------------------------------------------------------------------- |
asyrofi | 0:b78c322e81d0 | 54 | void imprime(double dato[], int clase){ |
asyrofi | 0:b78c322e81d0 | 55 | |
asyrofi | 0:b78c322e81d0 | 56 | pc.printf("-----------------------------------------------\n"); |
asyrofi | 0:b78c322e81d0 | 57 | pc.printf("%i",(int16_t)nomAtr[0]); pc.printf(": "); pc.printf("%i",(int16_t)dato[0],3); pc.printf(" cms\n"); |
asyrofi | 0:b78c322e81d0 | 58 | pc.printf("%i",(int16_t)nomAtr[1]); pc.printf(": "); pc.printf("%i",(int16_t)dato[1],3); pc.printf(" cms\n"); |
asyrofi | 0:b78c322e81d0 | 59 | pc.printf("%i",(int16_t)nomAtr[2]); pc.printf(": "); pc.printf("%i",(int16_t)dato[2],3); pc.printf(" cms\n"); |
asyrofi | 0:b78c322e81d0 | 60 | pc.printf("%i",(int16_t)nomAtr[3]); pc.printf(": "); pc.printf("%i",(int16_t)dato[3],3); pc.printf(" cms\b"); |
asyrofi | 0:b78c322e81d0 | 61 | pc.printf(" >> Clase: "); pc.printf("%i\n",(int16_t)clasesSt[clase]); |
asyrofi | 0:b78c322e81d0 | 62 | } |
asyrofi | 0:b78c322e81d0 | 63 | |
asyrofi | 0:b78c322e81d0 | 64 | //----------------------------------------------------------------------- |
asyrofi | 0:b78c322e81d0 | 65 | // Configuracion del microcontrolador |
asyrofi | 0:b78c322e81d0 | 66 | //----------------------------------------------------------------------- |
asyrofi | 0:b78c322e81d0 | 67 | int main() |
asyrofi | 0:b78c322e81d0 | 68 | { |
asyrofi | 0:b78c322e81d0 | 69 | pc.baud(9600); |
asyrofi | 0:b78c322e81d0 | 70 | //Serial.begin(9600); |
asyrofi | 0:b78c322e81d0 | 71 | wait(0.1); |
asyrofi | 0:b78c322e81d0 | 72 | pc.printf("===============================================\n"); |
asyrofi | 0:b78c322e81d0 | 73 | pc.printf("=== KKN Classification ===\n"); |
asyrofi | 0:b78c322e81d0 | 74 | pc.printf("===============================================\n"); |
asyrofi | 0:b78c322e81d0 | 75 | wait(0.05); |
asyrofi | 0:b78c322e81d0 | 76 | |
asyrofi | 0:b78c322e81d0 | 77 | //----------------------------------------------------------------------- |
asyrofi | 0:b78c322e81d0 | 78 | // Programa principal |
asyrofi | 0:b78c322e81d0 | 79 | //----------------------------------------------------------------------- |
asyrofi | 0:b78c322e81d0 | 80 | while(1) |
asyrofi | 0:b78c322e81d0 | 81 | { |
asyrofi | 0:b78c322e81d0 | 82 | |
asyrofi | 0:b78c322e81d0 | 83 | // recibir los datos a clasificar |
asyrofi | 0:b78c322e81d0 | 84 | if(Serial.available()) |
asyrofi | 0:b78c322e81d0 | 85 | { |
asyrofi | 0:b78c322e81d0 | 86 | |
asyrofi | 0:b78c322e81d0 | 87 | // recibir una cadena hasta que se tenga el '\n' |
asyrofi | 0:b78c322e81d0 | 88 | string str = Serial.readStringUntil('\n'); |
asyrofi | 0:b78c322e81d0 | 89 | extraeDatos(str, dato, "{,}"); |
asyrofi | 0:b78c322e81d0 | 90 | |
asyrofi | 0:b78c322e81d0 | 91 | // tic |
asyrofi | 0:b78c322e81d0 | 92 | previo = millis(); |
asyrofi | 0:b78c322e81d0 | 93 | |
asyrofi | 0:b78c322e81d0 | 94 | // encontrar la clase, con 5 vecinos cercanos |
asyrofi | 0:b78c322e81d0 | 95 | int cl = clasificaKNN((double**)atributos, clasesNo, dato, 11, FI, CO); |
asyrofi | 0:b78c322e81d0 | 96 | pc.printf("%i\n",(int16_t)cl); |
asyrofi | 0:b78c322e81d0 | 97 | |
asyrofi | 0:b78c322e81d0 | 98 | // tac |
asyrofi | 0:b78c322e81d0 | 99 | actual = millis(); |
asyrofi | 0:b78c322e81d0 | 100 | |
asyrofi | 0:b78c322e81d0 | 101 | // imprimir |
asyrofi | 0:b78c322e81d0 | 102 | imprime(dato, cl); |
asyrofi | 0:b78c322e81d0 | 103 | pc.printf("Tiempo: "); pc.printf("%i\n",(int16_t)actual-previo); pc.printf(" mS\n"); |
asyrofi | 0:b78c322e81d0 | 104 | } |
asyrofi | 0:b78c322e81d0 | 105 | } |
asyrofi | 0:b78c322e81d0 | 106 | } |
asyrofi | 0:b78c322e81d0 | 107 | |
asyrofi | 0:b78c322e81d0 | 108 |