annotate toolboxes/FullBNT-1.0.7/KPMstats/weightedRegression.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 function [a, b, error] = weightedRegression(x, z, w)
Daniel@0 2 % [a , b, error] = fitRegression(x, z, w);
Daniel@0 3 % % Weighted scalar linear regression
Daniel@0 4 %
Daniel@0 5 % Find a,b to minimize
Daniel@0 6 % error = sum(w * |z - (a*x + b)|^2)
Daniel@0 7 % and x(i) is a scalar
Daniel@0 8
Daniel@0 9 if nargin < 3, w = ones(1,length(x)); end
Daniel@0 10
Daniel@0 11 w = w(:)';
Daniel@0 12 x = x(:)';
Daniel@0 13 z = z(:)';
Daniel@0 14
Daniel@0 15 W = sum(w);
Daniel@0 16 Y = sum(w .* z);
Daniel@0 17 YY = sum(w .* z .* z);
Daniel@0 18 YTY = sum(w .* z .* z);
Daniel@0 19 X = sum(w .* x);
Daniel@0 20 XX = sum(w .* x .* x);
Daniel@0 21 XY = sum(w .* x .* z);
Daniel@0 22
Daniel@0 23 [b, a] = clg_Mstep_simple(W, Y, YY, YTY, X, XX, XY);
Daniel@0 24 error = sum(w .* (z - (a*x + b)).^2 );
Daniel@0 25
Daniel@0 26 if 0
Daniel@0 27 % demo
Daniel@0 28 seed = 1;
Daniel@0 29 rand('state', seed); randn('state', seed);
Daniel@0 30 x = -10:10;
Daniel@0 31 N = length(x);
Daniel@0 32 noise = randn(1,N);
Daniel@0 33 aTrue = rand(1,1);
Daniel@0 34 bTrue = rand(1,1);
Daniel@0 35 z = aTrue*x + bTrue + noise;
Daniel@0 36
Daniel@0 37 w = ones(1,N);
Daniel@0 38 [a, b, err] = weightedRegression(x, z, w);
Daniel@0 39
Daniel@0 40 b2=regress(z(:), [x(:) ones(N,1)]);
Daniel@0 41 assert(approxeq(b,b2(2)))
Daniel@0 42 assert(approxeq(a,b2(1)))
Daniel@0 43
Daniel@0 44 % Make sure we go through x(15) perfectly
Daniel@0 45 w(15) = 1000;
Daniel@0 46 [aW, bW, errW] = weightedRegression(x, z, w);
Daniel@0 47
Daniel@0 48 figure;
Daniel@0 49 plot(x, z, 'ro')
Daniel@0 50 hold on
Daniel@0 51 plot(x, a*x+b, 'bx-')
Daniel@0 52 plot(x, aW*x+bW, 'gs-')
Daniel@0 53 title(sprintf('a=%5.2f, aHat=%5.2f, aWHat=%5.3f, b=%5.2f, bHat=%5.2f, bWHat=%5.3f, err=%5.3f, errW=%5.3f', ...
Daniel@0 54 aTrue, a, aW, bTrue, b, bW, err, errW))
Daniel@0 55 legend('truth', 'ls', 'wls')
Daniel@0 56
Daniel@0 57 end
Daniel@0 58