Sunteți pe pagina 1din 15

Investigating a New Design Pattern for Efficient Implementation of

Prediction Algorithms

In acesta publicare s-a prezentat diferiti algoritmii de predictie pentru a rezolva problemele severe
in arhitectura calculatorului.
Mecanismul general de predicție constă în anticiparea contextelor viitoare bazate pe informatii din
contextul actual și anterior , recuperarea contextului corect în cazul în care speculația eșuează și
actualizarea predictorului pentru a îmbunătăți acuratețea de predicție viitoare.
Predicția poate fi foarte utila în cazul în care disponibilitatea unor date în avans, permite reducerea
timpului de așteptare, îmbunătățind astfel eficiența.
In aceasta publicare s-a pus la dispozitie o descriere a predictorului model de design.

Intentia a fost de a pune la dispozite un sablon de implementare pentru orice mecanisme de


predictie.Acesta poate fi folosit la anticiparea starilor viitoare sau simboluri in aplicatiile software si este
util atunci cand cunoasterea starilor viitoare speculative sau simboluri in avans deblocheaza unele
dependente specifice aplicatiilor care implica o executie accelerata.

Motivativatia de a dezvolta predictorul model de design este faptul ca exista situatii cand
comportamentul proceselor software intr-un anumit context este mereu sau in mare parte acelasi.
In astfel de cazuri daca inregistram contextele din istorie si comportamentul asociat cand identificam
acelasi context in viitor putem prezice cu mare acuratete comportamentele corespunzatoare.Predictia
poate fi evitata crescand acuratetea generala.

AbstractConfid
ence
Trust(Object)
untrust(Object)
IsPredictible(O
bject)

ConcreteConfi
dence
Trust(Object)
untrust(Object)
IsPredictible(O
bject)

ConcretePredi
ctor
Predict()
Update(Object
)
AbstractPredic
tor
Predict()
Update(Object
)
Client

Figura1. Structura Predictorului model de design

Predictorul model de design poate fi folosit in aplicatiile care au procese de predictie si ajuta la
implementarea eficienta a mecanismelor de predictie.

Figura 1 prezinta diagrama de clase a sistemului care foloseste predictorul model de design.

Clasele participante sunt: AbstractConfidence, ConcreteConfidence, AbstractPredictor,


ConcretePredictor, Client.

Colaborari intre clase: AbstractConfidence defineste metodele Trust, Untrust, IsPredictible.


AbstractPredictor se bazeaza pe ConcretePredictor care defineste metodele Predict si Update. Predictia
se realizeaza dupa cum urmeaza. Clientul verifica daca contextual current este predictibil pentru a apela
metoda IsPredictible din clasa ConcreteConfidence. Cand clientul apeleaza Predict din ConcretePredictor
rezultatul predictiei este folosit in avans sa deblocheze dependenta numai daca contextual current este
predictibil.In cazul in care simbolul real este cunoscut clientul compara cu o predictie si in mod
corespunzator efectueaza actualizari prin apelarea metodei Update din ConcretePredictor care introduce
noul simbol pentru istoria inregistrata de simboluri si de asemenea, prin apelarea metodei Trust din
ConcreteConfidence in caz de predictie corecta sau metoda Untrust in cazul absentei predictiei.

Principalul dezavantaj utilizand predictorul poate aparea in unele aplicatii daca acuratetea
predictiei este mica datorata numarului mare de misprediction( absenta predictiei) si recuperarea este
consumatoare de timp .

In aceasta implementare modificarea predictorului este efectuata de client si consta in apelul


metodelor Trust si Untrust din Confidence si metodei Update din ConcretePredictor. Daca numarul
observatiilor posibile este foarte mare noi recomandam tabele hasis pentru a pastra informatiile de
prerdictie.

AbstactPredictor este o interfata care realiseaza pe clasa predictor sa defineasca metodele


