MENTENANȚA PREDICTIVĂ A SENZORILOR MOLDOVAN SORIN-CLAUDIU CUPRINS Introducere 4 MOTIVAȚIA, IMPORTANȚA ȘI METODOLOGIA CERCETĂRII 5 Structura lucrării… [309404]
DETECȚIA ANOMALIILOR
MENTENANȚA PREDICTIVĂ A [anonimizat] 4
MOTIVAȚIA, IMPORTANȚA ȘI METODOLOGIA CERCETĂRII 5
Structura lucrării 6
Cap.1. Descrierea generală a senzorilor utilizați 8
1.1. GIROSCOPUL – ACCELEROMETRU MPU6050 8
1.2. [anonimizat]11 8
1.3. SENZORUL VIBRAȚII SW-420 8
Cap.2. Caracteristicile elementelor de circuit utilizate 9
2.1. TIPUL ELEMENTELOR DE CIRCUIT UTILIZATE 9
2.2. CONFIGURAȚIA, [anonimizat] 9
Cap.3. Problematica detecției anomaliilor 14
3.1. [anonimizat] 14
3.2. [anonimizat] 17
3.2.1. Setul de date univariat 17
3.2.2. Setul de date multivariat 18
Cap.4. Vizualizarea grafică a [anonimizat] 29
4.1. ANALIZA COMPONENTELOR PRINCIPALE 29
4.2. CARACTERISTICI PCA 30
Cap. 5. Protocolul de comunicare serială I2C (Inter Integrated Circuit) 33
5.1. CONCEPTUL I2C LA NIVEL HARDWARE 33
5.2. CONCEPTUL I2C LA NIVEL SOFTWARE 35
Cap. 6. Întreruperi hardware 37
6.1. PARTICULARITĂȚI ARDUINO UNO 37
Cap.7. Rețele neuronale 39
7.1. [anonimizat], FUNCȚII DE ACTIVARE 39
7.2. REȚEAUA NEURONALĂ CU MAI MULTE STRATURI DE NEURONI 41
7.3. ALGORITMI DE REDUCERE A ERORILOR, METODE DE PARCURGERE A REȚELEI 42
7.4. ÎNVĂȚAREA ÎN REȚELELE NEURONALE 44
Cap.8 . Tehnologii și unelte software utilizate 48
Cap.9. [anonimizat] 53
9.1. FAZELE TEHNOLOGICE UTILIZATE PENTRU REALIZAREA CIRCUITULUI IMPRIMAT 53
9.2. [anonimizat] 54
Cap.10. Achiziția datelor 56
Cap.11. Detecția anomaliilor senzorului MPU6050 59
11.1. INSPECTAREA ȘI VIZUALIZAREA SETULUI DE DATE 59
11.2. CALCULAREA ȘI APRECIEREA MANUALĂ ÎN PROCENTE A ANOMALIILOR 62
11.2.1. Calculul anomaliilor în setul quaternar 62
11.2.2. Calculul anomaliilor în setul accelerațiilor: 63
11.2.3. Estimarea anomaliilor în procente 64
11.3. Detecția anomaliilor cu ajutorul AUTOENCODER 65
11.3.1. Impărțirea setului de date 65
11.3.2. Preprocesarea datelor 66
11.3.3. Crearea modelului autoencoder în KERAS 69
11.3.4. Vizualizarea valorilor reale și a celor de predicție a modelului creat 72
11.3.5. Stabilirea pragurilor în setul de antrenare pentru etichetarea erorilor 75
11.3.6. Identificarea anomaliilor 83
11.4. DETECȚIA ANOMALIILOR CU AJUTORUL ISOLATION FOREST 92
11.4.1. Crearea modelului ISOLATION FOREST 93
11.4.2. [anonimizat] 93
11.4.3. Crearea setului de date final și asocierea etichetelor 95
11.4.4. Vizualizarea separării anomaliilor 96
Cap. 12. Detecția anomaliilor senzorului de vibrații VS40 99
12.1. INSPECTAREA ȘI VIZUALIZAREA SETULUI DE DATE 99
12.2. PREPROCESAREA DATELOR 101
12.3. ESTIMAREA ÎN PROCENTE A ANOMALIILOR RAPORTATE LA SETUL DE DATE 101
12.4. IDENTIFICARE ANOMALIILOR 101
12.5. CREAREA SETULUI DE DATE FINAL ȘI ASOCIEREA ETICHETELOR 102
12.6. VIZUALIZAREA SEPARĂRII ANOMALIILOR 103
Cap.13. Gravitatea erorilor 104
13.1. SENZORUL MPU6050 104
13.1.1. Importarea și inspectarea datelor 104
13.1.2. Asocierea ponderilor de eroare 104
13.1.3. Crearea setului de date 106
13.2. SENZORUL VS40 107
13.2.1. Importarea și inspectarea datelor 107
13.2.2. Asocierea ponderilor de eroare 108
13.2.3. Crearea setului de date 110
Cap.14. Crearea modelelor pentru mentenanță predictivă 112
14.1. SENZORUL MPU6050 112
14.1.1. Preprocesarea – transformarea datelor 112
14.1.2. Impărțirea datelor pentru antrenare-evaluare, creare model 114
14.1.3. Antrenare, evaluare 114
14.2. SENZORUL VS40 116
14.2.1. Preprocesarea – transformarea datelor 116
14.2.2. Impărțirea datelor pentru antrenare-evaluare, creare model 117
14.2.3. Antrenare, evaluare 117
Cap.15. Concluzii generale – discuții 121
15.1. APRECIERI PRIVIND TEHNICA ÎNTREBUINȚATĂ (NESUPERVIZATĂ) 121
15.2. APRECIERI PRIVIND TEHNICA SUPERVIZATĂ, CONTINUAREA PROIECTULUI 122
Bibliografie 124
Introducere
Inteligența artificială reprezintă un domeniu foarte vast și foarte uzitat în unele domenii având tendințe de implementare în viitorul apropiat în tot spectrul activităților umane, a relației ergonomice mașină – om, începând de la dispozitivele simple, uzuale de zi cu zi până la mașinăriile complexe ale diferitelor ramuri ale industriei.
Mentenanța predictivă este un concept foarte des întâlnit în zilele noastre, punând accent pe menținerea/dezvoltarea/creșterea nivelului de producție și a performanței, reducerea riscurilor de investiție a capitalului economic, planificarea, dimensionarea și previziunea cheltuielilor necesare menținerii unui ciclu de producție continuu, neîntrerupt.
Predictivitatea este o ramură importantă de exploatare a inteligenței artificiale, punând foarte mult accentul pe estimarea/calcularea autonomiei de viață a diferitelor dispozitive/mașinării cu posibilități de preîntâmpinare/evitare a diferitelor evenimente neplăcute, unele putând fi considerate cu adevărat periculoase pentru securitatea vieții, ieșite din contextul unei dorite funcționări de control și siguranță.
Dacă vechile protocoale de identificare/remediere a defecțiunilor/componentelor problematice ale diferitelor sisteme vizau relația cauză-efect, bazate pe capacități senzoriale, cunoștiințe, experiențe acumulate de diferiți specialiști/ingineri experți, inteligența artificială își propune identificarea erorilor, anomaliilor prin algoritmi și capacități senzoriale proprii destinate preluării, interpretării, monitorizării datelor: senzori cu diferite funcțiuni, modele de gândire artificială axate pe interpretarea diferitelor evenimente de context.
Detecția erorilor și predicția de mentenață a dispozitivelor/ mecanismelor de orice tip este strict bazată pe informațiile oferite de senzori destinați pentru monitorizarea lor, iar lipsa, neîndeplinirea baremelor/limitelor de funcționare sau defectarea totală a acestora duce la imposibilitatea realizării țintelor dorite pentru siguranța procesului de mentenanță predictivă în sine.
Existența unor senzori funcționali este o condiție vitală ce condiționează întreg procesul de relaționare între modelul utilizat, dispozitivul de monitorizare și operatorul/ specialistul destinat pentru informare și intervenție ce se află la finalul acestui laborios lanț.
Motivația, importanța și metodologia cercetării
Mentenanța senzorilor a devenit un subiect foarte important în domeniul aeronautic și cel medical. Spre exemplu anumiți senzorii sunt folosiți pentru asistența diferitele manevre pe care le execută pilotul. Traductorul inductiv al unghiului de atac (AOA-angle of attack) atenționează manevrele efectuate în afara limitelor unghiulare de întrebuințare pentru care a fost proiectată aeronava, introduce diferite semnale de reacție în lanțul de control al pilotul automat pe comenzile ampenajului vertical. Senzorul greutății pe roți (WOW-weight on wheels) dezactivează anumite sisteme ce pot fi declanșate inoportun la nivelul solului, etc.
Mentenanța aeronautică este un produs costisitor iar dacă nu este efectuată/ gestionată la timp generează un potențial risc pentru securitatea zborului. Un caz concludent este prăbușirea în anul 2018 a unui Boeing 737 Max aparținând companiei aeriene Lion ce a decolat din aeroportul Jakarta moment în care senzorul AOA a transmis date incorecte, activând un sistem de protecție unghiular ce a direcționat în mod repetat avionul în picaj înainte de prăbușirea sa în Marea Java, producând 189 victime.
sursa: https://www.theverge.com/
Mentenanța predictivă a senzorilor este probabil un concept nou, abordează o latură diferită, propune un model particular de realizare a mentenanței și are în centru studiul personal al limitărilor de funcționare a diferiților senzori de subiect utilizați.
Mentenanța predictivă presupune în general preluarea datelor de la senzori, prelucarea, curățarea, interpretarea lor, realizarea unui model pentru etichetarea valorilor caracteristice erorilor/anomaliilor, stabilirea algoritmilor de gravitate, construirea unui model de predicție a timpului de autonomie rămas până la defectarea totală al lor.
În lucrarea de față am identificat anomaliile, am creat modele pentru mentenanța predictivă a două tipuri de senzori: giroscopul-accelerometru (IMU-innertial measurement unit) și senzorul vibrații.
Experimentul în sine a constat în realizarea unui cablaj imprimat, replicarea unui mediu artificial de funcționare pentru diminuarea autonomiei de viață, colectarea datelor de la senzori cu ajutorul placii de dezvoltare arduino uno, salvarea lor într-o bază de date, identificarea anomaliilor, interpretarea particularizată a gravității erorilor, crearea unor modele de inteligență artificială pentru calculul necesarului de mentenanță.
Structura lucrării
Lucrarea are în compunere o parte față, introductivă și un număr de 15 capitole ce abordează fiecare în parte, subiecte/particularități specifice după cum urmează:
o introducere în domeniul mentenanței predictive, o secțiune ce evidențiază motivația, importanța și metodologia cercetării, scopul lucrării, ipoteza de lucru, structura lucrării;
o parte generală, teoretică, cap. 1 ÷ 7:
descriere generală a senzorilor, caracteristicile circuitelor, o introducere în identificarea anomaliilor, vizualizarea/reducerea dimensionalității setului de date multivariat, descrierea protocolului de comunicare I2C, generalități/particularități ale intreruperilor hardware, generalități și particularități ale sistemelor de inteligență artificială – perceptronul, rețele multistrat, reducerea erorilor, parcurgerea rețelelor, tipuri de învățare și pași necesari de urmat;
o parte specială, contribuție personală, practică, cap. 8 ÷ 14:
prezintă uneltele și tehnologiile software utilizate, procesul tehnologic pentru realizarea cablajului imprimat, schema electrică pusă în practică, cercetarea și inspecția datelor, calcularea și aprecierea manuală a anomaliilor prin tehnici de vizualizare, întrebuințarea unor algoritmi specifici pentru identificarea anomaliilor în tehnica nesupervizată (autoencoder, isolation forest, coeficientul statistic Z), etichetarea și asocierea în ponderi a gravității erorilor, crearea modelelor necesare mentenanței predictive (regresie, keras);
concluzii generale – discuții, cap. 15:
prezintă realizările, concluziile, aprecieri ale tehnicii supervizate, posibilități de continuare a subiectului de cercetare parcurs.
Cap.1 Descrierea generală a senzorilor utilizați
1.1. Giroscopul – accelerometru MPU6050
Este întrebuințat în funcții de monitorizare a mișcării și a fost adoptat în domeniul robotică, mijloace aeriene fără pilot UAV, telefoane inteligente și tablete. Dispozitivul combină un giroscop cu 3 axe, un accelerometru cu 3 axe și un procesor de mișcare digital (DMP) [1].
Senzorul dispune de trei convertoare analog-digital pe 16 biți (ADC) dedicate pentru conversia ieșirilor giroscopului și trei convertoare analog-digital pe 16 biți dedicate pentru conversia ieșirile accelerometrelor [1]. Pentru urmărirea cu precizie a mișcărilor rapide și lente, dispune de o gamă largă a plajei de programare: -250, 500, 1 000 și 2 000 °/ sec și un accelerometru programabil în valorile 2g, 4g, 8g și 16g [2], o memorie buffer FIFO cu memorie programabilă de până la 1024 biți [1]. Comunicarea cu registrele dispozitivului se realizează utilizând magistrală serială I2C.
Fig.1.1. Orientarea axelor de referință și polaritatea rotației [1].
1.2. Senzorul temperatură-umiditate DHT11
Este întrebuințat în monitorizarea temperaturii și umidității mediului ambiant în scopul protecției mărfurilor perisabile, industria agricolă, sisteme de ventilație și sisteme de aer condiționat.
Senzorul are în compunere un condensator pentru măsurarea umidității și un termistor pentru măsurarea temperaturii [3,4], un integrat ce realizează conversia analog-digitală. Gama de acuratețe pentru măsurarea temperaturii este între 0 și 500 C iar cea a umidității este între 20 și 80%.
DHT11 este un senzor grosier cu valori ale frecvenței de lucru de 1Hz, putând genera o singură ieșire/secundă.
1.3. Senzorul vibrații SW-420
Este întrebuințat în sistemele antiefracție, sistemele de monitorizare a mișcării- sisteme antifurt, mașini inteligente, monitorizarea, detecția mișcărilor plăcilor tectonice – cutremure de pământ.
Senzorul are la bază un traductor inductiv ce își modifică parametrii la vibrație, mișcare și declanșează un semnal puls la ieșire cu ajutorul unui comparator integrat LM393[5].
Cap.2. Caracteristicile elementelor de circuit utilizate
2.1. Tipul elementelor de circuit utilizate
Elemente active de circuit:
accelerometre și giroscoape MPU 6050 (IMU-innertial measurement unit);
senzori temperatură-umiditate DHT11;
senzor vibrații SW-420;
placă de dezvoltare arduino uno.
Elemente pasive de circuit:
rezistoare valoare: 5 kΩ.
2.2. Configurația, descrierea pinilor, schema internă
a. Configurația pinilor plăcii de dezvoltare Arduino uno:
Fig.2.1. Configurația pinilor arduino uno.
sursa: https://components101.com/microcontrollers/arduino-uno
Tab.2.1. Descrierea pinilor plăcii de dezvoltare arduino uno
b. Configurația pinilor de ieșire a senzorului de temperatură și umiditate DHT11:
Fig.2.2. Configrația pinilor DHT11.
sursa: https://microcontrollerslab.com/esp32-dht11-dht22-web-server/
Tab.2.2. Descrierea pinilor senzorului de temperatură și umiditate DHT11 [3,4].
c. Configurația pinilor de ieșire MPU 6050 (IMU), schema bloc internă:
Fig.2.3. Configurația pinilor MPU 6050.
sursa: https://www.elecparts101.com/mpu6050-datasheet-and-pinout-the-first-integrated-6-axis-motiontracking-device/
Tab.2.3. Descrierea pinilor MPU 6050 [1].
Fig.2.4. Shema bloc internă giroscop-accelerometru MPU6050 (IMU)[1]
d. Configurația pinilor de ieșire a senzorului vibrații SW-420, schema electrică:
Fig.2.5. Configurația pinilor senzorului de vibrații SW-420 [5].
Tab.2.4. Descrierea pinilor senzorului de vibrații SW-420.
Fig.2.6. Shema electrică a senzorului vibrații SW-420.
sursa: https://www.openhacks.com
Cap.3. Problematica detecției anomaliilor
3.1. Tehnici folosite pentru detectarea anomaliilor, dispersia datelor
Detectarea anomaliilor constă în procesul identificării valorilor, evenimentelor sau observațiilor care ridică suspiciuni prin diferențe semnificative față de majoritatea setului de date (outliers)[7,8]. Anomaliile surprind evenimente cu incidență rară precum ar fi cele corespunzătoare domeniul economic-bancar, probleme medicale, defecte structurale, echipamente care funcționează defectuos.
Vizualizarea datelor joacă un rol foarte important și poate oferi informații concludente:
Fig.3.1. Detecția valorilor outliers.
a. Tehnici pentru detectarea anomaliilor:
Tehnici nesupervizate de detectare a anomaliilor:
detectează anomaliile fără a avea eticheta sau clasificarea valorii aparținând anomaliilor sau valorilor normale, această metodă pleacă de la presupunerea că majoritatea instanțelor din setul de date sunt valori normale[24] iar celelalate care seamănă foarte puțin de restul setului de date sunt valori anormale.
Tehnici supervizate de detectare a anomaliilor:
această tehnică necesită un set de date care a fost etichetat drept „normal” și „anormal” și implică crearea unui model clasificator pentru identificarea anomaliilor[24].
Tehnici semi-supervizate de detectare a anomaliilor:
această tehnică construiește un model bazat pe valori considerate normale ale setului de date ce apoi este întrebuințat a testa probabilitatea ca o valoare să fie anormală[24].
b. Deviația standard
Presupunând un set de date X având în compunere n elemente, media aritmetică a întregului set de date poate fi exprimată cu formula:
[19]
unde: reprezintă media setului de date;
n reprezintă numărul total al elementelor existente în setul de date;
xi reprezintă poziția de instanță a elementului în setul de date;
i reprezintă suma tuturor elementelor din setul de date.
Media aritmetică a elementelor nu furnizează prea multe informații despre setul de date, dar stabilește prin calcul un așa zis punct de centru al datelor. Pentru măsurarea gradului de dispersie al datelor mai este nevoie de o altă mărime ce poate definii distanța față de acest punct de centru definit anterior, o mărime ce calculează distanța medie a punctelor față de media/ punctul de centru al datelor. Aceasta se calculează prin ridicarea la pătrat a tuturor distanțelor punctelor față de medie, adunarea lor matematică, împărțirea la numărul total de elemente și calculul rădăcinii pătrate:
[19]
unde: S reprezintă deviația standard
c.Variația
Variația reprezintă o altă modalitate de calcul al dispersiei datelor, este o mărime asemănătoare deviației standard și se calculează cu următoarea formulă:
unde: S2 reprezintă variația, deviația standard ridicată la pătrat.
d.Covariația
Covariația este o mărime ce poate fi utilizată doar în spațiul bidimensional. În timp ce o singură valoare poate captura variația unei singure dimensiuni sau variabile, pentru capturarea covariației dintre două variabile este necesară o matrice de dimensiune 2 x 2, pentru a capturarea covariației între trei variabile este necesar o matrice de dimensiune 3 x 3 și așa mai departe.
La calcularea covariației raportată la o singură dimensiune, la setul de date însuși, rezultatul acesteia este chiar variația. În cazul unui set de date tridimensional (x, y, z) se poate calcula covariația lui x față de z, x, față de z etc.
Covariația este asemănătoare variației și poate redusă la formula:
Formula covariației este următoarea:
Covariația este o mărime ce poate lua valori pozitive și negative și reflectă relația de dependență a dimensiunilor luate în calcul. Mărimea zero a covariației reflectă realția de independență a valorilor analizate.
e. Matricea de covariație
Covariația este o mărime ce analizează dependența mărimilor într-un spațiu de date bidimensional. Pentru realizarea unei covariații într-un spațiu multidimensional sau mai mult de 2, spre exemplu pentru n dimensiuni este nevoie a calcula valori ale covariației.
Calea cea mai ușoară pentru abordarea calculelor de covariație pentru n dimensiuni este cuprinderea lor într-o matrice:
[19]
unde: – C n x n reprezintă o matrice cu n coloane și n rânduri;
– Dim reprezintă dimensiunea matricei.
Matricea de covariație a unui set de date cu dimensiunea 3 (x, y, z) are trei rânduri și trei coloane cu următoaele valori astfel:
[19]
3.2. Identificare valorilor – outliers
Un proces important în identificarea anomaliilor prezente în setul de date este detecția valorilor outliers. Atunci când avem de-a face cu una sau două variabile, vizualizarea datelor poate fi adesea un punct bun de plecare. Cu toate acestea, în cazul datelor de dimensiune foarte mare, această abordare devine din ce în ce mai dificilă. Pentru abordarea acestor cazuri este folosită tehnica statisticilor multivariate care are în vedere probabilitatea distribuției datelor.
Dacă avem în vedere analiza unei colecții de date, acesteia îi va fi asociată o anumită distribuție. Pentru a detecta anomaliile într-un mod cantitativ, mai întâi este necesar a calcula distribuția probabilităților p(x) a punctele de date (spre ex. distribuția Gaussiană). Atunci când avem o nouă valoare X, se compară probabilitatea p(x) cu un prag de referință r. Dacă se indeplinește condiția: p(X) < r, respectiva valoare poate fi considerată o anomalie. Acest lucru se datorează faptului că valorile normale tind să aibă un număr mare al probabilității p(x) în timp ce exemplele anormale tind să aibă o valoare mică a p(X).
În contextul monitorizării stării de funcționare, anomaliile joacă un rol foarte important, deoarece pot reflecta „starea de sănătate” a echipamentelor. Datele furnizate atunci când echipamentul se apropie de avarie/funcționare sub parametrii optimi, au de obicei o distribuție diferită față de cele „sănătoase”.
3.2.1. Setul de date univariat
Având un set de date cu n observații ale unei variabile x, iar reprezentând media setului de date, respectiv s abaterea standard a distribuției datelor. O observație este considerată outlier [7,8] dacă se află în afara intervalului:
unde: – k reprezintă o valoare considerată: 2 sau 3.
Justificarea acestor valori se bazează pe asumarea unei distribuții normale până la un procent de 95% (respectiv 99%) a datelor în jurul valorii mean cu o lungime egală cu două (respectiv, trei) deviații standard față de acesta.
De asemenea, se așteaptă ca toate datele să fie concentrate într-un interval concentric față de medie la cel mult trei abateri standard ca semi-lungime față de aceasta.
O observație x este considerată outlier dacă se îndeplinește condiția[7,8]:
Asumpția acestei condiții are în vedere distribuția normalizată a datelor. Valorile de medie și abatere standard fiind sensibile la valorile outliers.
Una dintre uneltele de grafică folosite pentru vizualizarea outliers este boxplot:
Fig. 3.2. Reprezentarea grafică boxplot.
Observațiile aflate în afara intervalelor (Q1-3×IQR, Q3+3×IQR) sunt considerate valori extreme: extreme outliers[7,8].
Observațiile aflate în afara intervalelor (Q1-1.5×IQR, Q3+1.5×IQR) fiind considerate valori ușoare: mild outliers[7,8]..
Centrul intervalului este calculat astfel: (Q1+Q3)/2 , raza 3.5×IQR unde spațiul de interval interquartile range este IQR=Q3-Q1[7,8].
Valoarea IQR este considerată un estimator robust al variației și poate înlocui valoarea S în ecuația (2) iar valoarea centrului (Q1+Q3)/2 este un estimator al mediei/centrului și poate înlocui valoarea în ecuația (1).
3.2.2. Setul de date multivariat
Considerând un set de date B cu mai multe coloane fi și având mai multe instanțe ni. Etichetarea/clasificarea instanțelor ni aparținând unui grup sau altul rămâne o provocare. Se poate aprecia faptul că tehnica multivariată poate fi redusă la tehnica univariată de detectare a valorilor outliers. Aceasta implică ca valorile caracteristice de instanță f considerate outliers să dicteze valoarea generalizată de outlier a întregului set de valori la etichetarea acestuia. În funcție de studiul de caz sau importanța/exigența interpretărilor pe fiecare coloană, se poate considera faptul că o valoare de instanță multivariată outlier nu este același lucru cu o instanță univariată clasificată outlier. Pe de altă parte la interpretarea multivariată, o valoare de instanță poate avea mai multe valori outlier pe diferite coloane și totuși întregul set de valori nu poate fi clasificat în întregime ca outlier sau chiar dacă este clasificată outlier ea nu are valori de outlier în tot setul coloanelor[8].
a. Distanța Mahalanobis
Fie x o observație a unui set de date multivariat având mai multe observații n și un număr p coloane/caracteristici. Dacă se consideră valoarea centrul/media acestui set de date, un vector ce are dimensiunea p pentru fiecare coloană/caracteristică. Matricea X conținând valorile de medie ale coloanelor, S reprezentând matricea de covariație a coloanelor p atunci ecuația univariată (2) în cazul multivariat devine[8]:
unde:
D2 reprezintă distanța Mahalanobis al punctului x față de centrul/media setului de date;
k reprezintă pragul stabilit pentru separarea valorilor.
Valoarea pragului k poate fi asociată valorii pătratice de distribuție a datelor Chi-Square, în acest caz valoarea de prag poate fi calculată cu expresia[8]:
unde:
reprezintă distribuția pătratică a datelor Chi-Square;
α reprezintă o valoare semnificativă exprimată ca valoare de 0.5.
O metodă generală pentru identificarea cazurilor outliers în setul de date multivariat este observarea distribuției datelor în grafica boxplot luând în considerare distanța Mahalanobis:
Fig.3.3. Distanța Mahalanobis – grafica boxplot.
Această alternativă de apreciere a valorilor outliers este foarte eficientă în cazul datelor cu dispersie considerabilă, totuși această metodă nu se comportă bine în cazul datelor concentrate în clusteri.
b. Tehnica Clustering
Tehnica clustering poate fi folosită de asemenea pentru identificarea outliers. Această metodă grupează și partiționează datele funcție de anumite criterii bazate pe similaritate. Valorile outliers cu dispersie considerabilă vor forma clusteri de mărimea 1 iar cele cu dispersie mai mică vor forma clusteri de valoare mai mică.
c. Metoda PAM (Partitioning around Medoids)
Această metodă lucrează foarte bine cu seturi de date mai mici dar se mișcă foarte greu cu seturi de date largi. Acest dezavantaj a dus la dezvoltarea algoritmului CLARA (clustering large application) care împarte setul de date în mai multe unități și aplică pentru fiecare în parte metoda PAM[8].
Clustering-ul se bazează pe cunoașterea anterioară a partițiilor k ce doresc a fi create. Metoda PAM creează o partiționare inițială și apoi realizează o relocare iterativă încercând să îmbunătățească partiționarea mișcând valorile de la un grup la altul. Algoritmul are la bază partiționarea datelor astfel încât instanțele unui cluster sunt valori apropiate, asemănătoare în timp ce instanțele celorlalte clusteri sunt depărtate sau foarte diferite.
Algoritmul PAM[25] constă în:
selectarea K, căutarea unei instanțe reprezentative pentru fiecare cluster numit medoid m, care este de altfel punctul de centru al grupului;
asocierea valorilor n față de medoid-ul cel mai apropiat;
verifică ietrativ costul/ erorile cautării unui nou centru medoid m, dacă costul este mai mic atunci:
1). pentru fiecare medoid m și pentru fiecare non medoid o:
a. se înlocuiește valoarea lui m cu o, se calculează costul schimbării;
b. dacă costul curent este imbunățățit, se memorează combinația curentă de m și o;
2). se înlocuiește permanent valoarea lui mbest cu valoarea lui obest.
Complexitatea algoritmului PAM se reduce la calculul schimbării costului (pasul 3):
Calculul întregului cost:
După realizarea alocării fiecarei valori n către clusterul k se realizează separarea limită între grupuri definită ca cea mai mică diferență între două obiecte. Dacă separarea une instanțe este definită de o mărime foarte mare atunci toate instanțele clusterului atribuite sunt considerate outliers. Pentru determinarea unui cluster outlier este necesară varierea parametrului k pînă la obținerea grupurilor de dimensiune mică cu valori de separare mare față de ceilalți clusteri.
d. Identificarea bazată pe distanță – algoritmul Bay
Dacă o instanță x a unui set de date D este caracterizată de parametrii p și λ. În cazul în care cel puțin o fracțiune din p este mai mare decât distanța λ față de cel puțin trei instanțe ale lui x atunci acestă instanță poate fi considerată outlier. Această asumpție pare a fi destul ideală dar prezintă anumite dificultăți precum ar fi valoarea distanței λ sau a stabilirii numărului de vecini. Astfel, o instanță cu foarte puțini vecini la distanță λ poate fi privită ca fiind mai puternică în comparație cu o instanță cu mai mulți vecini la aceeși distanță. Complexitatea modelului constă în definiția O(kn2), unde k este numărul de caracteristici/ coloane și n este numărul de instanțe. Prin urmare, aceasta nu poate fi adoptată pentru seturi de date având număr mare de instanțe.
Având în vedere numerele întregi k și n (k <n). Valorile outliers ar putea fi stabilite ca fiind cele cu distanța cea mai mare față de vecinii cei mai apropiați kn. O deficiență a acestei asumpții este luarea în considerare doar a distanței față de anumiți vecinii kn ignorând distanțele față de punctele apropiate.
O altă alternativă ar putea fi utilizarea distanței medii față de cei mai apropiați kn vecini, variantă ce prezintă un dezavantaj al timpului de calcul.
Algoritmul Bay, depășeșete neajunsurilor menționate anterior și are ca idee principală memorarea vecinilor apropiați prin parcurgerea unui proces iterativ de căutare iar când vecinii cei mai apropiați ai unei instanțe obțin un scor mai mic decât valoarea prag, atunci instanța este eliminată, deoarece nu mai poate fi considerată outlier.
Valoarea prag sau valoarea de scor poate fi stabilită ca fiind suma distanței față de anumiți vecini kn, respectiv ca o distanța medie față de vecini kn.
Dacă n este numărul valorilor identificate outliers, BS, mărimea seturilor de date reieșite în urma impărțirii setului de date D și NB, numărul de instanțe reieșite în urma împărțirii setului de date D, algoritmul Bay constă în[7,8]:
calculul distanței (x,y) dintre două instanțe (distanța euclidiană/ manhatan): dist(x,y);
calcularea distanței maxime dintre x și un set de instanțe Y : maxdist(x,Y);
calculul vecinilor apropiați K din setul Y față de x: Closest(x,Y,k);
stabilirea scorului/ pragului față de vecinii apropiați K, ea poate fi o valoare medie a distanței față de vecinii K, score(x);
instanțierea și setarea pragului c de separare la valoarea 0;
inițializarea setului pentru memorarea outliers, un set fără valori, O ;
definirea numărului de instanțe NB;
calculul iterativ astfel:
pentru fiecare înstanță/ segment nb din NB se instanțiază numărul vecinilor la 0, Neighbors(b)=0, pentru fiecare element b din B(nb);
pentru fiecare instanță d a setului de date D, pentru fiecare element b din B, cu condiția ca b≠d, se verifică îndeplinirea condiției de prag |Neigbors(b)|<k și dacă distanța dintre cele două puncte este mai mică decât distanța maximă dintre b și vecinii lui : distance(b,d)<maxdist(b,Neighbors(b);
la îndeplinirea condiției mai sus menționate asociază cel mai apropiat vecin al lui b fiind Neighbors(b)∪ d, dacă condiția nu îndeplinește condiția de prag score(Neighbors(b),b)<c atunci b este șters din lista B(nb);
variabila O actualizează lista outliers menținând un număr definit n, Top(B(nb) ∪ O, n);
variabila c actualizează valorile de prag cu valorile cele mai mici min(score(o);
variabila O conține setul valorilor considerate outliers.
e. Autoencoder
Autoencoderul este o rețea neuronală în trei straturi ale cărei unități de ieșire sunt conectate direct la unitățile de intrare. Obiectivul autoencoderului este de a codifica intrarea dimensională i într-o reprezentare dimensională h, unde h < i, înainte de a reconstrui (decodifica) intrarea în stratul de ieșire[9].
Procesul de antrenare constă în mai multe iterații până la reducerea erorii de reconstrucție – reprezentare a datelor de intrare.
La fel ca și PCA (principal component analysis), autoencoderul este o tehnică puternică de reducere a dimensionalități și are ca scop găsirea celei mai eficiente reprezentări cu dimensiuni reduse a datelor de intrare.
Autoencoder-ul poate realiza la fel ca și structurile neuronale SOM (self organizing map) reduceri neliniare a dimensionalității[9] având capabilități de procesare a datele de intrare de mare dimensiune mai eficient decât PCA.
Autoencoder-ul este o tehnică mult mai dezvoltată și mai sofisticată, utilizează tehnici de eliminare a zgomotului și stivuire care permit reducerea datelor de înaltă dimensiune, poate fi antrenat cu o relativă ușurință având rezultate cu o precizie foarte mare.
e.1. Arhitectura rețelei
Autoencoder-ul are o structură relativ simplă. Este o rețea neuronală cu trei straturi: un strat de intrare, un strat ascuns și un strat de ieșire. O caracteristică topologică demnă de menționat este că stratul ascuns are mai puțini neuroni decât straturile de intrare și ieșire. Prima componentă „encoder” codifică datele de intrare într-o reprezentare latentă iar a doua componentă „decoder” este antrenată pentru utilizarea datelor latente cu scopul reconstruirii datelor de intrare[14].
Numărul necesar de neuroni în stratul ascuns este strict dependent de complexitatea datelor de intrare, scopul stratului ascuns este de a încapsula conținutul de informații de intrare și de a forța rețeaua neuronală să identifice importante proprietăți statistice.
O bună reprezentare în cazul datelor complexe de intrare se realizează folosind un număr corespunzător de neuroni în stratul ascuns de neuroni[9].
Performanță unei rețele autoencoder este reflectată de capacitate de reconstruire a intrării după codificarea acesteia în stratul ascuns.
Fig.3.4 Arhitectura autoencoder.
Codarea datelor între stratul de intrare și cel ascuns se realizează prin funcția de reprezentare/ transformare a datelor de intrare (x) într-o altă formă (y). Spre exemplu o funcție non-liniară de transformare sigmoid[9]:
unde: – W reprezintă valoarea ponderilor asociați lui x;
– b reprezintă o variabilă (bias) adjustabilă folosită pentru minimizarea erorilor în procesul de reconstrucție;
– S reprezintă o funcție de activare.
Stratul ascuns de neuroni realizează compresia datelor, decide părțile relevante de informație ce urmează a fi memorate și le elimină pe celelalte punând în balanță următoarele criterii:
compactitatea reprezentării, măsurată ca compresibilitate;
păstrarea unor variabile relevante de intrare din punct de vedere comportamental.
Pasul final al autoencoder-ului este decodarea, un pas ce presupune reconstrucția datelor cu aceeași dimensiune a lui x folosind o funcție de transformare asemănătoare:
unde: W’ și b’ reprezintă variabile utilizate pentru optimizarea rețelei neuronale.
e.2. Antrenarea rețelei
Antrenarea rețelei neuronale are ca scop reducerea erorilor la reconstrucția datelor de intrare. Una dintre mijloacele de calcul al erorilor ar putea fi funcția de eroare pătratică[9]:
unde: ≠ w, s, b.
e.3. Pași pentru identificarea anomaliilor:
crearea rețelei neuronale – autoencoder;
antrenarea rețelei neuronale;
identificarea pragurilor pentru semnalizarea anomaliilor prin calculul errorilor modelului antrenat;
predicția datelor de testare;
identificarea valorilor de predicție care depășesc pragurile stabilite;
asocierea/etichetarea anomaliilor din setul de date.
f. Isolation Forest
Această metodă constă în crearea arborilor iTrees iar identificarea anomaliilor se realizează prin identificarea acelor arbori a căror lungime medie este considerabil de mică în structura iTree . Metoda isolation forest are tendința izolării anomaliilor aproape de rădăcina arborilor în timp ce punctele normale sunt izolate la o adâncime terminală.
Isolation forest se bazează pe câteva variabile:
numărul de arbori care se doresc a fi construiți;
identificarea/alegerea unei lungimi rădăcină-nod terminal pentru asocierea anomaliilor;
folosirea unei mici părți a setului de date.
Performanța acestui model se bazează pe construirea unui număr mic de arbori și utilizarea unei singure părți a setului de date pentru o eficiență ridicată a identificării anomaliilor.
Avantajele acestei metode față de cele bazate pe distanță și densitate sunt următoarele:
posibilitatea de a creea modele parțiale și a exploata lungimea arborilor fără restrângeri;
fenomenul etichetării valorilor normale ca anomalii (swamping) și etichetării anomaliilor ca valori normale (masking) sunt reduse;
nu folosește criterii de distanță și densitate pentru identificarea anomaliilor;
necesită un proces scurt de calcul/ computație și resurse mici de memorie;
are capacitatea de a aborda seturi foarte mari de date cu n dimensiuni.
f.1. Algoritmul iForest
Algoritmul are la bază tendința izolării instanțelor anormale dintr-un set de date. Pentru a izola un punct de date, algoritmul generează recursiv partiții prin selectarea aleatorie a unui atribut și apoi selectarea unei valori între valorile minime și maxime permise pentru separarea acelui atribut.
Dacă se consideră un spațiu de date cu dimensiunea n=2 algoritmul realizează un anumit număr de partiții pentru separarea unei valori normale:
Fig.3.5. Separarea valorilor normale – algoritmul Iforest.
Fig.3.6. Separarea anomaliilor – algoritmul Iforest.
Se observă foarte bine bine efortul algoritmului de a izola instanțele creând partiții mult mai lungi pentru valorile normale (Xi) și partiții mult mai scurte pentru valorile anormale (Xj).
Din punct de vedere matematic, partiționarea recursivă poate fi reprezentată cu ajutorul structurii arborelui isolation tree, unde numărul necesar al partițiilor pentru a izola o instanță poate fi interpretat ca o lungime necesară pentru a ajunge de la un nod terminal la rădăcină. În acest caz putem considera lungimea căii punctului X i mai mare decât lungimea punctului X j.
Dacă se consideră un nod T, un nod extern fără descendenți sau un nod intern cu doi descendenți (Tl,Tr) și o funcție test cu atributul q și o valoare de separare p astfel încât dacă se îndeplinește condiția q<p are loc traversarea/ parcurgerea punctelor către Tl sau Tr.
Dacă se consideră un set de date X = { x1, …, xn } și , un subset al lui X, pentru a realiza o izolare iTree, algoritmul împarte în mod recursiv pe folosind valori aleatorii ale lui q și p până se îndeplinește una din condițiile:
arborele atinge o lungime limită;
valorile de nod ale lui ating aceeași valoare.
Un arbore Itree este asemănător unui arbore binar unde fiecare nod are zero sau două noduri descendente. Dacă valorile lui sunt diferite atunci fiecare instanță este izolată pe noduri externe cu o valoare numerică n iar numărul valorilor interne fiind de n-1 numărul total al nodurior atingând valoarea de 2n-1.
f.1.1. Identificarea anomaliilor
Detectarea anomaliilor constă în cuantificarea gradului de izolare a instanțelor prin:
selectarea valorilor care au o anumită lungime;
asocierea unui anumit scor pentru fiecare anomalie.
Lungimea h(x) până la un punct oarecare x reprezintă numărul total al laturilor parcurse de la rădăcină până la atingerea nodului extern.
Scoring-ul derivă din lungimea h(x) și estimarea valorii medii a acesteia prin calculele căutării corespunzătoare arborelui binar BST (binary searh tree)[11]:
unde:
– este o valoare logaritmică: ln(i) + 0.5772156649 (constanta lui Euler);
– n reprezintă numărul de instanțe a setului de date;
– C(n) reprezintă valoarea medie a lungimii arborelui h(x).
Scoring-ul S asociat unei instanțe x este calculat astfel[11]:
unde:
– E(h(x)) reprezintă media h(x) a mai multor colecții de arbori Itrees;
valori pe care le poate avea E[11]:
Interpretarea valorilor lui S:
– dacă valoarea de instanță întoarce o valoare S aproape de 1, atunci aceasta poate fi asociată anomaliilor;
– dacă valoarea de instanță întoarce o valoare S mult mai mică de 0,5 atunci aceasta este asociată valorilor normale;
– dacă toate instanțele întorc o valoare S ≈0.5 atunci întregul set de date este asociat valorilor normale.
Fig.3.7. Relația dintre lungimea E și scoring-ul S.
(adaptare a figurii 2 din ref[11])
f.1.2. Pași pentru identificarea anomaliilor folosind iForest:
definirea numărului și construirea arborilor;
antrenarea în vederea izolării instanțelor, lungimea limită a arborilor fiind stabilită funcție de valoarea setului de intrare X: l= ceiling(log2 X);
evaluarea valorilor de intrare X1..n folosind funcția de evaluare a lungimii de parcurgere a arborelui de la rădăcină la un nod terminal extern S(x,n) ;
etichetarea anomaliilor.
Cap.4. Vizualizarea grafică a setului de date multivariat – reducerea dimensionalității
4.1. Analiza componentelor principale
Componenta principală sau reducerea componentelor/caracteristicilor unui set de date multivariat într-un set de date mult mai redus este o soluție de reprezentare a datelor multivariate într-un spațiu de reprezentare bidimensional 2D reprezentativ pentru toate datele ca întreg.
Componenta principală rezumă în procesul identificării axelor cu cea mai mare variație a setului de date astfel[9,19]:
identificarea punctului de centru al setului de date;
calclularea matricei de covariație a setului de date;
calcularea vectorului eigen a matricei de covariație;
normalizarea ortogonală a vectorilor eigen;
calcularea variației reprezentate de fiecare vector eigen.
Un pas important în reducere dimensionalității utilizând PCA este calcularea matricei de covariație.
Vectorul eigen este un vector asociat unui set de date și a unei transformări liniare, un vector care nu se schimbă în direcție după efectuarea transformării.
Ortogonalizarea este procesul de a găsi doi vectori care formează un unghi drept unul față de celălalt. Într-un spațiu multidimensional, procesul de ortogonalizare ia un set de vectori și produce un set de vectori ortogonali.
Ortonormalizarea este un proces de ortogonalizare.
Valoarea vectorului eigen (ce corespunde aproximativ lungimii vectorului eigen) este utilizată pentru a calcula proporția de variație reprezentată de fiecare vector eigen.
Aceasta se calculează prin împărțirea valorii proprii a fiecărui vector eigen la suma tuturor valorilor eigen corespunzătoare tuturor vectorilor eigen.
În concluzie, matricea de covariație este utilizată pentru a calcula vectorii eigen. Apoi este realizat un proces de ortonormalizare care produce vectori ortogonali, normalizați din vectorii eigen. Vectorul eigen cu cea mai mare valoare a valorii eigen este prima componentă principală având componente succesive cu valori proprii mai mici:
În acest fel, algoritmul PCA are ca efect preluarea unui set de date și transformarea acestuia într-un nou sistem de coordonate cu dimensiuni mai mici.
4.2. Caracteristici PCA
a. Păstrarea variației
Algoritmul PCA identifică axele cu cea mai mare variație (cu valoarea vectorului eigen cea mai mare) a setului de antrenare. De asemenea se bazează pe o a doua axă, perpendiculară pe cea găsită anterior având o cantitate remanentă a procentului de variație și continuă același proces de căutare dacă avem în vedere cazul unui set de antrenare multidimensional.
Fig.4.1. Variația vectorilor în PCA .
(adaptare a figurii 8-7 din ref[13])
În figura din dreapta se observă foarte bine proiecția valorilor pe cele trei axe (1, 2 și 3), axa nr. 1 având un grad mai mare de proiecție, axa nr. 2 o valoare intermediară a gradului de proiecție, respectiv axa nr. 3 cu o valoare mai mică a gradului de proiecție. În acest caz particular PCA definește valori diferite ale componentelor funcție de procentul de reprezentare a variației: ith unde prima componentă este 1st PC – C1, a doua componentă fiind 2nd PC – C2 respectiv a treia componentă 3th PC – C3.
b. Reducerea dimensiunii
Având cele trei componente identificate se poate reduce dimensionalitatea setului de date la un spațiu limitat de dimensiunea d cu ajutorul planului definit de primele două componente:
Fig.4.2. Transpunerea în spațiu 2D cu ajutorul PCA[13].
Ecuația transpunerii [13] într-un spațiu de dimensiunea d este următoarea:
unde: – x reprezintă matricea setului de intrare;
– Wd reprezintă matricea componentelor principale utilizate.
Pentru alegerea gradului de reprezentare a setului de date multidimensional se poate realiza un grafic al funcției de variație:
Fig.4.3. Raport variație – număr dimensiuni PCA.
(adaptare și interpretare personalizată a fig. 8-8 din ref.[13])
În figura de mai sus se poate observa gradul de reprezentare al datelor funcție de numărul componentelor identificate 350. Valoarea de proiecție a funcției elbow pe ordonată reprezintă procentul de reprezentare a datelor raportate la 100%. Se observă că alegând o valoare a PCA de 150 nu afectează gradul de reprezentare a setului de date. Dacă se dorește o valoare mai mică componentelor spre ex. 15 PCA, atunci valoarea de reprezentare a datelor scade la 60%.
Cap. 5. Protocolul de comunicare serială I2C (Inter Integrated Circuit)
Protocolul I2C permite mai multor dispozitive slave să comunice cu unul sau mai multe dispozitive master.
Fig.5.1. Protocolul de comunicație serială I2C.
5.1. Conceptul I2C la nivel hardware
Acesta este compus din două fire: SCL (serial clock line) și SDA (serial data line)[17]. SCL este utilizat pentru a sincroniza toate transferurile de date cu magistrala I2C. SDA este linia de date. Cele 2 fire sunt conectate la toate dispozitivele din magistrala I2C. Ambele linii SCL și SDA sunt drivere de tip open drain[26], ceea ce inseamna ca poate trage o anumita linie de semnal in 0 logic, dar nu o pot conduce spre 1 logic. Fiecare linie de semnal are un rezistor pull-up, pentru a putea readuce semnalul pe high cand nici un alt dispozitiv nu cere low. Dispozitivele din magistrala I2C sunt fie master, fie slave. Masterul este întotdeauna dispozitivul care conduce SCL. Slave sunt dispozitivele care răspund masterului. În bus-ul I2C pot exista mai multe dispozitive slave și un singur master. Atât dispozitivele master, cât și slave pot transfera date prin magistrala I2C, dar acest transfer este întotdeauna controlat de master. Pentru inițierea unei comunicații masterul emite o secvență de pornire pe magistrala I2C. Secvențele de oprire/oprire sunt singurele poziții în care SDA (semnalul de date) se poate modifica în timp ce SCL (semnalul clock) este ridicat. În momentul transferării datelor, SDA rămâne stabil și nu se schimbă în timp ce SCL este ridicat. Secvențele de pornire și oprire marchează începutul și sfârșitul unei tranzacții cu dispozitivul slave[26].
Fig.5.2. Secvența start/stop a transferului de date în protocolul I2C[1,26].
Datele sunt transferate în lungime de 8 biți. Biții sunt așezați pe linia SDA începând cu MSB (bitul cel mai semnificativ). Linia SCL este high, apoi low. Pentru fiecare 8 biți transferați, dispozitivul care primește datele trimite înapoi un bit de confirmare. Dacă dispozitivul receptor trimite înapoi un bit ACK (acknowledge) scăzut, atunci a primit datele și este gata să accepte un alt octet. Dacă trimite înapoi un nivel high, atunci indică faptul că nu poate accepta alte date și masterul ar trebui să încheie transferul trimițând o secvență de oprire.
Fig.5.3. Structura datelor de transfer în protocolul I2C[1,26].
Fig.5.4. Transferul complet al datelor în protocolul I2C.
sursă: https://learn.sparkfun.com/tutorials/i2c/all
Adresele I2C sunt structurate pe 7 biți sau 10 biți. La trimiterea adresei de 7 biți se trimite întotdeauna 8 biți. Bitul suplimentar este folosit pentru a informa dispozitivul slave dacă masterul îi scrie sau citește din el. Dacă bitul este zero, masterul scrie sclave-ului. Dacă bitul este 1, masterul citește de la slave. Adresa de 7 biți este plasată în cei 7 biți superiori ai octeților, iar bitul de citire / scriere (R / W) este în LSB (cel mai puțin semnificativ bit).
Fig.5.5. Structura adreselor utilizate în protocolul I2C[1,26].
Dupa ce primii 8 biți ai cadrului sunt transmisi, dispozitivului receptor îi este dat controlul asupra SDA-ului. Daca acest dispozitiv nu schimba in 0 logic linia SDA inainte de al nouălea puls SCL, se poate deduce ca acesta nu a primit datele, ori nu a știut să interpreteze mesajul recepționat. In acest caz, schimbul de date se oprește și rămâne la latitudinea dispozitivului "master" cum va proceda mai departe.
5.2. Conceptul I2C la nivel software
Master-ul va trimite o secvență de pornire. Acest lucru va avertiza toate dispozitivele slave legate la magistrala bus că începe o tranzacție și ar trebui să asculte. În continuare, masterul va trimite adresa dispozitivului. Slave-ul care se potrivește cu această adresă va continua cu tranzacția, alții vor ignora restul acestei tranzacții și vor aștepta următoarea. După ce s-a adresat dispozitivului slave, master-ul trebuie să trimită acum locația internă sau numărul de înregistrare din interiorul slave-ului pe care dorește să-l scrie sau să-l citească. Acest număr depinde în mod evident de ceea ce este de fapt slave-ul și de câte registre interne are. După ce a trimis adresa I2C și adresa de registru intern, master-ul poate trimite octetul de date. Master-ul poate continua să trimită octeți de date către sclave și acestea vor fi în mod normal plasate în registrele următoare, deoarece slave-ul va crește automat adresa de registru intern după fiecare octet. Când masterul a terminat de scris toate datele slaveu-lui, acesta trimite o secvență de stop care finalizează tranzacția.
Deci, pentru a scrie/citi registrele unui dispozitiv slave sunt parcurși următorii pași[26]:
se trimite o secvență de pornire
se trimite adresa I2C a slave-ului cu bitul R / W scăzut (adresa uniformă)
se trimite numărul de registru intern pe care se dorește al scrie
se trimite setul de date în biți
opțional, se trimite octeți de date suplimentare
se trimite secvența de oprire.
Cap. 6. Întreruperi hardware
Întreruperea reprezintă un semnal electronic transmis procesorului ce indică necesitatea unei imediate atenții. Aceasta are ca rezultat oprirea codului intern de execuție, salvarea stării interne și execuția funcției de întrerupere ISR (interrupt service routine). Întreruperea este temporarră iar după executarea codului ISR, procesorul revine la continuarea execuției codului de rutină la momentul întreruperii.
Fig. 6.1. Algoritm întrerupere hardware.
Intreruperea hardware are loc când pinul extern de întrerupere își schimbă starea de la LOW la HIGH, respectiv de la HIGH la LOW. Întreruperea software are loc în conformitate cu instrucțiunile implementate în programul software (ex. întreruperile de timp).
6.1. Particularități Arduino Uno
Metoda cea mai des folosită utilizând arduino uno este intreruperea hardware, aceasta poate fi declanșată pe nivelurile LOW, CHANGE, RISING, FALLING[1,18].
RISING reprezintă timpul de tranziție pentru declanșarea unei întreruperi atunci când pinul trece de la LOW la HIGH.
FALLING reprezintă timpul de tranziție pentru declanșarea unei întreruperi atunci când pinul trece de la HIGH la LOW.
CHANGE reprezintă timpul de tranziție pentru declanșarea unei întreruperi atunci când pinul trece de la LOW la HIGH sau HIGH la LOW.
Serviciul de întrerupere a rutinei (ISR) reprezintă un eveniment care are un set de instrucțiuni pentru procesare. La momentul executării întreruperii, procesorul execută cu prioritate codul existent în serviciul ISR și apoi revine la starea de normalitate.
Întreruperea se realizează folosind metodele digitalPinToInterrupt (pin) și attachInterrupt (digitalPinToInterrupt (pin), ISR, mod)[27] unde:
ISR reprezintă funcția care se numește atunci când se face o întrerupere externă.
Mod reprezintă tipul de tranziție pentru declanșarea rutinei ISR: RISING, FALLING.
Cap.7. Rețele neuronale
7.1. Neuronul artificial – perceptronul, funcții de activare
Perceptronul reprezintă unitatea fundamentală a rețelei neuronale având rolulu de a procesa o serie de intrări pentru a produce un rezultat de ieșire utilizănd o funcție internă de activare.
Fig.7.1. Perceptronul (neuronul artificial).
Ecuația valorii de intrare a perceptronului este următoarea:
n
Z = ∑ wixi + b
i=0
unde:
– n reprezintă numărul intrărilor, wi = numarul ponderilor; xi = valoarea intrărilor,
– b reprezintă bias-ul (folosit pentru evitarea valorii 0 de ieșire a perceptronului).
Funcții de activare
a. Funcția treaptă: întoarce valori de ieșire 0 sau 1.
Fig.7.2. Caracteristica funcției de ieșire treaptă.
b. Funcția sigmoidală: întoarce valori de ieșire între 0 și 1
Fig.7.3. Caracteristica funcției de ieșire sigmoidală.
c. Funcția tangentă-hiperbolică: întoarce valori de ieșire între -1 și 1
Fig.7.4. Caracteristica funcției de ieșire – tangentă-hiperbolică.
d. Funcția liniară – întoarce valori de ieșire între 0 și Z
.
Fig.7.5. Caracteristica funcției de ieșire liniară.
7.2. Rețeaua neuronală cu mai multe straturi de neuroni
Rețelele neuronale compuse din mai multe straturi de neuroni artificiali depășesc dezavantajele unui singur neuron crescând complexitatea problemelor pe care o poate învăța. Cea mai simplă rețea neuronală se numește multilayer perceptron sau MLP [12].
Fig.7.6. Structura rețelei MLP (multy layer perceptron).
În acest caz setul de antrenare are direcția de propagare înainte (feedforward) iar erorile sunt întoarse (back propagation) și minimizate cu ajutorul metodei gradient descent [12] ce va calcula erorile și va adjusta fiecare pondere a rețelei.
Funcția de activare a unui singur strat ascuns de neuroni al rețelei neuronale este următoarea:
unde:
– Xi reprezintă intrarea în rețeaua neuronală;
– Wji (1) reprezintă ponderii asociați primului strat de neuroni;
– Wkj(2) reprezintă ponderii asociați stratului ascuns de neuroni.
La nivelul rețelelor neuronale există următoarele conexiuni:
conexiuni intra-nivel stabilite între neuronii unor straturi diferite;
conexiuni inter-nivel stabilite între neuronii aceluiași strat.
Rețeaua neuronală este compusă din cel puțin două straturi de neuroni, care au rolul de comunicare cu mediul exterior:
stratul de intrare are rolul de preluare a datelor de intrare și propagare a acestora în întreaga rețea;
straturile ascunse;
stratul de ieșire, unde sunt captate ieșirile rețelei neuronale.
7.3. Algoritmi de reducere a erorilor, metode de parcurgere a rețelei
a. Calcul erorilor (Costul)
Expresia erorilor definește diferența rezultatelor obținute față de performațele scontate:
C =∑(y-a)2 /n
unde:
C – reprezintă eroarea medie pătratică (costul);
y – reprezintă valoarea adevărată;
a – reprezintă predicția neuronului.
C = (-1/n)∑(y ln(a) + (1-y) ln(1-a)
unde:
C – reprezintă entropia (crossentropy);
y, a – reprezintă valoarea adevărată, respectiv predicția;
b. Gradientul stochastic SGD
Pentru reducerea erorilor gradientul stochastic caută în mod iterativ valorile de minim ale funcției cost și realizează adjustări ale ponderilor w (weights).
Fig.7.7. Căutarea punctului de minim – funcția gradient.
c. Metoda parcurgerii înainte (forwardpropagation)
Reprezintă modul de realizare a predicției prin preluarea informațiilor de intrare, parcurgerea primului strat, parcurgerea straturilor ascunse până la ultimul strat care asigură ieșirea rețelei.
Dacă se consideră o rețea neuronală cu un singur strat ascuns atunci această parcurgere poate fi exprimată matematic prin formula:
unde:
PRED reprezintă predicția;
actv reprezintă funcția de activare;
X reprezintă intrarea în stratul ascuns de neuroni;
Wh reprezintă ponderii w de intrare în stratul ascuns;
W0 reprezintă ponderii w de intrare în ultimul strat.
Algoritm de parcurgere:
se calculează intrarea în stratul ascuns de neuroni X Wh ;
se aplică funcția de activare la nivelul stratului ascuns și se transmite valoarea de ieșire H=act(XWh) la intrarea ultimului strat de neuroni;
se repetă cei doi pași menționați anterior luând ca variabilă pe H și ponderii de intratre în stratul de ieșire W0.
d. Metoda parcurgerii înapoi (backpropagation)
Scopul metodei backpropagation este adjustarea ponderilor rețelei funcție de eroarea individuală care o propagă în eroarea de cost.
Expresia matematică a costului raportat la un singur neuron este următoarea:
[23]
unde:
reprezintă valoarea de intrare în rețeaua neuronală;
R reprezintă funcția de activare a neuronlui R=max(0,Z);
C reprezintă funcția de cost raportată la un singur neuron, .
Derivatele funcțiilor Z, R și C sunt următoarele:
; ; .
Pentru calcularea erorilor la nivelul ponderilor se derivează expresia costului funcție de W:
= [23]
Algoritmul de parcurgere:
se calculează eroarea de ieșire a stratului de neuroni și se introduc rezultatele la intrarea stratului anterior ascuns de neuroni, după calcularea erorii la nivelul stratului ascuns de neuroni se introduc rezultatele în stratul ascuns anterior de neuroni și așa mai departe;
la fiecare pas al parcurgerii înapoi al rețelei neuronale se calculează derivata costului raportată la ponderii fiecărui strat de neuroni;
se actualizează ponderii folosind derivatele costului raportat la fiecare unitate W.
Valoarea erorii corespunzătoare stratului de ieșire avînd ca referința valoarea de intrare corespunzătoare Z0 este:
[23]
Valoarea erorii corespunzătoare stratului ascuns de neuroni avînd ca referința valoarea de intrare corespunzătoare Zh este:
[23]
[23]
Expresia matematică generalizată pentru eroarea tuturor ponderilor:
C’(w) = Eroarea stratului curent de neuroni · Valoarea de intrare a stratului current de neuroni
Valoarea de intrare a stratului de neuroni desemnează valoarea de ieșire a funcției de activare a stratului de neuroni anterior.
7.4. Învățarea în rețelele neuronale
a. Învățarea supervizată
Are la bază cunoașterea istoricului evenimentelor, se bazează pe învățarea și predicția unei etichete cunoscute. Dacă se are în vedere predicția unei etichete aparținând unei categorii specifice atunci avem de-a face cu o problemă de clasificare iar dacă avem de-a face cu predicția unor valori continue (valorile singulare) atunci avem de-a face cu o regresie;
b. Învățarea nesupervizată
În cazul învățării nesupervizate nu se cunoaște istoricul etichetelor și are la bază impărțirea/ gruparea datelor într-un cluster de apartenență funcție de anumite criterii de selecție stabilite prin interpretarea particulară și personalizată a cercetătorului/ omului de știință.
c. Învățarea competitivă (reinforcement)
Învățarea competitivă se deosebește de celelalte două prin domeniul învățării automate preocupată de modul în care agenții software trebuie să întreprindă acțiuni într-un anumit mediu pentru a maximiza noțiunea de recompensă.
Această învățare se bazează pe transpunerea situațiilor în acțiune, merge pe rezultatul încercărilor și erorilor care generează cea mai valoroasă recompensă/premiu. Spre exemplu – calculatorul care rulează un joc, calculatorul care conduce o mașină. În acest context agentul (calculatorul) este cel care ia deciziile, mediul dinamic de interacțiune este de obicei un proces de decizie Markov[20], acțiunea reprezintă acțiunile pe care le poate întreprinde agentul.
c.1. Pași esențiali în procesul de învățare supervizată:
ACHIZIȚIA DATELOR CURĂȚAREA DATELOR SET TESTARE (30%)
SET ANTRENARE (70%)
ANTRENARE MODEL
Adjustarea
Parametrilor EVALUAREA MODELULUI
UTILIZARE MODEL
Fig.7.8. Pași esențiali în procesul de învățare supervizată.
c.2. Pași esențiali în procesul de învățare nesupervizată:
ACHIZIȚIA DATELOR CURĂȚAREA DATELOR
SET PENTRU ANTRENARE
ANTRENARE MODEL
Adjustare
Parametrii EVALUARE MODEL
UTILIZARE MODEL
Fig.7.9. Pași esențiali în procesul de învățare nesupervizată.
ACHIZIȚIA DATELOR
CURĂȚAREA DATELOR
SET EVALUARE
SET PENTRU
TESTARE (30%)
SET PENTRU
ANTRENARE (70%)
ANTRENARE
Adjustare
parametrii
TESTARE
E VALUARE MODEL
UTILIZARE MODEL
Fig.7.10. Pași esențiali în procesul de învățare nesupervizată.
Cap.8 . Tehnologii și unelte software utilizate
a. Arduino Uno și arduino C
Arduino uno este o placă electronică de dezvoltare cu capabilități de citire a semnalelor de intrare și funcție de instrucțiunile software poate acționa diferite elemente de execuție. Avantajul utilizării arduino este ușurința proiectării, accesul la o bază largă de date, punerea la dispoziție un set gratuit de unelte software, unelte care pot fi particularizate/ adaptate la necesitățile și oportunitățile dezvoltatorilor[16,17,18].
Pentru realizarea comunicației seriale cu placa de dezvoltare arduino uno am instalat suportul driver pentru OS pe 64 biți: USB-SERIAL CH341SER[29].
Pentru interfațarea cu arduino a senzorilor de umiditate și vibrații am particularizat[21] schemele puse la dispoziție de adafruit. Interfațarea senzorilor giroscop – accelerometru MPU 6050 s-a realizat folosind librăriile puse la dispoziție de producătorul InvenSense, I2Cdev și MPU6050[28].
Senzorul MPU6050 este un senzor versatil ce oferă multe variante de configurare funcție de domeniul de utilizare. Datele de ieșire pot fi captate în stadiu raw fără prea multe adjustări ale valorilor de zgomot sau pot fi tranzitate prin DMP[1,28] unde pot fi introduse limitări sau adjustări ale factorului de zgomot.
Deoarece nu am utilizat alți senzori de extensie slave, în special un magnet de corecție a momentului de girație, respectivii senzori prezintă dezavantajul fenomenului de alunecare a valorilor în unitatea de timp (în special girație). Pentru depășirea acestui dezavantaj am folosit alternativa introducerii corecțiilor și rutina ISR pin interrupt[18,27]. Valorile de adjustare au fost introduse fiecărui mărimi din șirul quaternar de reprezentare a poziției în spațiu (w,x,y,z) precum și valorilor de accelerație adiacente celor trei axe de referință (x, y și z) după cum urmează:
definirea pinilor arduino pentru rutina ISR:
#define INTERRUPT_PINH 2
#define INTERRUPT_PINL 3
rutina ISR cu setul de instrucțiuni:
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PINH), dmpDataReadyH, RISING);
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PINL), dmpDataReadyL, RISING);
introducerea corecțiilor pentru fiecare senzor MPU6050 în parte:
//mpu H
mpuH.setXGyroOffset(-21);
mpuH.setYGyroOffset(46);
mpuH.setZGyroOffset(8);
mpuH.setZAccelOffset(360);
mpuH.setYAccelOffset(2397);
mpuH.setXAccelOffset(-1903);
//mpu L
mpuL.setXGyroOffset(165);
mpuL.setYGyroOffset(23);
mpuL.setZGyroOffset(19);
mpuL.setZAccelOffset(-322);
mpuL.setYAccelOffset(-3425);
mpuL.setXAccelOffset(-3996);
Fișierele arduino sketch au în compunere două funcții vitale void și loop[16,17]:
void setup(){}, funcție ce este chemată o singură dată și are rolul declarării, inițierii variabilelor, librăriilor, desemnarea pinilor;
void loop(){}, funcție ce realizează iterații infinite, execută codurile/instrucțiunile subsecvente.
b. Xampp, MySQL
Pentru stocarea valorilor de ieșire ale senzorilor utilizați am folosit serverul Apache XAMPP pentru OS windows și baza de date MySQL.
Xampp este un mediu de dezvoltare local destinat pentru testarea proiectelor bazate pe HTML, CSS, PHP si MySQL[31]. Este o alternativă foarte rapidă pentru a avea într-un singur pachet, ușor de configurat, toate elementele necesare dezvoltării aplicațiilor web.
Am creat și structurat baza de date[22] SENZORI creând tabelul DATE SENZORI INTEGRATE prin următoarea comandă de consolă MySQL:
CREATE DATABASE IF NOT EXISTS `SENZORI`
DEFAULT CHARACTER SET = utf8mb4
DEFAULT COLLATE = utf8mb4_general_ci;
USE `SENZORI`;
CREATE TABLE IF NOT EXISTS `DATE SENZORI INTEGRATE` (
`id` int(11) AUTO_INCREMENT NOT NULL,
PRIMARY KEY (`id`),
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`MPU69W` varchar(255) NOT NULL,
`MPU69X` varchar(255) NOT NULL,
`MPU69Y` varchar(255) NOT NULL,
––––––––––––––––––-
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
DEFAULT COLLATE = utf8mb4_general_ci.
c. Serverul node javascript
Serverul node este un mediu de dezvoltare ce poate fi instalat pe o mașina locală ce furnizează toate librăriile necesare lansării fișierelor javascript.
Am utilizat javascript deoarece oferă posibilitatea cu ajutorul librăriei serialport mysql[32] interfațarea cu placa de dezvoltare arduino uno. Fișierul javascript realizează și inițiază conexiunea cu baza de date, caută portul serial de comunicație disponibil USB3 – placa de dezvoltare arduino uno prin const SerialPort = require('serialport') și SerialPort.list, stabilește rata de transfer/sincronizare a datelor prin const baudRate = 38400, gestionează fluxul de date prin callback port.on('data', receiveSerial). Citește pe linii datele întregului set de valori prin class TextParser, realizează o impărțire (parsing) al setului de date[30]. Pentru evitarea erorilor și eforturilor ulterioare de curățire a datelor verifică prin var adunare atributele setului de date, lungimea acestuia și realizează operațiunile INSERT numai dacă îndeplinește condiția logică (TRUE) spli.length=19.
d. Anaconda este o platformă de dezvoltare a aplicațiilor python, dând posibilitatea creării spațiilor virtuale, instalării și izolării diferitelor versiuni de librărie[33].
e. Jupyter Notebook este un mediu de dezvoltare ce permite crearea fișierelor, aplicațiilor manipularea, curățirea, vizualizarea și modelarea statistică a datelor. Jupyter notebook are o structură tabulară ce permite lansarea selectivă a codurilor cu posibilitatea vizualizării inline a rezultatelor [15,34].
f. Tensor flow – este o librărie python utilizată în domeniul machine learning ce este caracterizată prin capacitatea calculelor complexe numerice[13].
g. Librării python
librăria panda[15,20]:
citirea, crearea, manipularea setului de date în format dataframe df, pd.read_csv();
calcularea și afișarea informațiilor statistice, spre ex. df.describe();
crearea efectelor de mască, manipularea cu ajutorul funcțiilor boolene;
realizarea filtrelor ce vizează valorile, spre ex. df[df['Salary']>60000];
citirea și manipularea matricilor, citirea datelor histogram prin pd.cut;
vizualizarea boxplot a datelor, df.boxplot().
librăria numpy[15,20]
crearea șirurilor, efectuarea calculelor matematice între șiruri, indexarea, accesarea/ crearea subseturilor șir;
manipularea, transpunerea șirurilor, spre ex. np.transpose();
redimensionarea, concatenarea, impărțirea șirurilor, spre ex. np.concatenate();
vizualizarea datelor în histogram, spre ex. np.histogram.
librăria scikit – learn[13,15,20]
furnizează foarte mulți algoritmi specifici machine learning numiți estimatori, ce pot fi utilizați prin funcția fit(), spre ex. RandomForestClassifier, PCA;
modele destinate evaluării modelelor, spre ex. cross_validate;
modele pentru adjustarea parametrilor/hiperparametrilor, spre ex. RandomizedSearchCV;
transformarea datelor, scalarea datelor, spre ex. scaler_model=MinMaxScaler(), scaler_model.transform(df);
partiționarea datelor în set de antrenare și set de testare, train_test_split(x, y).
librăria seaborn[35]
vizualizarea statistică a datelor.
librăria matplotlib[20]
vizualizarea grafică a datelor, plt.plot(x,y);
vizualizarea histogram a datelor, plt.hist().
h. Keras
Keras este o aplicație API de înalt nivel strucurată în limbajul python ce poate folosi tensor flow sau Theano ca putere de calcul în backend [10].
Keras reduce numărul comenzilor de scripting, se bazează pe modularitate, scalabiliate.
Cel mai des folosit model în Keras este modelul Sequential, un model bazat pe stiva de straturi neuronale[36].
Pentru crearea rețelei neuronale se apelează metoda Dense, se compilează modelul utilizând metoda model.compile și se antrenează cu model fit:
model = Sequential()
# adăugare strat cu n neuroni, dimensiunea vectorului de intrare m cu funcția de activare relu
model.add(Dense(n, input_shape=(m,), activation="relu"))
# adăugare n nuroni pe ultimul strat
model.add(Dense(n))
# compilare model folosind un optimizator adam și o funcție loss mse
model.compile(optimizer='adam', loss='mse')
# antrenarea rețelei neuronale pentru un număr de epoci 30, set antrenare X ,Y
model.fit ( X, Y, epochs = 30 )
# evaluarea performaței modelului
model.evaluate(X, Y)
i. Modulul python H2O
Realizează conexiunea cu serverul virtual java, obiectele și algoritmii specifici machine learning. Întrebuințează mai multe metode pentru construirea modelelor cu ajutorul așa numiților estimatori [37, 38].
j. Editarea fișierelor
Fișierele javascript și CSV au fost editate cu ajutorul Macromedia Dreamweaver 8 și NoteTabLight.
Fișierele arduino au fost editate și compilate cu ajutorul dezvoltatorului arduino IDE furnizat de www.arduino.cc.
k. Cablajul
A fost realizat manual cu ajutorul mijloacelor/uneltelor proprii respectând recomandările producătorilor și utilizând tehnologiile specifice aflate în vigoare.
Cap. 9. Realizarea cablajului imprimat, schema electrică
9.1. Fazele tehnologice utilizate pentru realizarea circuitului imprimat
Pentru realizarea circuitului imprimat am avut în vedere următorii pași:
executarea desenului cablajului imprimat: pentru implementarea schemei și realizarea traseelor de circuit am folosit hârtie milimetrică la scara 1:1;
degresarea feței cuprate: s-a realizat cu alcool izopropilic;
transpunerea desenului pe cablajul imprimat: s-a realizat cu ajutorul unui indigo avand fața activa spre folia de cupru;
punctarea centrelor găurilor de plantare: s-a realizat cu un ac de trasat;
traseele viitoarelor conductoare imprimate: s-a realizat cu ajutorul unei carioci permanente;
corodarea suprafeței placate cu cupru: s-a realizat prin îmbăiere și agitarea acestuia în soluție de clorură ferică lichidă până la reacția chimică completă;
inlăturarea traseelor protectoare (cariocă permanentă culoare neagră) s-a realizat cu ajutorul alcoolului izopropilic;
acoperirea și protecția părții placate cu cupru: s-a realizat cu soluție de colofoniu dizolvat in alcool izopropilic;
executarea găurilor pentru terminale: s-a realizat cu burghiu de 1 mm ;
plantarea pieselor: s-a realizat prin îmbinare la cald a terminalelor elementelor pasive și active de circuit cu cea a plăcii de cupru cu ajutorul cositorului și pistolului de lipit.
Materiale utilizate:
cablaj imprimat simplu, material Cu, unistrat, grosime 35µm, suport izolant rigid;
cablu multifilar cupru;
mașină electrică, 220V;
burghiu diametru 1 mm;
soluție de clorură ferică lichidă, FeCl2, concentrație 40% ;
pastă decapantă, cositor, pistol de lipit;
alcool izopropilic;
cariocă permanentă culoare neagră.
9.2. Schema electrică, imagini ale montajului imprimat
a. Schema electrică
R- Rezistoare (pull up) necesare comunicării seriale cu placa de dezvoltare arduino, valoare: 5 kΩ.
b. Imaginea de ansamblu ale cablajului imprimat:
Fig.9.1. Imaginea posterioară a cablajul imprimat.
Fig.9.2. Dispunerea componentelor pe cablajul imprimat.
Fig.9.3. Izolarea IMU pentru replicarea mediului temperatură-umiditate.
Cap.10. Achiziția datelor
Fig.10.1. Mediul replicat de preluare a datelor.
Achiziția datelor s-a realizat cu ajutorul placii de dezvoltare arduino uno utilizând schema electrică prezentată în capitolul 9, subcapitolul 9.2. Datele de ieșire ale acelerometrelor – giroscop MPU 6050 au fost preluate prin magistrală I2C, iar cea a celorlați senzori prin pinii PWM.
Am calibrat accelerometrele cu ajutorul librăriei i2cdevlib puse la dispoziție de Jeff Rowberg (https://github.com/jrowberg/). Scriptul citește valorile într-un anumit număr de iterații loop și realizează o medie a factorului de zgomot pentru fiecare parametru în parte.
Astfel, am imobilizat și poziționat accelerometrele în poziția de referință unghiulară „0”, am realizat 1500 iterații, am preluat ieșirile și am calculat valoarea medie a abaterilor. De asemenea, scriptul dă posibilitatea stabilirii anumitor limite prag acceptate ca eroare pentru fiecare set de valori – setul cuaternar și setul accelerațiilor (int acel_deadzone=6, int giro_deadzone=1).
Rezultatele reieșite pentru corecția zgomotolului în terminalul arduino sunt următoarele:
a) MPU6050, adresa 0X69
b) MPU6050, adresa 0X68
Am compilat fișierele sketch puse la dispoziție de adafruit într-un singur script arduino, particularizând variabilele pentru fiecare senzor în parte.
Pentru sincronizarea datelor de ieșire am redus timpul de răspuns al senzorului de vibrații prin constanta PULSEIN_TIMEOUT = 70000UL, am redus viteza de scriere a memoriei FIFO – MPU6050_DMP_FIFO_RATE_DIVISOR la valoarea 0x04 (200Hz / (1 + 4) = 40Hz./ librăria MPU6050_6Axis_MotionApps20.h).
Am introdus valorile de offset DMP în funcția declarativă void setup().
Funcția void loop() citește valorile celor trei senzori prin următoarele instrucțiuni/comenzi:
citirea semnalului puls al senzorului vibrații la tranziția HIGH:
long value = pulseIn(pinPulse, HIGH, PULSEIN_TIMEOUT)
citirea ieșirilor giroscoapelor prin lansarea instrucțiunilor ISR (îndeplinirea condiției de lungime FIFO):
// captarea setului cuaternar
mpuH.dmpGetQuaternion(&h, fifoBufferH);
mpuL.dmpGetQuaternion(&l, fifoBufferL).
// captarea setului accelerațiilor
mpu.dmpGetQuaternion(&h, fifoBufferH);
mpu.dmpGetAccel(&aa, fifoBufferH);
mpu.dmpGetGravity(&gravity, &h);
mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &h)
citirea ieșirilor senzorilor umiditate:
int chk1 = DHT111.read(DHT111PIN);
int chk2 = DHT112.read(DHT112PIN)
Secvența fluxului de ieșire a datelor compilate în terminalul arduino este următoarea:
Fișierul javascript citește printr-o funcție callback port.on('data', receiveSerial) datele seriale, verifică veridicitatea/componența numerică și le introduce în baza de date mysql:
function receiveSerial(dataBuf) {
let str = dataBuf.toString();
for (let i = 0; i < str.length; i++) {
if (parser.parse(str[i])) {
var value = parser.message.trim();
var spli=value.split(" ");
adunare=spli[0]*1+spli[1]*1+spli[2]*1+spli[3]*1+spli[4]*1+spli[5]*1+spli[6]*1+spli[7]*1+spli[8]*1+spli[9]*1+spli[10]*1+spli[11]*1+spli[12]*1+spli[13]*1+spli[14]*1+spli[15]*1+spli[16]*1+spli[17]*1+spli[18]*1;
if (isNaN(adunare)){ console.log("do nothing");//} else if (spli.length=19) {
insertValueIntoDatabase([spli[0],spli[1],spli[2],spli[3],spli[4],spli[5],spli[6],spli[7],spli[8],spli[9],spli[10],spli[11],spli[12],spli[13],spli[14],spli[15],spli[16],spli[17],spli[18],Caz_WW,Caz_XX,Caz_YY,Caz_ZZ,Caz_ACC_XX,Caz_ACC_YY,Caz_ACC_ZZ]);}}
Cap.11. Detecția anomaliilor senzorului MPU6050
11.1. Inspectarea și vizualizarea setului de date
Întrucât nu se cunoaște procentul erorilor în setul de date și nu avem clasificarea etichetă a acestoră, am efectuat un calcul estimativ de raportare în procent % prin multiple mijloace de reprezentare grafică și calcul în mediul virtual anaconda, jupyter notebook.
Am importat librăriile necesare pentru reprezentarea grafică, manipularea datelor:
Am citit și instatanțiat setul de date în format panda DataFrame:
Am previzualizat caracteristicile datelor (stdv,mean), distribuția datelor pe quartile prin funcția statistică describe():
Tab.11.1. Descrierea setului de date pentru antrenarea modelului autoencoder.
Observăm o anumită corelație pe rânduri a parametrilor cuaternari: MPU69W, MPU69X, MPU69Y, MPU69Z deoarece se află în aceeași plajă de lucru, precum și a accelerațiilor MPU69ACC_X, MPU69ACCY, MPU69ACCZ care de asemenea vizează o plajă comună de lungime a valorilor dar total diferită față de cea a setului quaternar. Setul de date nu prezintă erori NaN, are o dispersie diferită a datelor particularizată pe fiecare coloană atât în spectrul valorilor pozitive cât și a celor negative (spre ex: parametrul MPU69W concentrează valori între -0,41÷0,41 deși min și max sunt -1.98 și 1.99; parametrul MPU69ACC_X, concentrează valori între -1888÷1934 deși min este -32726, respectiv valorile max este 32066). Pentru o analizare mai amănunțită și situarea într-o plajă comună de dispersare am realizat o transformare a valorilor cu ajutorul sklearn.preprocessing, funcția MaxAbsScaler după cum urmează:
Am vizualizat dispersia datelor transformate folosind grafica boxplot():
Fig.11.1. Reprezentarea datelor transformate prin grafica Boxplot.
În fig.11.1 se observă foarte bine statutul valorior din setul cuaternar ce diferă semnificativ (outliers) față de cele prevalente (inliers) situate în spațiul quartilelor de 25% și 75%, valori aflate în afara laturile superioare (maxim) și inferioare (mimim) cu limitele celor 2 segmente de dreaptă.
Valorile cu reprezentare izolată pot fi considerate valori ce au influențat autonomia de viață a respectivului senzor, valori ce pot trece foarte ușor de la categorizarea outliers la cea a valorilor anormale-anomalii.
Spre deosebire de setul quaternar, valorile accelerațiilor pe cele trei axe prezintă o dispersie diferită a datelor având lungimi diferite ale quartilelor și cu o lungime evidentă de verticală a valorilor outliers. Având în vedere aceste aspecte, aprecierea în procente și separarea valorilor normale de cele anormale devine destul de grea și necesită vizualizări suplimentare, aprecieri cu interpretare și descriminare subiectiv personală.
Aceleași date reprezentate prin funcția hist()
Fig.11.2. Reprezentarea datelor transformate prin grafica histogram.
Figura 11.3. reprezintă datele particularizate în diferite culori cu lungimea coloanelor/barelor strict dependente de frecvența de apariție a valorilor într-o lățime bine definită. Prin aceasta se pot observa parametrii cu valori mai mici de frecvență, valori ce pot face obiectul interpretării de la statutul de outlier la cea a posibilelor anomalii.
11.2. Calcularea și aprecierea manuală în procente a anomaliilor
Estimarea anomaliilor prin histogram poate fi redusă la identificarea parametrilor situați în diferite coșuri (bins) cu frecvențe mai mici de apariție a datelor (bare cu lungimi mai mici), identificarea acestora prin poziționare index și atribuirea clasificării acestora ca anomalii.
Vizualizarea boxplot poate constitui de asemenea o unealtă de identificare a anomaliilor prin stabilirea unor limite de dispersare a datelor, identificarea indexului acestora și atribuirea clasificării în domeniul apartenenței unui grup sau altul, alternativă pe care am utilizat-o pentru estimarea anomaliilor în setul de date quaternar.
Estimarea anomaliilor în setul quaternar de date W, X, Y și Z:
Am apreciat pragurile de referință funcție de valorile maxime și minime atinse de segmentele de dreaptă din setul quaternar (fig.11.1) după cum urmează:
prag valori pozitive = max (0.812, 0.814, 0.875, 0.781) == > prag valori pozitive = 0.875
prag valori negative = – prag valori pozitive = – 0.875
Estimarea anomaliilor în grupul accelerațiilor ACC_X, ACCY și ACCZ:
Am stabilit pragurile de referință prin vizualizarea histogram funcție de tendința izolării valorilor (tendința de izolare crescută ==> probabilitate crescută de etichetare în sfera anomaliilor) (Fig11.2.) după cum urmează:
prag valori pozitive = 0.75
prag valori negative = – prag valori pozitive = – 0.75
11.2.1. Calculul anomaliilor în setul cuaternar
Concatenarea valorilor în sfera valorilor pozitive și sfera valorilor negative:
11.2.2. Calculul anomaliilor în setul accelerațiilor:
Concatenarea valorilor în sfera valorilor pozitive respectiv sfera valorilor negative:
11.2.3. Estimarea anomaliilor în procente
Pentru excluderea luării în calcul a duplicatelor aflate pe același index am realizat concatenarea și eliminarea valorilor identice din sfera pozitivă, respectiv cea negativă astfel:
anomalii set quaternar (axă pozitivă) + anomalii set accelerații (axă pozitivă)
anomalii set quaternar (axă negativă) + anomalii set accelerații (axă negativă)
excluderea valorilor de index duplicate pe cele două axe
Am calculat procentul anomaliilor:
Anomalii: 3034; (1)
Procent anomalii: 1.3131356849166846 %. (2)
11.3. Detecția anomaliilor cu ajutorul AUTOENCODER
Am utilizat librăriile:
11.3.1.Impărțirea setului de date
Am configurat cu ajutorul librăriei panda setul considerat bun, fără anomalii, pentru antrenarea modelului autoencoder, de asemenea setul de date destinat pentru interpretare, identificare a valorilor de eroare.
Setul pentru testare (contaminat cu erori/anomalii):
Structura setului de date pentru testare: (231050, 7);
Setul destinat pentru antrenarea modelului autoencoder:
Structura setului de date pentru antrenare: (19019, 7);
Tab.11.2. Descrierea setului de antrenare.
11.3.2. Preprocesarea datelor
Variația setului de antrenare:
date.var()
MPU69W 2.635312e-01
MPU69X 2.372092e-01
MPU69Y 2.352433e-01
MPU69Z 2.604842e-01
MPU69ACC_X 5.574420e+07
MPU69ACCY 5.478207e+07
MPU69ACCZ 7.179896e+07
dtype: float64
Setul de antrenat prezintă o variație apropiată a setului cuaternar, setul accelerațiilor prezintă o diferență mică a plajei valorilor.
Modelele construite pentru predicție/ clasificare presupun ca datele de intrare a fi preprocesate, normalizate într-o plajă apropiată de concentrare a valorilor. Aceasta presupune aducerea lor într-un interval definit ce favorizează și influențează în mod progresiv pozitiv procesul de adjustare al parametrilor în procesl de învățare al rețelei neuronale.
Descrierea setului în grafica boxplot și histogram a datelor destinate pentru antrenare fără normalizarea/ standardizare este următoarea:
Fig.11.3. Descriere în grafica boxplot a setului de antrenare.
Fig.11.4. Descrierea în grafica histogram a setului de antrenare.
a. Standardizarea datelor
Pentru scalarea datelor într-un singur interval de referință am utilizat funcția MaxAbsScaler al librăriei sklearn ce realizează o transformare a parametrilor astfel încât valori maxime atinse vor fi cel mult 1.
Fig.11.5. Descrierea boxplot a datelor transformate.
Fig.11.6. Descrierea în grafica histogram a datelor transformate.
Variația parametrilor din setul de date după transformare:
transformed.var()
MPU69W 0.070021
MPU69X 0.237209
MPU69Y 0.187535
MPU69Z 0.081297
MPU69ACC_X 0.076269
MPU69ACCY 0.058486
MPU69ACCZ 0.068527
dtype: float64
11.3.3. Crearea modelului autoencoder în KERAS
Am împărțit datele transformate în două seturi cu ajutorul funcției train_test_split: am considerat un necesar de 40% pentru antrenare iar diferența de 60% pentru testarea modelului.
Am predefinit dimensiunea vectorului de intrare în rețeaua neuronală – o matrice cu 7 coloane și funcția de activare relu a neuronului artificial:
Am construit o rețea neuronală ce realizează codarea vectorilor de intrare cu 90 neuroni, un strat de 30 neuroni ce realizează compresia, reducerea dimensionalității vectorului de intrare, un strat de 90 neuroni ce realizează decodarea. Am folosit funcția de activare relu corespunzătoare abordării cazurilor de neliniaritate.
În scopul antrenării rețelei și interpretării grafice a acestui proces am configurat modelul utilizând funcția cost mse, optimizatorul adam și evaluatorul de performanță accuracy.
Pentru inițierea procesului de antrenare am folosit funcția fit ce dă posibilitatea antrenării rețelei pentru un anumit număr de epoci și particularizează numărul de elemente utilizate pentru o iterație: batch_size.
Secvență a procesului de antrenare:
Train on 19019 samples, validate on 11412 samples
Epoch 1/20
19019/19019 [==============================] – 7s 374us/step – loss: 0.0058 – accuracy: 0.9053 – val_loss: 3.2097e-04 – val_accuracy: 0.9613
Epoch 2/20
19019/19019 [==============================] – 6s 339us/step – loss: 2.1853e-04 – accuracy: 0.9696 – val_loss: 1.5034e-04 – val_accuracy: 0.9725
Epoch 3/20
19019/19019 [==============================] – 6s 335us/step – loss: 7.7035e-05 – accuracy: 0.9798 – val_loss: 4.2669e-05 – val_accuracy: 0.9856
Epoch 4/20
19019/19019 [==============================] – 6s 329us/step – loss: 2.7200e-05 – accuracy: 0.9884 – val_loss: 4.5
Am implementat un proces progresiv și repetitiv de optimizare, vizualizare până la atingerea valorilor țintă ale acurateței modelului, o valoare mică a variației și bias-ului, minimizarea pierderilor și creșterea acurateței modelului.
Am salvat parametrii weights după fiecare ciclu al procesului de optimizare și i-am încărcat la inceputul următorului proces de antrenare:
Am început antrenarea cu un anumit număr de epocă, am accesat parametrii metrics după fiecare cilclu am continuat antrenarea prin creșterea epocilor până la atingerea valorile optime ale parametrilor de referință train/test loss respectiv train/ test accuracy:
În figurile de mai jos se observă grafic rezultatele finale ale antrenării atât în sfera pierderilor cât și cea a acurateței modelului.
La creșterea numărului de epocă pierderile se reduc substanțial și ating o valoare aproape de zero iar cele ale preciziei au o creștere semnificativă de la valoarea zero pînă aproape de 99%.
Secvență a procesului de antrenare:
Epoch 20/20
19019/19019 [==============================] – 6s 328us/step – loss: 1.4280e-05 – accuracy: 0.9908 – val_loss: 7.4687e-06 – val_accuracy: 0.9944
Fig.11.7. Graficul pierderilor la optimizarea modelului autoencoder.
Fig.11.8. Graficul performanței de predicție la optimizarea modelului autoencoder.
Descrierea și structura modelului creat:
Model: "sequential_20"
_________________________________________________________________
Layer (type) Output Shape Param #
==============================================================
dense_83 (Dense) (None, 90) 720
_________________________________________________________________
dense_84 (Dense) (None, 30) 2730
_________________________________________________________________
dense_85 (Dense) (None, 90) 2790
_________________________________________________________________
dense_86 (Dense) (None, 7) 637
==============================================================
Total params: 6,877
Trainable params: 6,877
Non-trainable params: 0
_________________________________________________________________
accuracy: 98.96%
11.3.4. Vizualizarea valorilor reale și a celor de predicție a modelului creat
Am instanțiat valorile de predicție:
Am creat în structura panda două coloane, prima coloană corespunzătoare valorilor de predicție iar a doua corespunzătoare a valorilor reale. Am realizat aceeași structură tabelară pentru fiecare parametru din setul de date și am vizualizat gradul de acoperire/ coincidență a valorilor de predicție și a celor reale cu autorul librăriei matplotlib.
Fig.11.9. Raportul valorilor de predicție/valori reale – parametrul W.
Pentru parametrul X din setul cuaternar:
Fig.11.10. Raport valori predicție/valori reale – parametrului X.
Pentru parametrul Y din setul cuaternar:
Fig.11.11 Raport valori predicție/valori reale – parametrul Y.
Pentru parametrul Z din setul cuaternar:
Fig.11.12. Raport valori predicție/valori reale – parametrul Z
Pentru parametrii X, Y, Z din setul accelerațiilor:
Fig.11.13. Raport valori predicție/valori reale – parametrul Acc_X.
Fig.11.14. Raport valori predicție/valori reale – parametrul Acc_Y.
Fig.11.15. Raport valori predicție/valori reale – parametrul Acc_Z.
11.3.5. Stabilirea pragurilor în setul de antrenare pentru etichetarea erorilor
Această etapă este foarte semnificativă/ importantă pentru că în funcție de aceasta se vor eticheta valorile cu abatere sau cele care nu corespund limitelor/ criterilor stabilite pentru încadrarea lor ca fiind în plaja valorilor acceptate ca fiind normale. Pragurile trebuie să îndeplinească criteriile de exceptare/ depășire a valorilor de zgomot și să realizeze o separare evidentă a valorilor normale de cele anormale.
În această fază am calculat valorile maxime de eroare MAE acceptate, corespunzătoare modelului creat și am identificat limitele/pragurile pentru întrebuințarea modelului autoencoder ca rutină pentru identificarea anomaliilor.
Pentru vizualizare am folosit librăria seaborn distplot ce îmbină reprezentarea histogram cu densitatea kernel.
a.Stabilirea pragului de separare raportat la întreaga matrice
Am importat și instanțiat modelul autoencoder și scaler-ul creat:
Cu ajutorul scaleru-lui am transformat valorile de intrare, am realizat predicția lor și am transpus în structura panda dataFrame valorile manipulate:
Am calculat abaterile/erorile în sfera valorilor pozitive față de axa mean:
Vizualizarea repartiției abaterilor cu ajutorul librăriei seaborn:
Fig.11.16. Repartiția abaterilor în grafica seaborn – întreaga matrice.
Fig.11.17. Scalarea abaterilor în grafica seaborn – întreaga matrice.
Valoare prag aleasă: 0.0158; (3)
Verificarea pragului se realizează prin însumarea valorilor ce depășesc pragul ales, aceasta nu trebuie să depășească valoarea “0”.
b. Stabilirea pragurilor de separare raportate la fiecare parametru
Repartiția abaterilor pentru parametrul din setul cuaternar W:
Fig.11.18. Vizualizarea abaterilor în grafica seaborn pentru parametrul W.
Valoare prag aleasă: 0.0256; (4)
Verificarea pragului ales:
Repartiția abaterilor pentru parametrul din setul cuaternar X:
Fig.11.19. Vizualizare abateri în grafica seaborn pentru parametrul X.
Valoare prag aleasă: 0.019; (5)
Verificarea pragului ales:
Repartiția abaterilor pentru parametrul din setul cuaternar Y:
Fig.11.20. Vizualizarea abaterilor în grafica seaborn pentru parametrul Y.
Valoare prag aleasă: = 0.025; (6)
Verificarea pragului ales:
Repartiția abaterilor pentru parametrul din setul cuaternar Z:
Fig.11.21. Vizualizarea abaterilor în grafica seaborn pentru parametrul Z.
Valoare prag aleasă: = 0.042; (7)
Verificarea pragului ales:
Repartiția abaterilor pentru parametrii din setul accelerațiilor:
Fig.11.22. Vizualizarea abaterilor în grafica seaborn – parametrul Acc_X.
Valoare prag aleasă = 0.0191; (8)
Verificarea pragului ales:
Repartiția abaterilor pentru parametrul din setul accelerațiilor AccY:
Fig.11.23. Vizualizare abaterilor în grafica seaborn – parametrul Acc_Y
Valoare prag aleasă: = 0.0209; (9)
Verificarea pragului ales:
Repartiția abaterilor pentru parametrul din setul accelerațiilor AccZ:
Fig.11.24. Vizualizarea abaterilor în grafica seaborn – parametrul Acc_Y
Valoare prag aleasă = 0.0158; (10)
Verificarea pragului ales:
11.3.6. Identificarea anomaliilor
Am instanțiat, scalat și structurat în frame-ul de date panda setul destinat supus analizei modelului autoencoder creat:
Am realizat predicția datelor cu ajutorul modelului creat:
Tab.11.3. Secvență a datelor de predicție – model autoencoder.
a. Identificare anomaliilor raportate la întreaga matrice
Pentru identificarea/ etichetarea anomaliilor în setul analizat am calculat erorile de predicție prin efectuarea diferenței valorilor de ieșire cu cele corespunzătoare de intrare, abaterea lor de la axa mean utlizând funcția MAE, încadarea lor în pragurile/ limitele stabilite în expresia nr. 3.
Am creat un tabel în format DataFrame:
Am calculat valorile de eroare a modelului folosind coeficientul MAE, am creat o mască a valorilor care îndeplinesc condiția de prag și am etichetat valorile ca fiind anomalii cu ,,1” iar cele normale cu ,,0’’:
Numărul total al valorilor etichetate ca anomalii:
Anomalii: 197; (11)
Fig.11.25. Separarea anomaliilor funcție de valoarea prag.
b. Identificare anomaliilor raportate la fiecare parametru
Am urmat aceeași pași ai punctului anterior dar individualizat și particularizat pentru fiecare parametru și prag asociat.
1. Identificarea anomaliilor în setul cuaternar:
Parametrul W:
Anomalii parametrul W: 149; (12)
Parametrul X:
Anomalii parametrul X: 186; (13)
Parametrul Y:
Anomalii parametrul Y: 92; (14)
Parametrul Z:
Anomalii parametrul Z: 85; (15)
2. Identificarea anomaliilor în setul accelerațiilor:
Parametrul ACC_X:
Anomalii parametrul ACC_X: 123; (16)
Parametrul ACC_Y:
Anomalii parametrul ACC_Y: 116; (17)
Parametrul ACC_Z:
Anomalii parametrul ACC_Z: 162; (18)
c. Crearea setului de date final și asocierea etichetelor
Am creat două librării, una asociată valorilor setului de antrenare iar cealaltă asociată setului valorilor de testare, am transformat în obiecte cele două librării și am realizat concatenarea lor cu valorile corespunzătoare de asociere, rezultând setul de asociere a valorilor de antrenare și setul de asociere a valorilor de testare.
Pentru abordarea și etichetarea valorilor de antrenare am parcurs aceeași pași prevăzuți la punctul anterior, valorile setului de antrenare identificându-se prin dublarea cifrelor folosite la inițierea variabilelor, obiectelor setului de testare.
În consecință, am creat librăria setului de antrenare cu valori rezultate din asocierea anomaliilor pentru fiecare parametru/ coloană, am creat o structură DataFrame, am asociat indexul corepunzător pentru operațiunea de concatenare:
Am realizat concatenarea pe axa 1 a valorilor de antrenare cu cea a valorilor de etichetare a anomaliilor:
Tab.11.4. Etichetarea setului de antrenare.
Am urmat aceeași pași pentru setul de testare și am realizat concatenarea coloanelor:
Tab.11.5. Etichetarea setului de testare.
Forma finală a setului de date a rezultat din concatenarea celor două seturi intermediare – date_train și date_dist:
Tab.11.6. Forma finală a setului de date rezultat.
d. Estimarea în procente și vizualizarea separării anomaliilor
Am calculat valoarea totală a anomaliilor prin însumarea matematică a valorile expresiilor 12 + 13 + 14 + 15 + 16 + 17 + 18 și anume o valoare totală de 913 anomalii, calcul ce poate fi realizat și cu ajutorul unor condiții booleene aplicate setului final de date exportat:
Pentru excluderea cazurilor de duplicare pe axa rândurilor (0) am redus numărul anomaliilor la o singură coloană anomaly, am apreciat un grad de severitate al anomaliilor (de la 1÷7) funcție de numărul aparițiilor pe axa ,,0 ” folosind următoarele condiții:
Reducerea etichetei la o singură coloană:
Tab.11.7. Reducerea la o singură etichetă a anomaliilor.
Asocierea unui grad de severitate a anomaliilor:
Tab.11.8. Aprecierea gradului de severitate a anomaliilor.
După reducerea duplicatelor pe axa rândurilor („0”) numărul anomalilor s-a redus la 249, ceea ce reprezintă un procent de 0.1 % (19) raportat la întreg setul de date.
Fig.11.26. Detecție anomalie pe caracteristica accelerațiilor axa Z.
Fig.11.27. Predicție anomalii vizualizare scatterplot.
Vizualizarea gradului de predicție al anomaliilor cu ajutorul PCA, 2D:
Fig.11.28. Predicție anomalii, vizualizare 2D cu ajutorul PCA.
11.4. Detecția anomaliilor cu ajutorul ISOLATION FOREST
Am importat librăriile:
Am instanțiat/inițiat serverul h2o:
Am instanțiat și importat fișierul de analizat în serverul H2O:
Parse progress: |█████████████████████████████████████████████████████████| 100%
11.4.1. Crearea modelului ISOLATION FOREST
Am construit modelul h2o atribuind un număr de 200 arbori, am antrenat modelul cu fișierul subiect pentru analiză – CSV:
isolationforest Model Build progress: |███████████████████████████████████| 100%
11.4.2. Vizualizarea valorilor de predicție, stabilirea pragului de etichetare
Am folosit funcția predict pentru vizualizarea scoring-ului și lungimii medie a arborelui necesari pentru asocierea anomaliilor:
isolationforest prediction progress: |████████████████████████████████████| 100%
Tab.11.9. Valori predicție model h2o.
Coloana „predict” reprezintă scoringul în gama 0÷1 și rezumă în probabilitatea valorii respective să fie asociată anomaliilor iar „mean_length” este lungimea medie a arborelui pentru izolarea respectivei observații.
Coloana „predict” și „mean_length” se află într-o strânsă inversă corelație:
Tab.11.10. Corelația valorilor de ieșire a modelului h2o.
Pentru etichetarea valorilor setului de date în sfera anomaliilor am recurs la o vizualizare a frecvenței de apariție a valorilor „mean_length” cu autorul graficii histogram:
Fig.11.29. Frecvența „mean_length” a predicției h2o.
Modelele structurate cu isolation forest presupun cunoașterea anterioară în procente a gradului de contaminare a setului de date, valoare pe care am apreciat-o la nivelul de referință a expresiei nr. (2) adică o valoare: 1,31 %. (20)
Astfel, am ales o valoare de prag pentru etichetarea valorilor, o valoare ce îndeplinește cu aproximație condiția mai sus menționată, o lungime corespunzătoare a arborelui de pănă la 6.175 ce generează un grad de contaminare de 1.33 %.
11.4.3. Crearea setului de date final și asocierea etichetelor
Am creat un tabel în format panda df la care am anexat coloanele de predicție a modelului realizat pred2 efectuând etichetarea lor funcție de condiția de prag:
Tab.11.11. Valoarea anomaliilor.
Am alipit de asemenea pragul de referință și lungimea corespunzătoare a arborilor:
Tab11.12. Forma finală a setului de date – model h2o.
11.4.4. Vizualizarea separării anomaliilor
Fig.11.29. Separarea anomaliilor funcție de valoarea „mean_length”.
Fig.11.30. Distribuția anomaliilor în valorile parametrului ACCY.
Fig.11.31. Detecția anomaliilor în valorile parametrului ACCZ.
Vizualizarea predicției anomaliilor în graficul 2D, realizat prin reducerea la două componente principale a setului multivariat utililizând PCA:
Fig.11.32. Predicția anomaliilor în grafica 2D utilizând PCA.
Fig.11.33. Predicția anomaliilor în grafica 3D utilizând PCA.
Cap. 12. Detecția anomaliilor senzorului de vibrații VS40
Senzorul de vibrații generează un singur parametru de ieșire,valoare strict dependentă de durata semnalului puls la îndeplinirea condiției de dezechilibru intern (mișcare/vibrații) monitorizată prin schema de principiu internă.
Interpretarea ieșirilor acestui tip de senzor este redusă la analiza univariată a datelor iar identificarea anomaliilor poate fi realizată printr-o simplă izolare de clustering sau un simplu calcul statistic de deviere de la o axă definită precum este coeficientul statistic Z ce măsoară numărul de deviații standard față de o axă de referință mean.
12.1. Inspectarea și vizualizarea setului de date
Am utilizat librăriile:
Am citit fișierul în format csv:
Descrierea parametrului vibrații:
count 231050.000000
mean 832.629855
std 3449.131462
min 0.000000
25% 0.000000
50% 0.000000
75% 189.000000
max 66678.000000
Name: VIBRATII, dtype: float64
Am instanțiat într-un fișier panda DataFrame datele de ieșire a senzorului vibrații:
Fig.12.1. Vizualizarea în grafica histogram a datelor vibrații.
Fig.12.2. Vizualizarea boxplot a datelor vibrații.
Se observă în grafica histogram o concentrare a valorilor în intervalul 0÷7000 iar boxplot-ul semnalizează prezența unui procent foarte mare de valori outliers. Pentru o vizualizare mai concludentă am recurs la o grafică scatterplot:
Fig.12.3. Vizualizarea în grafica scatterplot a datelor vibrații.
12.2. Preprocesarea datelor
În scopul favorizării, ușurării procesului de vizualizare a datelor și pentru a estima un algoritm optim de detecție și etichetare a anomaliilor am realizat o transformare a datelor cu ajutorul StandardScaler:
Vizualizarea datelor după transformare este următoarea:
Fig.13.4. Vizualizarea scatterplot după transformarea datelor.
12.3. Estimarea în procente a anomaliilor raportate la setul de date
Așa cum reiese din fig.13.4. distribuția datelor este liniară iar impărțirea datelor în valori normale și anomalii poate fi redusă doar la folosirea unei funcții statistice. Motiv pentru care am evidențiat modalitatea utilizată de despărțire a datelor – dreapta liniară de culoare roșie. În ceea ce privește procentul anomaliilor raportat la setul de date, valoarea asumată și aproximată este o cifră de până la 1%, o valoare aleasă în baza mai multor vizualizări repetitive, mijloace empirice de despărțire a datelor.
12.4. Identificare anomaliilor
Am definit coeficientul statistic Z, am stabilit un prag de separare a valorilor:
Am utilizat funcția definită mai sus cu folosirea datelor transformate ca argument de intrare:
Valoarea în procent a anomaliilor:
1.04751164411193
Am creat o listă de index a valorilor asociate ca anomalii, valori care depășesc pragul definit pentru separare:
[517, 671, 698, 701, 722, 756, 758, 949, 1193, 1282, 1287, 1350, 1390, 1397, 1470, 1483, 1508, 1571, 1572, 1631, 1636, 1662, 1668, 1672, 1696, 1708, 1713, 1770, 1807, 1913, 1918, 1938, 2041, 2048, 2061, 2134, 2253, 2254, 2256, 2270, 2294, 2331, 2335, 2339, 2343, 2349, 2356, 2357, 2359, 2431, 2532, 2549, 2551, 2716, 2717, 2762, 2782, 2824, 2841, 2898, 3067, 3139, 3269, 3276….]
12.5. Crearea setului de date final și asocierea etichetelor
Am creat o coloană și am inițiat o valoare „0” pentru semnalizarea anomaliilor:
Am asociat valoarea „1” pentru fiecare poziție index aflată în lista b cu ajutorul funcției for:
Tab.12.1. Forma finală a setului de date – senzor vibrații.
12.6. Vizualizarea separării anomaliilor
Fig.12.5. Separare anomalii – senzor vibrații.
Cap.13. Gravitatea erorilor
Pentru aprecierea gradului și nivelului de influență a evenimentelor care au diminuat și consumat autonomia de viață a senzorilor folosiți am construit algoritmi particularizați pentru interpretare și cuantificare, ținând cont de densitatea, frecvența și poziționarea lor pe scara gravității.
13.1. Senzorul MPU6050
Deși autoencoderul este un algoritm bun de luat în seamă pentru detecția anomaliilor, am decis totuși în acest capitol utilizarea pentru interpretare a setului de date final reieșit în urma etichetării anomaliilor cu ajutorul estimatorului isolation forest H2O.
13.1.1. Importarea și inspectarea datelor
Am utilizat librăriile:
Am importat și vizualizat setul de date:
Am creat un obiect DataFrame cu valorile etichetate anomalii:
Tab.13.1. Secvență a valorilor etichetate ca anomalii.
13.1.2. Asocierea ponderilor de eroare
Am particularizat și individualizat mărimea ponderilor de eroare funcție de valoarea lungimii arborelui mean_length. Astfel am creat un histogram cu 15 coșuri bins:
Fig. 13.1. Graficul gravității anomaliilor.
Intervalele bins revenite:
[3.75 3.91133333 4.07266667 4.234 4.39533333 4.55666667
4.718 4.87933333 5.04066667 5.202 5.36333333 5.52466667
5.686 5.84733333 6.00866667 6.17 ]
Lățimea coșurilor: 0.1613
Am calculat valoarea ponderilor asociată fiecărui coș în parte:
unde:
i reprezintă un număr de ordine asociat gravității anomaliei de la 1÷15;
ser reprezintă elementele aparținute lui n (15 poziții ce reflectă numarul elementelor aflate în fiecare coș);
a reprezintă procentul lui ser din totalitatea anomaliilor (n.sum);
b reprezintă ponderea rezultată din înmulțirea lui a cu gravitatea erorii i, valoare împărțită la numărul total de anomalii corespunzător respectivului coș ser;
c reduce numărul decimalelor la 3.
Valorile de instanță a variabilelor i, ser ,a, pentru calculul final al ponderilor c sunt prezentate în tabelul de mai jos:
Tab.13.2. Asocierea ponderilor – senzor MPU6050.
13.1.3. Crearea setului de date
Am creat o coloană ce reflectă gravitatea anomaliilor cu valori între 0÷15, și o coloană pentru asocierea/ inserarea ponderilor calculați anterior utilizând funcția pd.cut:
Am anexat și valoarea maximă însumată a ponderilor pe care respectivul senzor o poate suporta:
1729.0
Tab.13.3. Secvență a setului de date după adăugarea ponderilor.
13.2. Senzorul VS40
13.2.1. Importarea și inspectarea datelor
Am manipulat datele cu aceleași librării menționate în secțiunea anterioară, am importat și vizualizat setul de date:
Am creat un obiect DataFrame cu valorile etichetate anomalii:
Tab.13.4. Descrierea setului de date anomalii – senzor VS40.
13.2.2. Asocierea ponderilor de eroare
Am particularizat și individualizat mărimea ponderilor de eroare funcție de repartiția anomaliilor în structura histogram creeată. Astfel am creat un histogram cu 50 coșuri bins:
Fig.13.2. Graficul gravității anomaliilor – senzor vibrații VS40.
Intervalele bins revenite:
[16288. 17292.98 18297.96 19302.94 20307.92 21312.9 22317.88 23322.86
24327.84 25332.82 26337.8 27342.78 28347.76 29352.74 30357.72 31362.7
32367.68 33372.66 34377.64 35382.62 36387.6 37392.58 38397.56 39402.54
40407.52 41412.5 42417.48 43422.46 44427.44 45432.42 46437.4 47442.38
48447.36 49452.34 50457.32 51462.3 52467.28 53472.26 54477.24 55482.22
56487.2 57492.18 58497.16 59502.14 60507.12 61512.1 62517.08 63522.06
64527.04 65532.02 66537. ]
Lățimea coșurilor: 1004,98
Am calculat valoarea ponderilor asociată fiecărui coș în parte:
Am păstrat o logică asemănătoare de asociere a ponderilor, aceeași semnificație a variabilelor ca și în cazul senzorului MPU6050, inversând doar sensul gravității anomaliilor. Valorile de instanță a variabilelor i, ser ,a, pentru calculul final al ponderilor c sunt prezentate în tabelul de mai jos:
Tab.13.5. Asociere ponderilor – senzor VS40.
unde:
i reprezintă un număr de ordine asociat gravității anomaliei de la 1÷50;
ser reprezintă elementele aparținute lui n (50 poziții ce reflectă numarul elementelor aflate în fiecare coș);
a reprezintă procentul lui ser din totalitatea anomaliilor (n.sum);
b reprezintă ponderea rezultată din înmulțirea lui a cu gravitatea erorii i, valoare împărțită la numărul total de anomalii corespunzător respectivului coș ser;
c reduce numărul decimalelor la 3.
13.2.3. Crearea setului de date
Am creat o coloană ce asociază gravitatea anomaliilor cu valori între 0÷50, și o coloană pentru asocierea/ inserarea ponderilor calculați anterior utilizând funcția pd.cut:
Am anexat și valoarea maximă însumată a ponderilor pe care respectivul senzor o poate suporta:
Eroare însumată: 11663.235
Tab.13.6. Secvență a setului de date după adăugarea ponderilor – VS40.
Cap.14. Crearea modelelor pentru mentenanță predictivă
14.1. Senzorul MPU6050
14.1.1. Preprocesarea – transformarea datelor
Am utilizat librăriile:
Am importat fișierul, am instanțiat, definit datele de intrare și cele de ieșire pentru construirea modelului, am transformat datele de intrare (predictors) cu ajutorul StandardScaler:
Vizualizarea datelor de intrare transformate în grafica boxplot și histogram:
Fig.14.1. Vizualizarea datelor de intrare transformate în grafica boxplot.
Fig.14.2. Vizualizarea datelor de intrare transformate în grafica histogram.
Variația datelor:
MPU69W 1.000004
MPU69X 1.000004
MPU69Y 1.000004
MPU69Z 1.000004
MPU69ACC_X 1.000004
MPU69ACCY 1.000004
MPU69ACCZ 1.000004
dtype: float64
14.1.2. Impărțirea datelor pentru antrenare-evaluare, creare model
Am împărțit datele de intrare (transformed) și cele de ieșire (target) în două seturi – unul de antrenare și unul de testare cu ajutorul librăriei sklearn:
Am definit vectorul de intrare:
Am construit și compilat modelul:
14.1.3. Antrenare, evaluare
Am adjustat parametrii (funcții activare, dimensiunea batchsize,procentul de antrenare train size, viteza de învățare learning rate) cu ajutorul unor funcții iterative de verificare a performanței modelului.
Am antrenat modelul începând cu 10 epoci și am continuat antrenarea în succesiune cu un număr de epocă variabil salvând și încărcând în mod repetat în model valorile weights până la obținerea valorilor optime ale raportului pierderi – acuratețe, evitarea fenomenului de supraînvățare (overfitting) sau deficiențe ale învățării (underfitting).
Secvență a procesului de antrenare:
Epoch 8/10
184840/184840 [==============================] – 52s 282us/step – loss: 0.0050 – accuracy: 0.9865 – val_loss: 0.0040 – val_accuracy: 0.9868
Epoch 9/10
184840/184840 [==============================] – 58s 314us/step – loss: 0.0046 – accuracy: 0.9865 – val_loss: 0.0039 – val_accuracy: 0.9871
Epoch 10/10
184840/184840 [==============================] – 37s 198us/step – loss: 0.0043 – accuracy: 0.9865 – val_loss: 0.0041 – val_accuracy: 0.9868
Performanța modelului:
46210/46210 [==============================] – 8s 174us/step
The accuracy of this model is: 0.9868210554122925
Fig.14.3. Vizualizarea pierderilor modelului în secvența finală de antrenare.
Fig.14.2. Vizualizarea performanței modelului în secvența finală de antrenare.
14.2. Senzorul VS40
14.2.1. Preprocesarea – transformarea datelor
Am utilizat aceleași librării de manipulare a datelor ca și în secțiunea anterioară, am importat în format panda df setul de date:
Am instanțiat, definit datele de intrare și cele de ieșire pentru construirea modelului, am transformat datele de intrare (predictors) cu ajutorul PowerTransformer:
Vizualizarea datelor de intrare transformate în grafica boxplot și histogram:
Fig.14.3. Vizualizarea datelor de intrare transformate în grafica boxplot.
Fig.14.4. Vizualizarea datelor de intrare transformate în grafica histogram.
14.2.2. Impărțirea datelor pentru antrenare-evaluare, creare model
Am împărțit datele de intrare (transformed) și cele de ieșire (target) în două seturi – unul de antrenare și unul de testare cu ajutorul librăriei sklearn:
Am definit vectorul de intrare:
Am construit și compilat modelul:
14.2.3. Antrenare, evaluare
Am adjustat parametrii (funcții activare, dimensiunea batchsize,procentul de antrenare train size, viteza de învățare learning rate) cu ajutorul unor funcții iterative de verificare a performanței modelului.
Am antrenat modelul începând cu 10 epoci și am continuat antrenarea în succesiune salvând și încărcând în mod repetat valorile weights în model până la obținerea valorilor optime ale raportului pierderi – performanță, evitarea fenomenului de supraînvățare (overfitting) sau deficiențe ale învățării (underfitting).
Secvență a procesului de antrenare:
Epoch 8/10
184840/184840 [==============================] – 52s 282us/step – loss: 0.0050 – accuracy: 0.9865 – val_loss: 0.0040 – val_accuracy: 0.9868
Epoch 9/10
184840/184840 [==============================] – 58s 314us/step – loss: 0.0046 – accuracy: 0.9865 – val_loss: 0.0039 – val_accuracy: 0.9871
Epoch 10/10
184840/184840 [==============================] – 37s 198us/step – loss: 0.0043 – accuracy: 0.9865 – val_loss: 0.0041 – val_accuracy: 0.9868
Performanța modelului:
Train: 0.990, Test: 0.990
Fig.14.5. Vizualizarea performanței modelului în secvența finală de antrenare.
Fig.14.6. Vizualizarea pierderilor modelului în secvența finală de antrenare.
Fig.14.7. Vizualizarea suprapunerii valorilor de predicție/valori adevărate.
Verificarea modelului cu k-fold:
Rezultate: [ test loss, test accuracy ]
Model evaluation [0.8217937822032803, 0.9825570583343506]
Model evaluation [0.4870502952942847, 0.9886079430580139]
Model evaluation [0.3958512173698005, 0.9917253255844116]
Model evaluation [0.4888181254709114, 0.9903500080108643]
Model evaluation [0.3323004440441448, 0.9944071173667908]
[ test loss, test accuracy ]
Cap.15. Concluzii generale – discuții
15.1. Aprecieri privind tehnica întrebuințată (nesupervizată)
Scopul lucrării de față a fost achiziția datelor de la anumiți senzori: giroscopul-accelerometru (IMU) MPU6050, senzorul de vibrații VS40, senzorii de temperatură-umiditate DHT11, detecția și etichetarea anomaliilor giroscopului – accelerometru și a senzorului vibrații prin crearea unui mediu de funcționare artificial – condiții fluctuante ale temperaturii și umidității, vibrații cu diferite frecvențe, calculul în procente a consumului din autonomia de funcționare, crearea unor modele de inteligență artificială necesare mentenanței predictive.
Procesul de achiziție al datelor a fost unul destul de complicat deoarece a necesitat sincronizarea datelor pe același flux de ieșire. O parte a senzorilor utilizați au un timp mai lent de răspuns (clock intern) în comparație cu ceilalți senzori fapt ce a necesitat unele setări ale regiștrilor interni și mici artificii de scripting.
Detecția și etichetarea anomaliilor folosind tehnici nesupervizate a fost unul de prospectare/ cercetare, pornind de la o asumpție/calcul manuală până la utilizarea celor mai noi tehnici în domeniu. Autoencoder-ul a oferit soluții convenabile dar cu dezavantajul imposibilității de detectare (false negativ) a unor valori evidente outliers/anomalii. Tehnica isolation forest acoperă aș putea spune aceste inconveniente dar prezintă și ea dezavantaje – cunoașterea anterioară în procente a gradului de contaminare cu anomalii și prezintă riscul etichetării false positive. Punând în balanță rezultatele celor două tehnici am folosit iforest pentru continuarea procesului de analiză al erorilor/anomaliilor.
Pentru cuantificarea gradului de influență al anomaliilor în autonomia de viață a senzorilor am folosit tehnici bazate pe distanță și densitate – histogram, alocând ponderi corespunzători funcție de poziția și numărul de ordine a fiecărui set de valori (bins).
Modelele de inteligență artificială structurate în keras s-au dovedit a fi versatile, foarte eficiente ajungând la performanțe ce depășesc acuratețea în predicție de 95 %, putând fi cu încredere întrebuințate în schemele de monitorizare a condiției senzorilor.
Ca și concluzie aș putea menționa faptul că tehnica nesupervizată oferă spațiu larg interpretărilor, este o tehnică ce necesită îmbunătățiri prin agregarea mai multor tehnici.
15.2. Aprecieri privind tehnica supervizată, continuarea proiectului
Abordarea tehnicii supervizate necesită condiții speciale de preluare a datelor, realizarea unor scheme laborioase, desemnarea elementelor de referință/raportare în scopul identificării erorilor/anomaliilor.
Am realizat mai multe modele cu capacități foarte bune de predicție a valorilor țintă a funcție de valorile de ieșire b dar nu am reușit a duce experimentul la final datorită multor impedimente în procesul relațional cauză – efect (diminuarea autonomiei de viață).
Având în vederea considerentele menționate am procedat la folosirea algoritmilor specifici tehnicii nesupervizate.
În ceea ce privește tehnica supervizată menționez posibilitatea de identificare a anomaliilor prin crearea unor modele de predicție x = f(y) unde x reprezintă valorile senzorului supus experimentelor iar y reprezintă valorile senzorului folosit ca referință. O metodă pe care am pus-o parțial în practică, dar s-a dovedit a fi destul de greoaie deoarece necesită condiții de cercetare cu facilități de laborator. Spre exemplu giroscoapele de testare ar trebui aliniate cu referințe la linia coincidenței axelor sau găsirea unor referințe externe pentru compararea valorilor de ieșire digitale cu cele metrice exterioare de observare și măsurare. Această abordare a studiului de caz ar putea constitui o alternativă pentru continuarea subiectului de cercetare în domeniul anomaliilor.
În ceea ce privește efortul depus pentru abordarea tehnicii supervizate aș dori să menționez gradul fezabilității acesteia, nivelele de performanță pe care o poate oferi aceasta, spre exemplu acuratețea de 90% obținută foarte ușor cu ajutorul unor structuri simple precum ar fi cele bazate pe arbori[39]:
ExtraTreesRegressor(bootstrap=False, criterion='mse', max_depth=4, max_features=2, min_samples_leaf=1, min_samples_split=2, n_estimators=7, random_state=None, warm_start=False)
Fig.15.1. Grafic suprapunere valori predicție/valori adevărate metoda supervizată.
Greutățile întâmpinate pentru tehnica supervizată au constat în preluarea datelor în condițiile separării/izolării fizice a senzorilor de referință supuși experimentului.
O altă continuare de proiect ar putea fi mentenanța predictivă a circuitelor imprimate prin interpretarea valorilor preluate de la senzorii de temperatură și umiditate. Variația acestor parametrii influențează în mod direct rezistența/tensiunea de contact a lipiturilor practicate la realizarea cablajului imprimat, materiale primordiale pentru conducerea curentului electric.
O altă alternativă de continuare a proiectului ar putea fi implementarea unei scheme IOT (internet of things)[40] pentru monitorizarea în dinamică a necesarului de mentenanță:
Fig.15.2. Monitorizarea necesarului de mentenanță prin flux IOT.
Bibliografie
[1]InvenSense – MPU-6000 and MPU-6050 Product Specification Revision 3.4, InvenSense Inc., USA, 2013:1-52.
[2]InvenSense – MPU-6000 and MPU-6050 Register Map and Descriptions Revision 4.2, InvenSense Inc., USA, 2011:1-46.
[3]Adafruit learning system – DHT11, DHT22 and AM2302 Sensors, Adafruit industries, USA, 2019:1-15.
[4]OSEPP Electronics, – DHT11 Temperature & Humidity Sensor features a Temperature & humidity sensor complex with a calibrated digital signal output, Mouser electronics, 2020:1-9.
[5]Rajguru Electronics – Vibration sensor, Rajguru Electronics, 2019, 1-4.
[6]Arduino – Arduino uno, Farnell’ An Avnet Company, 2019, 1-4.
[7]Edgar Acuña, Caroline Rodriguez – On detection of outliers and their effect in supervised classification, Department of Mathematics University of Puerto Rico at Mayaguez, Puerto Rico, 2004:1-14.
[8]Edgar Acuña, Caroline Rodriguez – An empirical study of the effect of outliers on the misclassification error rate, Transactions on knowledge and data engineering, 2014, 1-22.
[9]John Hearty – Advanced Machine Learning with Python, Solve challenging data science problems by mastering cutting-edge machine learning techniques in Python, Packt publishing, Birmingham, Mumbai, 2016:1-75.
[10]François Chollet, Deep Learning with Python, Manning Publications Co., NY-USA, 2018:1-386.
[11]Fei Tony Liu, Kai Ming Ting, Zhi-Hua Zhou – Isolation Forest, 2018, 1-10.
[12]Brandon Reagen, Robert Adolf, Paul Whatmough, Gu-Yeon Wei, David Brooks -Deep learning for computer architects, Synthesis lectures on computer architecture, Morgan &Claypool publishers, USA: Princeton University, 2017:15-40.
[13]Aurélien Géron, Hands-on machine learning with scikit-learn and tensorflow, Concepts, Tools, and Techniques to Build Intelligent Systems, O’Reilly Media, USA, 2017:259-531.
[14]Walter H. L. Pinaya, Andrea Mechelli, João R. Sato – Using deep autoencoders to identify abnormal brain structural patterns in neuropsychiatric disorders: A large-scale multi-sample study, Human Brain Mapping, 2019, 40:944-954.
[15]Andreas C. Müller & Sarah Guido – Introduction to Machine Learning with Python, A guide for data scientists, O’Reilly Media, Inc., USA, 2017:1-302.
[16]Scott Fitzgerald, Michael Shiloh – The arduino projects book, Arduino LLC, Torino- Italy, 2012:1-175.
[17]Julien Bayle – C Programming for arduino, Learn how to program and use Arduino boards with a series of engaging examples, ilustrating each core concept, Packt publishing, Birmingham – UK, 2013:100-177.
[18]John Boxall, Arduino Workshop – A Hands-On Introduction with 65 Projects, No Starch Press, Inc., San Francisco – USA, 2013:184-186.
[19]Lindsay I Smith – A tutorial on Principal Components Analysis, 2002, 1-27.
[20]Manohar Swamynathan – Mastering Machine Learning with Python in Six Steps, A Practical Implementation Guide to Predictive Data Analytics Using Python, Apress, India, 2017:26-374.
[21]Bill Earl – Multi-tasking the Arduino, Adafruit Learning System, Adafruit Industries, 2020, 1:1-30.
[22]Oracle Corporation – MySQL 5.7 Reference Manual Including MySQL NDB Cluster 7.5 and NDB Cluster 7.6 , USA, 2019: 1845-2017.
[23]https://ml-cheatsheet.readthedocs.io/en/latest/backpropagation.html 15.01.2020.
[24]https://en.wikipedia.org/wiki/Anomaly_detection – 15.01.2020.
[25]https://en.wikipedia.org/wiki/K-medoids – 15.01.2020.
[26]https://www.robot-electronics.co.uk/i2c-tutorial – 15.01.2020.
[27]https://circuitdigest.com/microcontroller-projects/arduino-interrupt-tutorial-with-examples – 15.01.2020.
[28]http://www.i2cdevlib.com/devices/mpu6050#source – 15.01.2020.
[29]https://www.driverscape.com/download/usb-serial-ch341 – 15.01.2020.
[30]https://github.com/tttapa/Projects/tree/master/Arduino/NodeJS/Database/Arduino-NodeJS-MySQL-Serial-Data-Logger – 15.01.2020.
[31]https://www.apachefriends.org/ro/index.html – 15.01.2020.
[32]https://serialport.io/docs/guide-about – 15.01.2020.
[33]https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage environments.html – 15.01.2020.
[34]https://jupyter-notebook.readthedocs.io/en/stable/notebook.html – 15.01.2020.
[35]https://seaborn.pydata.org/tutorial.html – 15.01.2020.
[36]https://keras.io/models/sequential/ – 15.01.2020.
[37]http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/modeling.html#unsupervised -15.01.2020.
[38]https://github.com/h2oai/h2o-tutorials/blob/master/tutorials/isolation-forest/interpreting_isolation-forest.ipynb – 15.01.2020.
[39]https://scikitlearn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesRegressor.html – 15.01.2020.
[40]https://fiware-tutorials.readthedocs.io/en/latest/iot-over-mqtt/ – 15.01.2020.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: MENTENANȚA PREDICTIVĂ A SENZORILOR MOLDOVAN SORIN-CLAUDIU CUPRINS Introducere 4 MOTIVAȚIA, IMPORTANȚA ȘI METODOLOGIA CERCETĂRII 5 Structura lucrării… [309404] (ID: 309404)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
