Esempio n. 1
0
# MODEL 3
par_na = np.ones((r,r)) * 2
par_nb = np.ones((r,m)) * 2
# in data > roll rows 1 up and duplicate last row
U = np.roll(U,-1,axis=0)
U[:][-1] = U[:][-2]
mdl3 = lspv(U,Y,par_na,par_nb)
Ym3 = lspv_apl(U,Y,mdl3,par_na,par_nb)

# MODEL 4
# replaces all negative values with 0
Ym4 = Ym3.clip(min=0)

n = int(max( (par_na.max(),par_nb.max())))

vaf_model_1 = vaf( Y[n:][:], Ym1)
vaf_model_2 = vaf( Y[(n):][:], Ym2)
vaf_model_3 = vaf( Y[(n):][:], Ym3)
vaf_model_4 = vaf( Y[(n):][:], Ym4)

# moje da se oformi tablica s matplotlib
print ('VAF MODEL 1')
for item in vaf_model_1:
    print ("--",item.round(3),"--",end='\n')
    
print ('\nVAF MODEL 2')
for item in vaf_model_2:
    print ("--",item.round(3),"--",end='\n')
    
print ('\nVAF MODEL 3')
for item in vaf_model_3:
Esempio n. 2
0
# MODEL 2
opt_maxiter = 50
opt_taux = 10**(-6)
opt_tauf = 10**(-6)
opt_dsp = 0

# the list contains the matrix E and a vector Pm
elspm_list = elspm(U, Y, par_na, par_nb, par_nc)
E = elspm_list[0]
Pm = mdl2 = elspm_list[1]
Ym2 = elspm_apl(U, Y, Pm, par_na, par_nb, par_nc, E)

n = int(max((par_na, par_nb, par_nc)))

vaf_model_1 = vaf(Y[n:][:], Ym1)
print('VAF MODEL 1')
for item in vaf_model_1:
    print("--", item.round(3), "--", end='\n')

vaf_model_2 = vaf(Y[n:][:], Ym2)
print('VAF MODEL 2')
for item in vaf_model_2:
    print("--", item.round(3), "--", end='\n')

# plot Y vs Y from Models

for col in range(0, Y.shape[1]):
    title = str('Product ' + str(col + 1))

    plt.figure(col)