predict si update. Metoda predict anticipeaza observatiile viitoare bazata pe istoria de observatii.Metoda
update trebuie sa actualizeze predictorul pentru a maximize probabilitatea unei predictii corecte pentru
viitor. AbstactPredictor este definita dupa cum urmeaza :

Exemplu de implementare a predictorului :Predictia sau anticiparea situatiilor viitoare invatarea


tehnicilor la Markov Chains(Lanturile Markov), Hidden Markov Models(Modelele Markov Ascunse),
Bayesian Networks(Retelele Bayesian), Time Series(Timpul Serial) sau Neural Networks(Retelele
Neurale) sunt candidate evidente. In aceasta sectiune noi prezentam lanturile Markov si deasemenea
Multi-Layer Perceptron (MLP) ambii implementati in Java sa prezica miscarile angajatilor intr-o cladire de
birouri.Scopul cercetari a fost de a proiecta cateva tabele inteligente care sunt in stare sa directioneze
vizitatori la locatia curenta a unui proprietar de birou pazat pe un sistem de urmarire a locatiei si predictie
daca proprietarul de birou se intoarce in curand.

Aplicatia doar genereaza statistici in ceea ce priveste predictia miscarii persoanei si raporteaza
numarul de predictii, numarul de predictii corecte si de asemenea precizia predictiei.Figura 2 prezinta
diahrama de clase din aplicatie.

