2 lines
6.9 KiB
JavaScript
2 lines
6.9 KiB
JavaScript
/* 2020-9-22 15:23:19 | 版权所有 军懋国兴 */
|
|
Array.prototype.max=function(){return Math.max.apply(null,this)},Array.prototype.min=function(){return Math.min.apply(null,this)},Array.prototype.mean=function(){for(var r=0,i=0;r<this.length;r++)i+=this[r];return i/this.length},Array.prototype.rep=function(r){return Array.apply(null,new Array(r)).map(Number.prototype.valueOf,this[0])},Array.prototype.pip=function(r,i){for(var t=!1,a=0,n=this.length-1;a<this.length;n=a++)this[a][1]>i!=this[n][1]>i&&r<(this[n][0]-this[a][0])*(i-this[a][1])/(this[n][1]-this[a][1])+this[a][0]&&(t=!t);return t};var kriging=function(){var x={};return kriging_matrix_diag=function(r,i){for(var t=[0].rep(i*i),a=0;a<i;a++)t[a*i+a]=r;return t},kriging_matrix_transpose=function(r,i,t){for(var a,n=Array(t*i),o=0;o<i;o++)for(a=0;a<t;a++)n[a*i+o]=r[o*t+a];return n},kriging_matrix_scale=function(r,i,t,a){for(var n,o=0;o<t;o++)for(n=0;n<a;n++)r[o*a+n]*=i},kriging_matrix_add=function(r,i,t,a){for(var n,o=Array(t*a),e=0;e<t;e++)for(n=0;n<a;n++)o[e*a+n]=r[e*a+n]+i[e*a+n];return o},kriging_matrix_multiply=function(r,i,t,a,n){for(var o,e,g=Array(t*n),l=0;l<t;l++)for(o=0;o<n;o++)for(e=g[l*n+o]=0;e<a;e++)g[l*n+o]+=r[l*a+e]*i[e*n+o];return g},kriging_matrix_chol=function(r,i){for(var t,a,n=Array(i),o=0;o<i;o++)n[o]=r[o*i+o];for(o=0;o<i;o++){for(t=0;t<o;t++)n[o]-=r[o*i+t]*r[o*i+t];if(n[o]<=0)return!1;for(n[o]=Math.sqrt(n[o]),t=o+1;t<i;t++){for(a=0;a<o;a++)r[t*i+o]-=r[t*i+a]*r[o*i+a];r[t*i+o]/=n[o]}}for(o=0;o<i;o++)r[o*i+o]=n[o];return!0},kriging_matrix_chol2inv=function(r,i){for(var t,a,n,o=0;o<i;o++)for(r[o*i+o]=1/r[o*i+o],t=o+1;t<i;t++){for(n=0,a=o;a<t;a++)n-=r[t*i+a]*r[a*i+o];r[t*i+o]=n/r[t*i+t]}for(o=0;o<i;o++)for(t=o+1;t<i;t++)r[o*i+t]=0;for(o=0;o<i;o++){for(r[o*i+o]*=r[o*i+o],a=o+1;a<i;a++)r[o*i+o]+=r[a*i+o]*r[a*i+o];for(t=o+1;t<i;t++)for(a=t;a<i;a++)r[o*i+t]+=r[a*i+o]*r[a*i+t]}for(o=0;o<i;o++)for(t=0;t<o;t++)r[o*i+t]=r[t*i+o]},kriging_matrix_solve=function(r,i){for(var t,a,n,o,e,g,l,f,h,u,p=i,m=Array(i*i),_=Array(i),s=Array(i),c=Array(i),y=0;y<i;y++)for(n=0;n<i;n++)m[y*i+n]=y==n?1:0;for(n=0;n<i;n++)c[n]=0;for(y=0;y<i;y++){for(n=l=0;n<i;n++)if(1!=c[n])for(o=0;o<i;o++)0==c[o]&&Math.abs(r[n*i+o])>=l&&(l=Math.abs(r[n*i+o]),a=n,t=o);if(++c[t],a!=t){for(e=0;e<i;e++)u=r[a*i+e],r[a*i+e]=r[t*i+e],r[t*i+e]=u;for(e=0;e<p;e++)u=m[a*i+e],m[a*i+e]=m[t*i+e],m[t*i+e]=u}if(s[y]=a,0==r[(_[y]=t)*i+t])return!1;for(h=1/r[t*i+t],r[t*i+t]=1,e=0;e<i;e++)r[t*i+e]*=h;for(e=0;e<p;e++)m[t*i+e]*=h;for(g=0;g<i;g++)if(g!=t){for(f=r[g*i+t],e=r[g*i+t]=0;e<i;e++)r[g*i+e]-=r[t*i+e]*f;for(e=0;e<p;e++)m[g*i+e]-=m[t*i+e]*f}}for(e=i-1;0<=e;e--)if(s[e]!=_[e])for(o=0;o<i;o++)u=r[o*i+s[e]],r[o*i+s[e]]=r[o*i+_[e]],r[o*i+_[e]]=u;return!0},kriging_variogram_gaussian=function(r,i,t,a,n){return i+(a-i)/t*(1-Math.exp(-1/n*Math.pow(r/t,2)))},kriging_variogram_exponential=function(r,i,t,a,n){return i+(a-i)/t*(1-Math.exp(-1/n*(r/t)))},kriging_variogram_spherical=function(r,i,t,a){return t<r?i+(a-i)/t:i+(a-i)/t*(r/t*1.5-.5*Math.pow(r/t,3))},x.train=function(r,i,t,a,n,o){var e={t:r,x:i,y:t,nugget:0,range:0,sill:0,A:1/3,n:0};switch(a){case"gaussian":e.model=kriging_variogram_gaussian;break;case"exponential":e.model=kriging_variogram_exponential;break;case"spherical":e.model=kriging_variogram_spherical}for(var g,l,f=r.length,h=Array((f*f-f)/2),u=0,p=0;u<f;u++)for(g=0;g<u;g++,p++)h[p]=Array(2),h[p][0]=Math.pow(Math.pow(i[u]-i[g],2)+Math.pow(t[u]-t[g],2),.5),h[p][1]=Math.abs(r[u]-r[g]);h.sort(function(r,i){return r[0]-i[0]}),e.range=h[(f*f-f)/2-1][0];var m=30<(f*f-f)/2?30:(f*f-f)/2,_=e.range/m,s=[0].rep(m),c=[0].rep(m);if(m<30)for(l=0;l<m;l++)s[l]=h[l][0],c[l]=h[l][1];else{for(l=p=g=u=0;u<m&&g<(f*f-f)/2;u++,p=0){for(;h[g][0]<=(u+1)*_&&(s[l]+=h[g][0],c[l]+=h[g][1],p++,!((f*f-f)/2<=++g)););0<p&&(s[l]/=p,c[l]/=p,l++)}if(l<2)return e}f=l,e.range=s[f-1]-s[0];var y=[1].rep(2*f),x=Array(f),v=e.A;for(u=0;u<f;u++){switch(a){case"gaussian":y[2*u+1]=1-Math.exp(-1/v*Math.pow(s[u]/e.range,2));break;case"exponential":y[2*u+1]=1-Math.exp(-1/v*s[u]/e.range);break;case"spherical":y[2*u+1]=s[u]/e.range*1.5-.5*Math.pow(s[u]/e.range,3)}x[u]=c[u]}var M=kriging_matrix_transpose(y,f,2),k=kriging_matrix_multiply(M,y,2,f,2),A=(k=kriging_matrix_add(k,kriging_matrix_diag(1/o,2),2,2)).slice(0);kriging_matrix_chol(k,2)?kriging_matrix_chol2inv(k,2):(kriging_matrix_solve(A,2),k=A);var d=kriging_matrix_multiply(kriging_matrix_multiply(k,M,2,2,f),x,2,f,1);e.nugget=d[0],e.sill=d[1]*e.range+e.nugget,e.n=i.length,f=i.length;var w=Array(f*f);for(u=0;u<f;u++){for(g=0;g<u;g++)w[u*f+g]=e.model(Math.pow(Math.pow(i[u]-i[g],2)+Math.pow(t[u]-t[g],2),.5),e.nugget,e.range,e.sill,e.A),w[g*f+u]=w[u*f+g];w[u*f+u]=e.model(0,e.nugget,e.range,e.sill,e.A)}var b=kriging_matrix_add(w,kriging_matrix_diag(n,f),f,f),z=b.slice(0);kriging_matrix_chol(b,f)?kriging_matrix_chol2inv(b,f):(kriging_matrix_solve(z,f),b=z);var w=b.slice(0),K=kriging_matrix_multiply(b,r,f,f,1);return e.K=w,e.M=K,e},x.predict=function(r,i,t){for(var a=Array(t.n),n=0;n<t.n;n++)a[n]=t.model(Math.pow(Math.pow(r-t.x[n],2)+Math.pow(i-t.y[n],2),.5),t.nugget,t.range,t.sill,t.A);return kriging_matrix_multiply(a,t.M,1,t.n,1)[0]},x.variance=function(r,i,t){for(var a=Array(t.n),n=0;n<t.n;n++)a[n]=t.model(Math.pow(Math.pow(r-t.x[n],2)+Math.pow(i-t.y[n],2),.5),t.nugget,t.range,t.sill,t.A);return t.model(0,t.nugget,t.range,t.sill,t.A)+kriging_matrix_multiply(kriging_matrix_multiply(a,t.K,1,t.n,t.n),a,1,t.n,1)[0]},x.grid=function(r,i,t){var a,n,o=r.length;if(0!=o){for(var e,g,l=[r[0][0][0],r[0][0][0]],f=[r[0][0][1],r[0][0][1]],h=0;h<o;h++)for(a=0;a<r[h].length;a++)r[h][a][0]<l[0]&&(l[0]=r[h][a][0]),r[h][a][0]>l[1]&&(l[1]=r[h][a][0]),r[h][a][1]<f[0]&&(f[0]=r[h][a][1]),r[h][a][1]>f[1]&&(f[1]=r[h][a][1]);var u=Array(2),p=Array(2),m=Array(2),_=Array(2),s=Math.ceil((l[1]-l[0])/t),c=Math.ceil((f[1]-f[0])/t),y=Array(s+1);for(h=0;h<=s;h++)y[h]=Array(c+1);for(h=0;h<o;h++){for(m[0]=r[h][0][0],m[1]=m[0],_[0]=r[h][0][1],_[1]=_[0],a=1;a<r[h].length;a++)r[h][a][0]<m[0]&&(m[0]=r[h][a][0]),r[h][a][0]>m[1]&&(m[1]=r[h][a][0]),r[h][a][1]<_[0]&&(_[0]=r[h][a][1]),r[h][a][1]>_[1]&&(_[1]=r[h][a][1]);for(u[0]=Math.floor((m[0]-(m[0]-l[0])%t-l[0])/t),u[1]=Math.ceil((m[1]-(m[1]-l[1])%t-l[0])/t),p[0]=Math.floor((_[0]-(_[0]-f[0])%t-f[0])/t),p[1]=Math.ceil((_[1]-(_[1]-f[1])%t-f[0])/t),a=u[0];a<=u[1];a++)for(n=p[0];n<=p[1];n++)e=l[0]+a*t,g=f[0]+n*t,r[h].pip(e,g)&&(y[a][n]=x.predict(e,g,i))}return y.xlim=l,y.ylim=f,y.zlim=[i.t.min(),i.t.max()],y.width=t,y}},x.contour=function(r,i,t){},x.plot=function(r,i,t,a,n){var o=r.getContext("2d");o.clearRect(0,0,r.width,r.height);for(var e,g,l,f,h=[t[1]-t[0],a[1]-a[0],i.zlim[1]-i.zlim[0]],u=i.length,p=i[0].length,m=Math.ceil(i.width*r.width/(t[1]-t[0])),_=Math.ceil(i.width*r.height/(a[1]-a[0])),s=0;s<u;s++)for(e=0;e<p;e++)null!=i[s][e]&&(g=r.width*(s*i.width+i.xlim[0]-t[0])/h[0],l=r.height*(1-(e*i.width+i.ylim[0]-a[0])/h[1]),(f=(i[s][e]-i.zlim[0])/h[2])<0&&(f=0),1<f&&(f=1),o.fillStyle=n[Math.floor((n.length-1)*f)],o.fillRect(Math.round(g-m/2),Math.round(l-_/2),m,_))},x}(); |