首页 > 高级民工 > 线性回归

线性回归

2014年11月24日 发表评论 阅读评论

回归的意思就是给定一个训练集合的前提下,找到一个数学函数拟合这些训练集合的过程;线性回归则是需要找的数学函数是一个线性方程。线性回归的算法常用最小二乘法作为损失函数,求解损失函数最小值的方法有:最小二乘法矩阵解法、梯度下降法(批量梯度下降和随机梯度下降)。

 

最小二乘法损失函数,如下式:
costFunction

* 给定训练集合

X = [1 4;2 5;5 1;4 2 ]

y = [19;26;19;20]

1.最小二乘法矩阵解法

normal-eq

上式中theta即是需要求出的线性回归中各项的系数,X是训练集合矩阵,y向量是训练集合中每个的结果。

如果使用Octave计算,则代码为:

theta=pinv(X'*X)*X'*y

需要注意X必须是列满秩,否则(X’*X)得到的矩阵不可逆;不过Octave中pinv对于不可逆的矩阵一样可以计算,是伪逆。

2.梯度下降法

梯度下降法可以分为批量梯度下降法和随机梯度下降法;批量梯度下降法每一次迭代需要把整个训练集合遍历一次;随机梯度则是在每一次迭代中自行指定一条训练集合中的数据不用遍历整个训练集合。

 

要求J(theta)的最小值则求偏导,并对theta进行迭代,至其收敛:

computeTheta

α是学习速率,其作用是避免步长过大时J(theta)无法达到最小值,或步长多短时学习时间较长。另外在实际应用时可以直接另α=α*(1/m),只要给予α恰当的值就不会影响最终结果。

a)批量梯度下降算法 Java版

package com.opsunv.machine.regression;
 
public class BatchGradient {
 
	public static void main(String[] args) {
		//训练集合输入值
		double x[][] = { { 1, 4 }, { 2, 5 }, { 5, 1 }, { 4, 2 } };
		//训练集合期望输出值
		double y[] = { 19, 26, 19, 20 };
		//线性方程参数
		double theta[] = { 0, 0 }; 
		double learningRate = 0.01;
 
		for (int i = 0; i < 100 ; i++) {
			double err_sum = 0;
 
			double[] tmp = new double[theta.length];
			System.arraycopy(theta, 0, tmp, 0, theta.length);
 
			for (int j = 0; j < x.length; j++) {
 
				double h = 0;
				for (int k = 0; k < theta.length; k++) {
					h += x[j][k] * theta[k];
				}
 
				err_sum = h - y[j] ;
 
				for (int k = 0; k < theta.length; k++) {
					//梯度下降 ,这里直接另 α=α*(1/m),所以没有乘 1/m
					tmp[k] -= learningRate * err_sum* x[j][k]; 
				}
			}
 
			//批量更新参数
			theta = tmp;
		}
 
		for(int i=0;i<theta.length;i++){
			System.out.println("theta"+i+"="+theta[i]);
		}
 
	}
}

a)批量梯度下降算法 Octave版

X = [1 4;2 5;5 1;4 2 ];
y = [19;26;19;20];
theta = zeros(2,1);
 
m = length(X);
a = 0.01;
 
for i=1:1000
	h = ((X*theta)-y)';
	theta = theta - (a*(1/m)*h*X)';
end;
 
theta

c)随机梯度下降算法,以后有空再给出。

矩阵解法和梯度下降法的区别是;矩阵解法对于特征向量较少时可以很快的计算出结果,但是有一定局限性如训练集合X必须满足|X|!=0,并且在特征向量较多时速度会很慢,因为求解矩阵的逆的计算是非常耗时的;对于梯度下降法缺点是需要考虑学习速率参数α的大小,并且梯度下降法是一个迭代的过程在一定情况下比最小二乘法慢,不过梯度下降法可以应对更多的情况。

  1. 本文目前尚无任何评论.

点击刷新