#02 Multi-Linear Regression

来源:互联网 发布:艾默生dcs软件系统 编辑:程序博客网 时间:2024/04/30 13:10

依然是联系, 只不过是多变量的

但这次有点不一样, 因为你不得不normalization


结果是这个样子的

1.92077e+110.05109139-6719.283403101.92102e+110.1108828-6864.043402001.92144e+110.15108512-7010.523400891.92206e+110.2108192-7159.553399761.92286e+110.25107869-7310.783398611.92386e+110.3107541-7464.253397421.92507e+110.35107210-7619.773396211.92649e+110.4106876-7777.233394981.92812e+110.45

程序像这个样子


import std.stdio, std.math, std.conv, std.random, std.string;class fit{float a,b,c;float alpha = 0.7;float m;float h(float x, float y){return a*x+b*y+c;}void update(float x, float y, float z){auto y1 = alpha*(h(x, y)-z)/m;a -= y1*x;b -= y1*y;c -= y1;}this(float m){a = uniform(-1.,1.);b = uniform(-1.,1.);c = uniform(-1.,1.);this.m = m;}}int main(){float[][2] x;float[] y;float[2] mean = 0;foreach(l;File("ex3x.dat").byLine){int k=0;foreach(s;split(l, " ")){if (strip(s).length == 0) continue;x[k] ~= to!float(strip(cast(string)s));mean[k] += x[k][$-1];k=(k+1)%2;}}x[0][] -= mean[0] / x[0].length;x[1][] -= mean[1] / x[1].length;float[2] sig = 0;foreach(i,arr;x) foreach(v;arr){sig[i] += v^^2;}x[0][] /= sqrt(sig[0]/x[0].length);x[1][] /= sqrt(sig[1]/x[1].length);foreach(l;File("ex3y.dat").byLine){ y ~= to!float(strip(cast(string)l));}foreach(alpha;1..31){auto f = new fit(y.length);f.alpha = cast(float)alpha/20.;foreach(k;0..1000){foreach(i,v;y){f.update(x[0][i], x[1][i], v);}}float j=0;foreach(i,v;y){j += (f.h(x[0][i],x[1][i])-v)^^2;}writeln(j,"\t",f.alpha);writeln(f.a,"\t",f.b,"\t",f.c);delete f;}return 0;}

没有内建的矩阵支持还是很痛苦的.

这种小程序我又不想导入gsl. 不过马上就会用到gsl了.

图明天画, 今天收工.




在我这里是0.2最好, 其实和迭代次数有关.

原创粉丝点击