#01 Linear Regression Excise

本文通过实现简单的线性回归模型,介绍了使用梯度下降法进行参数拟合的过程,并采用D语言完成了相关代码实现。此外,还讨论了使用GNUplot进行结果可视化的技巧。

最近一直在看deep learning相关的论文.

虽然从06年到12年的重要论文都扫了一遍, 真的自己干起来还真不知道怎么入手.

总之先从基本开始吧.顺带整理成博客.

另外除了06年开山的两篇论文, 02年还有一篇"自然语言的概率模型"这十分重要的论文,

在搞定了目前基本的deep learning方法后我会实现这些东西, 然后重复12年ng小组的工作.


不过...

想一口就搞定没那么容易, 所以还是慢慢来. 好在大部分都很简单. 教程采用Ng的wiki, 这次是这个

http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex2/ex2.html


提一句, ng全部都用的matlab, 但我不怎么喜欢, 我也不确定matlab能不能用mpi.

因此我会用d语言完成.


首先是最简单的Linear Regression. 用gradient descent来拟合. 很简单, 我们迅速完成它


import std.stdio, std.math, std.conv, std.random, std.string;

class fit{
	float a,b;
	float alpha = 0.07;
	float m;

	float h(float x){
		return a*x+b;
	}

	void update(float x, float y){
		auto y1 = h(x);
		a -= alpha*(y1-y)*x/m;
		b -= alpha*(y1-y)/m;
	}

	this(float m){
		a = uniform(-1,1);
		b = uniform(-1,1);
		this.m = m;
	}
}

int main(){
	float[] x,y;
	foreach(l;File("ex2x.dat").byLine){
		x ~= to!float(strip(cast(string)l));
	}
	foreach(l;File("ex2y.dat").byLine){
		y ~= to!float(strip(cast(string)l));
	}
	auto f = new fit(x.length);
	foreach(k;0..1500){
		foreach(i,v;x){
			f.update(v,y[i]);
		}
		float j=0;
		foreach(i,v;x){
			j += (f.h(v)-y[i])^^2;
		}
		writeln(f.a,"\t", f.b, "\t", j);
	}
	return 0;
}

最后接近收敛时的数据

0.0636027	0.750624	0.0987597
0.0636027	0.750624	0.0987597
0.0636026	0.750624	0.0987597
0.0636026	0.750625	0.0987597
0.0636026	0.750625	0.0987597


用GNUplot画出来




顺带提一句, 自己画图时记得set xrange, 否则会偶尔崩溃.. gnuplot也没那么靠谱, 不过比mac自带的画图方便


补一张J方图


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值