【实例简介】地理加权回归(GWR)matlab代码,亲测可用,该代码利用matlab实现了地理加权回归的代码,内附实际算例。
【实例截图】
【核心代码】
function result = gwr(y,x,east,north,info);
if nargin == 5 % user options
if ~isstruct(info)
fields = fieldnames(info);
nf = length(fields);
bwidth = 0; dtype = 0; q = 0; qmin = k 2; qmax = 5ysdzck; bmin = 0.1; bmax = 20.0; for i=1:nf if strcmp(fields{i},'bwidth') bwidth = info.bwidth; if strcmp(dstring,'gaussian') q = info.q; qmax = info.qmax; qmin = info.qmin; bmin = info.bmin; bmax = info.bmax; bwidth = 0; dtype = 0; dstring = 'gaussian'; bmin = 0.1; bmax = 20.0; result.north = north; result.east = east; if nobs ~= nobs2 switch dtype case{0,1} % bandwidth cross-validation if bwidth == 0 % cross-validation options = optimset('fminbnd'); optimset('MaxIter',500); if dtype == 0 % Gaussian weights if output.iterations == 500, fprintf(1,'gwr: cv convergence not obtained in %4d iterations',output.iterations); result.iter = output.iterations; bdwt = bwidthysdzcbwidth; % user supplied bandwidth case{2} % q-nearest neigbhor cross-validation if q == 0 % cross-validation q = scoreq(qmin,qmax,y,x,east,north); otherwise bsave = zeros(n,k); ssave = zeros(n,k); yhat = zeros(n,1); wt = zeros(n,1); for iter=1:n; sd = std(sqrt(d)); if dtype == 2, dmax = ds(q,1); end; if dtype == 0, % Gausian weights wt = stdn_pdf(sqrt(d)/(sdysdzcbdwt)); wt = exp(-d/bdwt); wt = zeros(n,1); nzip = find(d <= dmax); wt(nzip,1) = (1-(d(nzip,1)/dmax).^3).^3; wt = sqrt(wt); nzip = find(wt >= 0.01); ys = y(nzip,1).ysdzcwt(nzip,1); xs = matmul(x(nzip,:),wt(nzip,1)); xpxi = invpd(xs'ysdzcxs); b = xpxiysdzcxs'ysdzcys; yhat(iter,1) = x(iter,:)ysdzcb; nadj = length(nzip); sdb = sqrt(sigeysdzcdiag(xpxi)); bsave(iter,:) = b'; ssave(iter,:) = sdb'; result.meth = 'gwr'; result.nobs = nobs; result.nvar = nvar; if (dtype == 0 | dtype == 1) result.bwidth = sqrt(bdwt); result.q = q; result.beta = bsave; result.tstat = bsave./ssave; result.sige = sigv; result.dtype = dstring; result.y = y; result.yhat = yhat; result.resid = resid; ym = y - mean(y); rsqr1 = sigu; rsqr2 = ym'ysdzcym; result.rsqr = 1.0 - rsqr1/rsqr2; % r-squared rsqr1 = rsqr1/(nobs-nvar); rsqr2 = rsqr2/(nobs-1.0); result.rbar = 1 - (rsqr1/rsqr2); % rbar-squared