Esempio n. 3
0
def roblspm(
        U,Y,par_na,par_nb, 
        opt_dvaf = 10**(-2), 
        opt_max_iter = 100, 
        opt_hst = 0):
    
    import numpy as np
    from dmpm import dmpm
    from vaf import vaf
    from pm2v import pm2v
    
    r = (Y.shape)[1]
    m = (U.shape)[1]
    na = par_na
    nb = par_nb
    n = max(na,nb)    
    
    # DATA MATRIX CREATION
    F = dmpm(U,Y,na,nb)
    # CODE IN MATLAB
    # Y = Y(n + 1:end, :);
    Y = Y[n:,:]
    # CODE IN MATLAB
    # Pm = (F'*F)^-1*F'*Y;
    # FIRST
    # (F'*F)
    F_transposed = F.transpose()
    first = np.dot(F_transposed,F)
    # SECOND
    # (F'*F)^-1
    second = np.linalg.inv(first)
    # THIRD
    # F'*Y
    third = np.dot(F_transposed,Y)
    # FOURTH
    # (F'*F)^-1*F'*Y;
    fourth = np.dot(second,third)
    Pm = fourth
    
    # CODE IN MATLAB
    # Ym = F*Pm;
    Ym = np.dot(F,Pm)
    
    vafw = vaf(Y,Ym)
    vaf0 = vafw
    
    
    # NEW VARIABLES
    
    if opt_hst:
        VAFw = vafw
        VAFw = VAFw.reshape(-1,1)
        VAF = vaf0
        VAF = VAF.reshape(-1,1)
        PM = pm2v(Pm,par_na,par_nb)
        PM = PM.reshape(-1,1)
        YM = Ym.flatten()
        YM = YM.reshape(-1,1)
        
    # -------------------------------------------------------------------    
    # START OF ITERATION LOOP
    iter = 0
    iterate = True
    
    while iterate:
        iter += 1
        
        # ----------------------------------------------------------------
        # CODE IN MATLAB
        # ww = min(1, max(1e-8, abs(Y - Ym).^-1));
        # abs(y - ym).^-1
        first = np.absolute(np.subtract(Y,Ym))
        first = np.power(first,(-1))
        # max(1e-8, first) 
        second = np.clip(first, a_min = 10**(-8), a_max = np.max(first))
        # min(1,second)
        third = np.clip(second, a_min = np.min(first), a_max = 1)
        ww = third
        # ----------------------------------------------------------------
        for i in range(0,r):
            # Wi = repmat(ww(:, i), 1, r*na + m*nb);
            vctr = ww[:,i]
            Wi = np.tile(vctr,((r*na + m*nb),1)).transpose()
            # Pm(:, i) = (F'*(Wi.*F))^-1*F'*(ww(:, i).*Y(:, i));
            # first = (F'*(Wi.*F))^-1
            first_1 = F.transpose()
            first_2 = np.multiply(Wi,F)
            first_3 = np.dot(first_1,first_2)
            first_4 = np.linalg.inv(first_3)
            first = first_4
            # second = F'
            second = F.transpose()
            # third = (ww(:, i).*Y(:, i))
            third_1 = ww[:,i]
            third_2 = Y[:,i]
            third = np.multiply(third_1,third_2)
            # forming Pm
            Pm_1 = np.dot(first,second)
            Pm_2 = np.dot(Pm_1,third)
            Pm_final = Pm_2
            Pm[:,i] = Pm_final
            
        Ym = np.dot(F,Pm)
        vafw_1 = vafw
        vafw = vaf(Y,Ym,ww)
        vaf0 = vaf(Y,Ym)
        
        
        if opt_hst :
            # appending values to arrays
            to_append = pm2v(Pm,par_na,par_nb).reshape(-1,1)
            PM = np.append(PM,to_append,axis = 1)
            
            vafw = vafw.reshape(-1,1)
            VAFw = np.append(VAFw,vafw,axis = 1)
            
            vaf0 = vaf0.reshape(-1,1)
            VAF = np.append(VAF,vaf0,axis = 1)
            
            to_append = Ym.transpose().flatten('F').reshape(-1,1)
            YM = np.append(YM,to_append,axis = 1)
            
        # CHECK FOR END CONDITION
        # CODE IN MATLAB
        # if any(abs(vafw - vafw_1)) <= dvaf || iter >= maxIter, 
        if iter >= opt_max_iter:
            iterate = False
        else:
            # creating abs(vafw - vafw_1)
            vafw_differences = abs(np.subtract(vafw,vafw_1))
            for row in vafw_differences:
                for item in row:
                    if item <= opt_dvaf:
                        iterate = False
    
    print("The function [roblspm.py] took",iter,"iterations to reach the end condition.")
                    
    # CREATE RETURN LIST
    return_list = [PM,VAFw,VAF,YM,Pm]
    
    return return_list
Esempio n. 4
0
mdl = lspv(U, Y, par_na, par_nb)
Ym1 = lspv_apl(U, Y, mdl, par_na, par_nb)

# MODEL 1 ROB LS
# roblspv returns a list of NumPy arrays which are later unpacked
model_list = roblspv(U, Y, par_na, par_nb, opt_dvaf, opt_max_iter, opt_hst)
# return_list = [PM,VAFw,VAF,YM,pm]
mdl_PM = model_list[0]
mdl_VAFW = model_list[1]
mdl_VAF = model_list[2]
mdl_YM = model_list[3]
mdl_pm = model_list[4]

Ym2 = lspv_apl(U, Y, mdl_pm, par_na, par_nb)

vaf_model_1 = vaf(Y[a + n:][:], Ym1[a:][:])
print('VAF MODEL 1')
for item in vaf_model_1:
    print("--", item.round(3), "--", end='\n')

test_1 = Y[a + n:][:]
test_2 = Ym2[a:][:]

vaf_model_2 = vaf(Y[a + n:][:], Ym2[a:][:])
print('VAF MODEL 2')
for item in vaf_model_2:
    print("--", item.round(3), "--", end='\n')

    # ADDITIONAL PLOT
    #plt.figure()
