Home > bml > utils > bml_varavgref_coef.m

bml_varavgref_coef

PURPOSE ^

BML_VARAVGREF_COEF calculates the crosstalk coefficients between electrodes

SYNOPSIS ^

function [coef, fitted_COV] = bml_varavgref_coef(COV)

DESCRIPTION ^

 BML_VARAVGREF_COEF calculates the crosstalk coefficients between electrodes

 Use as
   [coef, fitted_COV] = bml_varavgref_coef(COV)

 Calculates crosstal coefficients as defined by electrical crosstalk model

 Arguments
 COV - variance-covariance matrix between channels

 Returns
 coef - vector of crosstalk coefficients 0 <= coef <= 1
 fitted_COV - fitted variance-covariance matrix

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function [coef, fitted_COV] = bml_varavgref_coef(COV)
0002 
0003 % BML_VARAVGREF_COEF calculates the crosstalk coefficients between electrodes
0004 %
0005 % Use as
0006 %   [coef, fitted_COV] = bml_varavgref_coef(COV)
0007 %
0008 % Calculates crosstal coefficients as defined by electrical crosstalk model
0009 %
0010 % Arguments
0011 % COV - variance-covariance matrix between channels
0012 %
0013 % Returns
0014 % coef - vector of crosstalk coefficients 0 <= coef <= 1
0015 % fitted_COV - fitted variance-covariance matrix
0016 
0017 
0018 assert(isnumeric(COV));
0019 assert(size(COV,1)==size(COV,2));
0020 
0021 n = size(COV,1);
0022 
0023   %calculate model values from crosstalk parameters
0024   function [V0V0,sigma2_S,VkVj,c] = varavgref_model(p)
0025     
0026     %p=zeros(1,n)
0027     VkVj=diag(diag(COV)); % matrix of predicted variances-covariances
0028     sigma2_S = zeros(1,n); %initializing singal variance
0029     c = exp(p)./(exp(p)+1); % vector of crosstalk coefficients
0030     sum_c = sum(c);
0031     
0032     %calculating V0 variance
0033     V0V0=0; 
0034     for l=1:n
0035       for j=1:n
0036         V0V0 = V0V0 + exp(p(l)+p(j))*COV(l,j);
0037       end
0038     end
0039     V0V0 = V0V0*(sum(exp(p))^(-2));
0040     
0041     %calculating signal variances sigma2_S
0042     for k=1:n
0043       sigma2_S(k) = (COV(k,k)-(c(k)^2)*V0V0)/(((1-c(k))^2)+2*(c(k)^2)*(1-c(k))/sum_c);
0044     end
0045     
0046     %completing predicted variance-covariance matrix
0047     for k=1:(n-1)
0048       for j=(k+1):n
0049         VkVj(k,j)= c(k)*c(j)*( (1-c(k))*sigma2_S(k)/sum_c + (1-c(j))*sigma2_S(j)/sum_c + V0V0);
0050         VkVj(j,k)=VkVj(k,j);
0051       end
0052     end    
0053   end
0054 
0055   % optimization routine
0056   p = zeros(1,n); 
0057   [f_V0V0,f_sigma2_S,f_VkVj,f_c] = varavgref_model(p);
0058   
0059   %first guess based on solving approximated cuadratic expression
0060   p1 = zeros(1,n);
0061   for i=1:n
0062     a_= -f_sigma2_S(i);
0063     b_= f_sigma2_S(i); 
0064     b_= b_ + (sum(f_c .* (1-f_c) .* f_sigma2_S)-f_c(i)*(1-f_c(i))*f_sigma2_S(i))/sum(f_c);
0065     b_= b_ + f_V0V0*sum(f_c);
0066     c_= -sum(COV(i,:))+COV(i,i);
0067    
0068     d_ = b_^2-4*a_*c_;
0069     if d_ >= 0
0070       c_k1=(-b_ + sqrt(d_))/(2*a_);
0071       c_k2=(-b_ - sqrt(d_))/(2*a_);
0072       if 0<=c_k1 && c_k1<=1
0073         c_k=c_k1;
0074       elseif 0<=c_k2 && c_k2<=1
0075         c_k=c_k2;    
0076       else
0077         c_k=(-b_/(2*a_));  
0078       end
0079     else
0080       c_k=(-b_/(2*a_));      
0081     end
0082     
0083     if c_k <=0 
0084       p1(i) = -10;
0085     elseif c_k >= 1
0086       p1(i) = 10;
0087     else
0088       p1(i) = log(abs(c_k/(1-c_k)));
0089     end
0090   end
0091   
0092     %cost function
0093   function [cost, grad] = costfun(p)
0094     [~,~,VkVj,c] = varavgref_model(p);
0095     
0096     %calculating cost in variance metric
0097     cost=0;
0098     for k=1:n
0099       for j=1:n
0100         cost = cost + (VkVj(k,j)-COV(k,j))^2;
0101       end
0102     end
0103     cost = cost / sum(sum(COV.^2));       
0104     
0105     %ridge regression on crosstalk coefficients
0106     cost = cost + (1e-3)*sum(c.^2);
0107   end
0108   
0109   %optimizing from first guess
0110     p=fminunc(@costfun,p1,optimoptions('fminunc','MaxFunctionEvaluations',1e6,'OptimalityTolerance',1e-6));  
0111 
0112 %   p=p1;
0113 %
0114 %   %cost function
0115 %   function [cost, grad] = costfun2(p)
0116 %     [~,~,VkVj,~] = varavgref_model(p);
0117 %
0118 %     %calculating cost in correlation metric
0119 %
0120 %     %Transformin VkVj to positive semi definte
0121 %     VkVj(ismissing(VkVj))=0;
0122 %     [V,D] = eig(VkVj);
0123 %     D(D<0)=0;
0124 %     psd_VkVj = real(V*D/(V));
0125 %     cor_VkVj = corrcov(psd_VkVj);
0126 %     cor_COV = corrcov(COV);
0127 %
0128 %     cost=0;
0129 %     for k=1:n
0130 %       for j=1:n
0131 %         cost = cost + (cor_VkVj(k,j)-cor_COV(k,j))^2;
0132 %         %cost = cost + (clip_inv_sigmoid(cor_VkVj(k,j))-clip_inv_sigmoid(cor_COV(k,j)))^2;
0133 %       end
0134 %     end
0135 %     %cost = cost / sum(sum(COV.^2));
0136 %   end
0137 %
0138 %     p=fminunc(@costfun2,p,optimoptions('fminunc','MaxFunctionEvaluations',1e9,'OptimalityTolerance',1e-9));
0139 %
0140 %     function x = clip_inv_sigmoid(y)
0141 %     if y > 0.999954602131298 % exp(10)/(exp(10)+1)
0142 %       x = 10;
0143 %     elseif y < 4.539786870243439e-05 % exp(-10)/(exp(-10)+1)
0144 %       x = -10;
0145 %     else
0146 %       x = log(y/(1-y));
0147 %     end
0148 %   end
0149 %
0150 %     %cost function
0151 %   function [cost, grad] = costfun3(p)
0152 %     [~,~,VkVj,~] = varavgref_model(p);
0153 %
0154 %     %calculating cost in correlation metric
0155 %
0156 %     %Transformin VkVj to positive semi definte
0157 %     VkVj(ismissing(VkVj))=0;
0158 %     [V,D] = eig(VkVj);
0159 %     D(D<0)=0;
0160 %     psd_VkVj = real(V*D/(V));
0161 %     cor_VkVj = corrcov(psd_VkVj);
0162 %     cor_COV = corrcov(COV);
0163 %
0164 %     cost=0;
0165 %     for k=1:n
0166 %       for j=1:n
0167 %         %cost = cost + (cor_VkVj(k,j)-cor_COV(k,j))^2;
0168 %         cost = cost + (clip_inv_sigmoid(cor_VkVj(k,j))-clip_inv_sigmoid(cor_COV(k,j)))^2;
0169 %       end
0170 %     end
0171 %     %cost = cost / sum(sum(COV.^2));
0172 %   end
0173 %
0174 %     p=fminunc(@costfun3,p,optimoptions('fminunc','MaxFunctionEvaluations',1e9,'OptimalityTolerance',1e-9));
0175 
0176 
0177   [~,~,fitted_COV,coef] = varavgref_model(p);
0178   %bounding coefficients
0179   for i=1:n
0180     if coef(i) > 0.999
0181       coef(i) = 0.999;
0182     end
0183   end
0184   
0185 %   figure
0186 %   pcolor(fitted_COV)
0187 %   figure
0188 %     pcolor(COV)
0189 
0190 end

Generated on Tue 25-Sep-2018 10:08:19 by m2html © 2005