public interface AbstractPredictor {

public abstract Integer predict ();

public abstract void update (Integer observation);

Clasa Markov este un concret lant Markov bazat pe predictor care defineste metodele predict si
update din interfata AbstarctPredictor. Metoda predict identifica contextul constand in ultimul R
(parametru de intrare), simboluri de observare, cautat in secventa de observare determina care simbol de
observare a urmat contextul cu cea mai mare frecventa si returneaza acel simbol ca urmatoarea
observare precisa,O implementare bazata pe tranzatia de tabele este de asemenea posibila dar este
ineficienta pentru un numar mare de simboluri de observare. Metoda update adauga simbolurile reale de
observare cand sunt disponibile in secventa de observatie.
Prezentare clasa Markov: Clasa MLP este un alt predictor concret, Multy-Layer-Perceptron cu un
strat ascuns si este folosit la algoritmul de invatare propagare inapoi.In general numarul de neuroni din
staturilede intrare si de iesire depind reprezentarea problemei.
public class Markov implements AbstractPredictor{

int P []; //the observation symbol probability distribution

java.util.ArrayList Q = null; //the observation sequence

int R = 0; //the order of the Markov Chain

int N = 0; //number of observation symbols

int T = 0; //length of observation sequence

int context []; //prediction context

public Markov (int nObservationSymbols, int order) {

R = order; // the order of the Markov Chain

context = new int [R];

N = nObservationSymbols; // the number of distinct observation symbols

Q = new java.util.ArrayList ();

public Integer predict (){

P = new int [N];

T = Q.size ();

For (int k = 0; k < R; k++)

Context [k] = ((Integer) Q.get (T – R + k)).intValue ();

for (int i = R; i < T; i++){

boolean is Context = true;

for (int k = 0; k < R; k++)

if (((Integer) Q.get(i – R+k)).intValue () != context [k]){

isContext = false;

break;
}

if (isContext)

P [((Integer)Q.get(i)).intValue ()]++;

int pred = 0;

int max = P [0];

for (int k = 1; k < N; k++)

if (P [k] > max){

max = P [k];

pred = k;

return new Integer (pred);

public void update (Integer observation){

Q.add (observation);

In aceasta aplicatie noi am ales codificarea binara pentru stratul de intrare si o camera un neuron
codificarea pentru stratul de iesire.Clasa MLP defineste metodele predict si update din interfata
AbstractPredictor.In afara de aceste metode contine cateva metode MLP specifica ca
generateRandomWeights, F, dF, forward si backward, dar de asemenea
cateva metode sa codifice simbolurile de observatie pentru a potriva stratul de intrare sau stratul de
iesiere respectiv decimalToBinary si decimalToCode. Pentru codul binar de intrare si de iesire functia de
activare sigmoida uni-polar poate fi folosita:

f(x)=1/(1+e(-x))

Deoarece in aplicatia prezentata intrarile si iesirile sunt codificate cu -1 si 1 urmatorul sigmoid bi-
polar functia de activare a fost considerata:

f(x)=(1-e(-x))/(1+e(-x))

Functia de activare este definita in metoda F si este derivata in dF. Metoda


generateRandomWeights este folosita pentru a initializa in mod aleatoriu greutatile in intervalul [-2/N,2/N]
unde N este numarul de neuroni din stratul de intrare. Definirea clasei MLP este prezentata dupa cum
urmeaza
import java.lang.Math;

public class MLP implements AbstractPredictor{

java.util.ArrayList Q = null; //the observation sequence

private int history;

private int nNeuronsForSymbol;

int input []; //array of input values

private int nInputLayerNeurons;

private int nHiddenLayerNeurons;

private int nOutputLayerNeurons;

private double neth []; //the hidden layer values before activation

private double whin [] []; //hidden-input weight matrix

private double bhin []; //hidden layer bias array

private double hidd []; //hidden layer values after activation

private double neto []; //the output values before activation

private double wohi [] []; //output-hidden weight matrix

private double bohi []; //output layer bias array

public double out []; //the output values after activation

private double deltaout []; //the output layer error terms

private double deltain []; //the hidden layer error terms

private double learningRate = 0.3;

public MLP (int nNeuronsForSymbol, int m, int p, double learningRate, int history){

Q = new java.util.ArrayList ();

this.nNeuronsForSymbol = nNeuronsForSymbol;

this.history = history;

input = new int[history*nNeuronsForSymbol];

this.nInputLayerNeurons = nNeuronsForSymbol* history;

this.nHiddenLayerNeurons = m;
this.nOutputLayerNeurons = p;

this.learningRate = learningRate;

neth = new double [nHiddenLayerNeurons];

whin = new double [nHiddenLayerNeurons][nInputLayerNeurons];

bhin = new double [nHiddenLayerNeurons];

hidd = new double [nHiddenLayerNeurons];

neto = new double [nOutputLayerNeurons];

wohi = new double [nOutputLayerNeurons] [nHiddenLayerNeurons];

bohi = new double [nOutputLayerNeurons];

out = new double [nOutputLayerNeurons];

deltaout = new double [nOutputLayerNeurons];

deltain = new double [nHiddenLayerNeurons];

generateRandomWeights ();

Journal of Digital Information Management 􀂉 Volume 11 Number 5 􀂉 October 2013 371

private void generateRandomWeights (){

double wi = 4.0/nInputLayerNeurons; //weight interval

double hwi = 2.0/nInputLayerNeurons; //half weight interval

for (int j = 0; j < nHiddenLayerNeurons; j++) {

bhin [j] = ((Math.random ()*10000)% (Math.floor (wi*100)))/100.0 − hwi;

for (int k = 0; k < nInputLayerNeurons; k++)

whin [j] [k] = ((Math.random()*10000)% (Math.floor(wi*100)))/100.0 − hwi;

for (int j = 0; j < nOutputLayerNeurons; j++){

bohi [ j] = ((Math.random ()*10000)% (Math.floor (wi*100)))/100.0 − hwi;

for (int k = 0; k < nHiddenLayerNeurons; k++)

wohi [j] [k] = ((Math.random ()*10000)% (Math.floor (wi*100)))/100.0 − hwi;


}

private double F (double x){

return (1 - Math.exp(-1 * x))/(1 + Math.exp (−1 * x));

private double dF (double x){

return (1 − (F(x)*F(x)))/2;

public void forward (int in []){

/* hidd <- in */

int j, l;

for (j = 0; j < nHiddenLayerNeurons; j++){

neth [j] = bhin [j];

for (l = 0; l < nInputLayerNeurons; l++)

neth [j] + = whin [j] [l] * in [l];

hidd [j] = F (neth [j]);

/* out <- hidd */

for (j = 0; j < nOutputLayerNeurons; j++){

neto [j] = bohi [j];

for (l = 0; l < nHiddenLayerNeurons; l++)

neto [j] += wohi [j] [l] * hidd [l];

out [j] = F (neto [j]);

public void backward (int tp [], int in []){

/* out -> hidd */


for (int j = 0; j < nOutputLayerNeurons; j++)

for (int l = 0; l < nHiddenLayerNeurons; l++){

deltaout [ j] = (tp [ j] – out [ j]) * dF (neto [ j]);

wohi [ j] [l] + = learningRate*deltaout [ j] * hidd [l];

bohi [ j] + = learningRate * deltaout [ j];

/* hidd -> in */

for (int j = 0; j < nHiddenLayerNeurons; j++)

for(int l = 0; l < nInputLayerNeurons; l++){

deltain [ j] = 0;

for (int k = 0; k < nOutputLayerNeurons; k++)

deltain [ j] + = deltaout [k] * wohi [k] [j] * dF (neth [ j]);

whin [ j] [l] + = learningRate * deltain [ j] * in [l];

bhin [ j] + = learningRate * deltain [ j];

372 Journal of Digital Information Management 􀂉 Volume 11 Number 5 􀂉 October 2013

public void decimalToBinary (int dec, int bin [], int n){

int k = 0, r = 0, q = dec;

while (q ! = 0){

r = q%2;

if (r == 0)

r = −1;

bin [k++] = r;

q = q/2;

for (; k < n; k++)


bin [k] = −1;

public void decimalToCode(int dec, int bin [], int n){

for(int i = 0; i < n; i++)

bin [i] = −1;

if (dec < n)

bin [dec] = 1;

public Integer predict (){

int bin [] = new int [nNeuronsForSymbol];

for(int i = 0; i < history; i++){

decimalToBinary (((Integer)Q.get (i)).intValue (), bin, nNeuronsForSymbol);

for (int j = 0; j < nNeuronsForSymbol; j++)

input [i * nNeuronsForSymbol + j] = bin [ j];

forward (input);

// finding the position of the maximum output which will be predicted

int maxOutputPos = 0;

for (int i = 1; i < nOutputLayerNeurons; i++)

if (out [i] > out [maxOutputPos])

maxOutputPos = i;

return new Integer (maxOutputPos);

public void update (Integer observation){

int tp [] = new int [nOutputLayerNeurons];

Q.add (observation);

If (Q.size () > history){


Q.remove (0);

decimalToCode (observation.intValue (), tp, nOutputLayerNeurons);

backward (tp, input);

După cum se poate observa, metoda prezice codifică datele de intrare (constând
într-o anumită istorie de observații) din zecimal în binar, propagates intrarea inainte prin
intermediul rețelei prin apelarea metodei înainte și după aceea indicele producției
maxime este considerată ca fiind observația prezisă. Metoda de actualizare adaugă
simbolul de observație reală (când este disponibil) pentru a secvența de observație,
calculează erorile existente între simbolul de observație reală și prezisă una și după
aceea propagates acești termeni de eroare înapoi prin intermediul rețelei prin apelarea
metodei înapoi. obiectiv al pas înapoi este de a ajusta greutățile în ordine pentru a
minimiza eroarea.

AbstractConfidence este o altă interfață, care se bazează pe o Clasa de


încredere concretă pentru a defini încrederea, untrust și Journal of Information
Management Digital ? volum 11 Numărul 5 ? octombrie 2013 373 Metode isPredictable.
Scopul încrederii Mecanismul este de a decide, pe baza observației curente simbol sau
context și contra său de încredere atașat, în cazul în care un potențial de predicție îi
place să fie statistic corecte sau nu. Clasifică în mod dinamic simboluri de observare
sau contextele în previzibil și imprevizibil și oferă această clasificare prin boolean
isPredictable metodă. Scopul încredere și untrust metode este de mări sau micșora
încrederea într-o anumită Simbolul de observație sau context, în cazul în care se
transformă predicție a fi corecte sau greșite, respectiv.

Clasa de încredere prevede definiții pentru încrederea, Metode untrust și isPredictable.


În acest exemplu, Mecanismul de încredere este implementat pe baza unui set de
contor de încredere cu două previzibile și doi stări imprevizibile, dar și alte variante sunt
posibile. satureze contoare, fiecare fiind asociat unui Simbolul de observare distinct.
Figura 3 prezintă un 4-stat.
Constructorul de încredere primește ca parametri Numărul maxim de observații
distincte, numărul de state și un prag care este utilizat de către isPredictable metodă.
Observația curentă este clasificată drept previzibil, numai în cazul în care încrederea
atașat este într-o stare mai mare sau egală cu valoarea pragului.

Codul următor este o secvență dintr-un client care generează


statisticile într-un anumit proces de predicție în ceea ce privește numărul de predicții, numărul de
predicții corecte
precum și precizia de predicție (calculat
ca raportul dintre numărul de predicții corecte
iar numărul total de predicții). În primul rând, instanțiază
un predictor Markov și o încredere. observațiile
sunt apoi citite dintr-un fișier numit în acest exemplu
benchmark.txt. Pentru fiecare observație curentă este determinată
dacă încrederea atașat este într-o stare previzibil sau nu,
o predicție fiind realizată sau nu, în consecință.
predictor este actualizat cu fiecare simbol de observație nouă.
Astfel, metoda predictionProcess reprezintă nucleul
a cererii care creează o punte între
clase participante
In exemplul de mai sus am folosit contoare de încredere 4-stat
cu un prag de 2 (adică două imprevizibile și doi
stări previzibile. Evident, mecanismul de încredere
poate fi mai selectiv, de exemplu, numai unul care are
stat previzibil. În acest caz, parametrul de prag
constructorul de încredere este 3 în loc de 2.
Un client care utilizează predictor MLP este similară, dar
în loc de un Markov obiectului pe care îl instanțiază un obiect MLP. Aceasta
De asemenea, este posibil să se atașeze un contor de încredere
combinații de două [5] sau mai multe simboluri de observare
în loc de o singură (așa cum am făcut-o aici).
Principalul obiectiv al acestei lucrări este de a propune un model de design
pentru algoritmi de predicție, evaluările furnizate în această
secțiune fiind doar un exemplu de validare a predictor
Conceptul designului. Criteriul de referință Setul utilizată pentru
Evaluările conține secvențe de circulație a câte 4 angajați
in 14 camere, achizitionat de la proiectul inteligent Tabele pentru use
dezvoltat la Universitatea din Augsburg [13]. Fiecare fișier conține
datele de localizare ale unei singure persoane de test. Valorile de referință
sunt fișiere text generate prin înregistrarea mișcărilor
persoanele de testare prin intermediul birourilor situate la etajul al patrulea în clădirea Institutului
Computer Science la
Universitatea din Augsburg. Tabelul 1 prezintă conținutul
un punct de referință, înainte și după codificarea camerei
proces.

Fiecare linie din obiectivele de referință originale reprezintă un de circulație a persoanei,


conținând data mișcării și ora, numele camerei, numele și persoanei timestamp-ul.
Dupa codificare procesarea valorilor de referință conțin numai codurile de camere (0 ÷
13), în acest lucru, deoarece etapa de demarare a activității noastre numai aceste
informații sunt folosite pentru predicție. În procesul de codificare, avem, de asemenea
eliminat din obiectivele de referință comune coridor, pentru că s-ar putea comporta ca
zgomot. Sunt două Tipuri de referință: câteva repere scurte care conțin circa 300-400
de mișcări și niște repere lungi care conține aproximativ 1000 de mișcări. Evaluările
noastre sunt bazat pe valorile de referință lungi. Pentru experimente am folosit cel mai
bun predictor Markov configurația obținută prin [5] [15], având o rată de învățare de 0.1
o istorie de 2 camere, N = 8 neuroni din stratul de intrare (4 neuroni pe cameră,
suficient pentru a binar codifice un maxim din 16 camere) si 9 neuroni strat ascuns.
Stratul de ieșire conține un neuron pentru fiecare cameră (14 neuroni), poziția de ieșire
cea mai mare fiind considerată cameră de prezis. În această lucrare suntem interesați
pentru a anticipa urmatoarea camera din toate camerele cu exceptia biroului propriu.
Figura 4 prezintă comparativ acuratețea de predicție (raportul dintre numărul de predicții
corecte și numărul total de predicții, exprimate în procente) obținute folosind Markov și
MLP predictori fără probleme și, de asemenea, cu contoare de încredere 4-stat având 1
de stat previzibil (C1 notat) sau 2 stări previzibile (C2 notat): Cele mai bune rezultate au
fost obținute folosind predictorul MLP cu încredere C1. Această metodă a oferit o medie
Precizia de predicție 84,5%, cu un maxim de 93.58%. După cum arată Figura 4,
mecanismul de încredere poate crește precizia de predicție prin evitarea în cazul în
care încrederea într-un anumit context este scăzut. Evident, Mecanismul de încredere
poate lipsesc de la un predictor proiectare, în special în aplicații în care mispredictions
nu afectează performanța generală, dar este necesar în aplicații ale căror performanțe
sunt diminuate cu mispredictions.

Tabelul 2 prezintă modul în care rata de predicție (raportul dintre numărul de


predicții și numărul total de
mișcări, exprimate în procente) este influențată de
Selectivitatea (prag) a mecanismelor de încredere
pentru ambele predictori. Rata de predicție a predictori
fără încredere este de 100%, deoarece o predicție este întotdeauna
efectuat. Se poate observa că, mai selective
Mecanismul de încredere am folosit ca o mai mare acuratețe și
rată de predicție mai mică am obținut.
In acest studiu, am prezentat design-Predictor
model. Am descris acest nou model de design și cu condiția
un exemplu care generează statistici în ceea ce privește
Precizia de predicție. În mod evident, un client poate oferi sincronizarea
măsurători, de asemenea, cum am făcut-o pentru ca microarhitecturii
predictori de valoare [7-9]. De asemenea, este posibil ca un anumit client
cerere de a utiliza predictori hibride, cum ar fi în cascadă
predictori sau metapredictors, deoarece, de obicei, un singur
predictor nu poate captura toate tipurile de predictibilitate
modele. În multiple abordări de predicție în cascadă
predictori sunt utilizate în diferite etape, într-un mod static
ordine predefinită (prioritizare fixă). O utilizare metapredictor
mai multe predictori într-o singură etapă și selectează dinamic
cel mai bun predictor (prioritizare adaptiv). O abordare hibridă
este motivată de faptul că, chiar și predictor MLP
cu condiția ca cea mai mare precizie medie de predicție, pe de
B de referință predictor Markov a fost mai bine.
Predicția este o tehnică larg utilizată în știința calculatoarelor
și de inginerie și, prin urmare, în opinia noastră, propusă
model de design poate fi foarte util pentru dezvoltatorii de software
dar, de asemenea, pentru arhitecți hardware, în special în proiectarea
simulatoare de software de microprocesoare - un important
stadiul de cercetare și proiectare arhitectura de calculator
proces [20].

S-ar putea să vă placă și