Esempio n. 5
0
def roblspv(U,
            Y,
            par_na,
            par_nb,
            opt_dvaf=10**(-2),
            opt_max_iter=100,
            opt_hst=0):

    import numpy as np
    from numpy import linalg
    from dmpv import dmpv
    from vaf import vaf
    from dv2dm import dv2dm

    r = (Y.shape)[1]
    na = par_na
    nb = par_nb
    n = max(int(np.max(par_na)), int(np.max(par_nb)))

    # DATA MATRIX CREATION
    F = dmpv(U, Y, par_na, par_nb)

    # CODE IN MATLAB
    # pm = (F'*F)^-1 * F' * vec( Y(n + 1:end, :)');
    # first (F'*F)^-1
    first = np.dot(F.transpose(), F)
    first = np.linalg.inv(first)
    # second F'
    second = F.transpose()
    # third vec( Y(n + 1:end, :)')
    y = Y[(n):][:]
    y = y.transpose()
    y = y.flatten('F')
    y = y.reshape(-1, 1)

    pm = np.dot(first, second)
    pm = np.dot(pm, y)

    ym = np.dot(F, pm)

    first = dv2dm(y, r)
    second = dv2dm(ym, r)

    vafw = vaf(first, second)
    vaf0 = vafw

    # NEW VARIABLES

    if opt_hst:
        VAFw = vafw
        VAFw = VAFw.reshape(-1, 1)
        VAF = vaf0
        VAF = VAF.reshape(-1, 1)
        PM = pm
        PM = PM.reshape(-1, 1)
        YM = ym
        YM = YM.reshape(-1, 1)
    # -------------------------------------------------------------------
    # START OF ITERATION LOOP
    iter = 0
    iterate = True

    while iterate:
        print("THIS IS ITERATION", iter + 1)
        iter += 1

        # ----------------------------------------------------------------
        # CODE IN MATLAB
        # w = min(1, max(1e-8, abs(y - ym).^-1));
        # abs(y - ym).^-1
        first = np.absolute(np.subtract(y, ym))
        first = np.power(first, (-1))
        # max(1e-8, first)
        second = np.clip(first, a_min=10**(-8), a_max=np.max(first))
        # min(1,second)
        third = np.clip(second, a_min=np.min(first), a_max=1)
        w = third
        # ----------------------------------------------------------------
        # CODE IN MATLAB
        # ww = repmatc(w, size(F, 2));
        ww = np.broadcast_to(w, shape=(2176, F.shape[1]))
        # ----------------------------------------------------------------
        # CODE IN MATLAB
        # pm = (F'*(ww.*F))^-1*(ww.*F)'*y;
        # (F'*(ww.*F))^-1
        first = F.transpose()
        second = np.multiply(ww, F)
        third = np.dot(first, second)
        fourth = np.linalg.inv(third)
        # (ww.*F)'*y
        first = np.multiply(ww, F).transpose()
        second = np.dot(first, y)
        pm = np.dot(fourth, second)
        pm = pm.reshape(-1, 1)
        # ----------------------------------------------------------------
        # CODE IN MATLAB
        # ym = F*pm;
        ym = np.dot(F, pm)
        ym = ym.reshape(-1, 1)

        vafw_1 = vafw

        # CODE IN MATLAB
        # vafw = vaf(dv2dm(y, r), dv2dm(ym, r), dv2dm(w, r));
        # vafw = vaf(Y          , Ym          , w          );
        vaf_arg_1 = dv2dm(y, r)
        vaf_arg_2 = dv2dm(ym, r)
        vaf_arg_3 = dv2dm(w, r)
        # vaf_weights FUNCTION NEEDED
        vafw = vaf(vaf_arg_1, vaf_arg_2, vaf_arg_3)
        vafw = vafw.reshape(-1, 1)

        # CODE IN MATLAB
        # vaf0 = vaf(dv2dm(y, r), dv2dm(ym, r));
        vaf0 = vaf(vaf_arg_1, vaf_arg_2)
        vaf0 = vaf0.reshape(-1, 1)

        if opt_hst:
            # appending values to arrays
            PM = np.append(PM, pm, axis=1)
            VAFw = np.append(VAFw, vafw, axis=1)
            VAF = np.append(VAF, vaf0, axis=1)
            YM = np.append(YM, ym, axis=1)

        # CHECK FOR END CONDITION
        # CODE IN MATLAB
        # if any(abs(vafw - vafw_1)) <= dvaf || iter >= maxIter,
        if iter >= opt_max_iter:
            iterate = False
        else:
            # creating abs(vafw - vafw_1)
            vafw_differences = abs(np.subtract(vafw, vafw_1))
            for row in vafw_differences:
                for item in row:
                    if item <= opt_dvaf:
                        iterate = False

    # CREATE RETURN LIST
    return_list = [PM, VAFw, VAF, YM, pm]

    return return_list