Mercurial > hg > camir-aes2014
diff toolboxes/FullBNT-1.0.7/KPMstats/weightedRegression.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/FullBNT-1.0.7/KPMstats/weightedRegression.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,58 @@ +function [a, b, error] = weightedRegression(x, z, w) +% [a , b, error] = fitRegression(x, z, w); +% % Weighted scalar linear regression +% +% Find a,b to minimize +% error = sum(w * |z - (a*x + b)|^2) +% and x(i) is a scalar + +if nargin < 3, w = ones(1,length(x)); end + +w = w(:)'; +x = x(:)'; +z = z(:)'; + +W = sum(w); +Y = sum(w .* z); +YY = sum(w .* z .* z); +YTY = sum(w .* z .* z); +X = sum(w .* x); +XX = sum(w .* x .* x); +XY = sum(w .* x .* z); + +[b, a] = clg_Mstep_simple(W, Y, YY, YTY, X, XX, XY); +error = sum(w .* (z - (a*x + b)).^2 ); + +if 0 + % demo + seed = 1; + rand('state', seed); randn('state', seed); + x = -10:10; + N = length(x); + noise = randn(1,N); + aTrue = rand(1,1); + bTrue = rand(1,1); + z = aTrue*x + bTrue + noise; + + w = ones(1,N); + [a, b, err] = weightedRegression(x, z, w); + + b2=regress(z(:), [x(:) ones(N,1)]); + assert(approxeq(b,b2(2))) + assert(approxeq(a,b2(1))) + + % Make sure we go through x(15) perfectly + w(15) = 1000; + [aW, bW, errW] = weightedRegression(x, z, w); + + figure; + plot(x, z, 'ro') + hold on + plot(x, a*x+b, 'bx-') + plot(x, aW*x+bW, 'gs-') + 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', ... + aTrue, a, aW, bTrue, b, bW, err, errW)) + legend('truth', 'ls', 'wls') + +end +