# 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:
# 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)
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
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()
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