您的位置:首页 > 编程语言 > Java开发

线性回归的java实现

2015-08-28 20:20 507 查看
线性回归

梯度下降法

在选定线性回归模型后,只需要确定参数θ,就可以将模型用来预测。然而θ需要在J(θ)最小的情况下才能确定。因此问题归结为求极小值问题,使用梯度下降法。梯度下降法最大的问题是求得有可能是全局极小值,这与初始点的选取有关。

梯度下降法是按下面的流程进行的:

1)首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。

2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。

梯度方向由J(θ)对θ的偏导数确定,由于求的是极小值,因此梯度方向是偏导数的反方向。结果为




迭代更新的方式有两种,一种是批梯度下降,也就是对全部的训练数据求得误差后再对θ进行更新,另外一种是增量梯度下降,每扫描一步都要对θ进行更新。前一种方法能够不断收敛,后一种方法结果可能不断在收敛处徘徊。
本版本的java代码使用是第二种,也称随机梯度下降,每次只用一个样本进行梯度更新。


public class Line_Regression_wx {

public static void main(String args[]) throws IOException {
BufferedReader br = IOUtil.getReader("C:/test.txt", IOUtil.UTF8);
String s = "";
Double ct[] = new Double[3];// 配置需要多少个参数,数据多少列就配置多少个参数
for (int i = 0; i < ct.length; i++) {
ct[i] = 0.0;// 初始化所有参数为0
}
// 训练数据:3,1,5
while ((s = br.readLine()) != null) {

ct = line_regression(s, 0.001, ct);
// System.out.println("ct1"+ct[1]);
}
// 输出训练出来的参数
for (int i = 0; i < ct.length; i++) {
System.out.println(ct[i]);
}

}

public static Double[] line_regression(String s, double afa, Double ct[]) {
String st[] = s.split(",");
Double x[] = new Double[st.length];
// 需要学习的参数
// System.out.println("x.length="+x.length);
double a = afa;// 学习速率
// x[0]=1.0;
for (int c = 0; c < x.length; c++) {
x[c] = Double.parseDouble(st[c]);
// System.out.println(x[c]);
}
Double y = Double.parseDouble(st[st.length - 1]);
// System.out.println(y);

// 根据参数求出预测的Y
// Y=ct0+ct1*x[0]+ct2*x[1]
Double Y = 0.0;
for (int i = 0; i < ct.length; i++) {
Y += ct[i] * x[i];
}
// Y=Y+ct[0];
// 梯度下降法更新每个参数
for (int j = 0; j < ct.length; j++) {
ct[j] = ct[j] + a * (y - Y) * x[j];
}

return ct;
}

}


这里我没有使用ct0这个值

需要的jar包,还有数据可到这里下载

http://pan.baidu.com/s/1ntMRdlZ

预设的y=x1+2x2+3x3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息