- Transpun matricea dată ca parametru și inițializez variabilele de returnare.
- Am transpus matricea din cauza unei neînțelegeri a enunțului. Inițial credeam că sunt vectori coloane, dar de fapt erau vectori linii.
- În prima buclă
for
, funcția calculează media fiecărei linii dinX
. - În al doilea ciclu
for
, funcția calculează matricea de covarianță.
- Creez o matrice auxiliară (
invs
) în care stochez inversa pentru a nu calcula inversa de fiecare dată în buclă. - Calculez coeficientul conform formulei din enunț.
- Creez un alt auxiliar în care se stochează acea diferență pentru o claritate mai mare a codului.
- Calculez mărimea pasului (
(max - min) / 1000
, deoarece vreau 1000 de pași). - Actualizez
predictions
la fiecare iterație (verific dacă este mai mic decât epsilon). - Apoi mă folosesc de 3 auxiliare (
tp
,fp
,fn
) și se face o comparație element cu element. - Aplic formula din enunț.
- Stochez în
n
câte linii are matricea și inițializez matricea de retur cu matricea nulă. - Aplic funcția
f
dată ca parametru: calculez fiecare element al matriciiK
ca rezultatul returnat de funcțiaf
. - Funcția
f
primește ca parametru liniai
șij
+ un parametruf_param
.
- M-am folosit inițial de funcția din lab, dar a trebuit să o modific pentru că primeam timeout la un alt exercițiu.
- Stochez în
n
mărimea luiA
. - Calculez un scalar (
s
) care este diferența dintre elementul de pe diagonala principalăA(j,j)
și produsul scalar al primelorj-1
elemente de pe rândulj
dinL
. Pe diagonala principală se aplicăsqrt
din scalaruls
. - Apoi calculez elementele de pe coloana
j
a matriceiL
, începând de la rândulj+1
până la finalul matricei.
- M-am folosit de algoritmul prezentat în PDF-ul temei.
- Bucla continuă până se atinge numărul de linii din matricea
X
. - Calculez un auxiliar aplicând
f
la vectorulx
(x mic) și liniai
din matriceaX
. - Actualizez
pred
adăugând produsul dintrea(i)
șiaux
.
- Aplic formula din enunț.
- Inițializez matricea de retur cu matricea unitate.
- Actualizez linia
i
al matriceiP
prin scăderea produsului dintre liniaj
al matriceiP
și elementulL(i, j)
. - Apoi împart linia
i
al matriceiP
la elementul de pe diagonala principală (i, i
) al matriceiL
. P
este inversa matricei inferioareL
.- Algoritmul funcționează dacă
L(i,i) != 0
.
- Adun matricea
K
cu matricea unitate înmulțită culambda
, iar rezultatul îl stochez înaux
. - Apelez funcția
cholesky
implementată pentru acestaux
. - Rezolv sistemul de ecuații liniare
aux * a = y
. L \ y
rezolvă sistemul de ecuații liniareL * z = y
. Acesta este echivalent cuinv(L) * y
.L' \ (L \ y)
rezolvă sistemul de ecuații liniareL' * a = z
, undez
este rezultatul calculat anterior.
a0
este un vector de 0 de dimensiunea luiK
.- Am aplicat metoda gradientului conjugat pentru a rezolva sistemul de ecuații
((K + lambda * I) * a = y)
, începând cu vectorul inițiala0
și continuând până când diferența dintre două iterații consecutive este < 1e-7 (precizie mare) sau numărul de iterații depășește 10000.
X_train
șiy_train
conțin primelek
linii dinX
șiy
.X_pred
șiy_pred
conțin restul liniilor dinX
șiy
.
- Funcția parcurge șirul
A
de la început până lalength(A) - k
, generând un subșiraux
de lungimek
pentru fiecare poziție. - Apoi, fiecare subșir
aux
este transformat într-un șir cu elementele separate de un spațiu folosind funcțiastrjoin
. - Transpun
B
pentru a obține linii de șiruri.
- Parcurge fiecare element din
distinct_k_sec
. Dacă elementul este deja în dicționar, adaugă indexul curent la lista de valori pentru acea cheie. - Dacă elementul nu este încă în dicționar, adaugă indexul curent ca valoare pentru acel element.
- Pune fiecare cuvânt unic din
distinct_wds
în dicționar la un index unic.
- convertesc cuvintele si secvențele de cuvinte în seturi unice pentru a accelera accesul la date.
- prealoc matricea de rezultate
retval
cu zerouri. - calculez frecvențele de apariție a fiecărui cuvânt care urmează
după o secvență de cuvinte de
lungime k
. Frecvențele sunt actualizate în matricea retval.