线性回归,实际上是做拟合,即根据样本X和观测值Y,回归出一个公式,使残差的平方和达到最小值。
观测值Y和样本X1……Xn的关系为:
Y=b0+b1x1+……+bnxn
残差平分和为:
通过求导来求极值,对b0,b1….依次求偏导,可得
把负的部分移到等号右边,可得
如果用矩阵A来表示系数,可得
*
等号右边也用矩阵表示,可得
由于Ab=D
b = A-1*D=(X‘X)-1 X’Y
下面给出java版的实现,该实现依赖jama矩阵库
package com.tao.ml;
import Jama.Matrix;
public class LinearRegress {
public static void main(String[] args) {
double[][] x = {
{1,316, 1536, 874, 981},
{1,385, 1771, 777, 1386},
{1,299, 1565, 678, 1672},
{1,326, 1970, 785, 1864},
{1,441, 1890, 785, 2143},
{1,460, 2050, 709, 2176},
{1,470, 1873, 673, 1769},
{1,504, 1955, 793, 2207},
{1,348, 2016, 968, 2251},
{1,400, 2199, 944, 2390},
{1,496, 1328, 749, 2287},
{1,497, 1920, 952, 2388},
{1,533, 1400, 1452, 2093},
{1,506, 1612, 1587, 2083},
{1, 458, 1613, 1485, 2390}
};
Matrix X = new Matrix(x);
double[][] y = {
{3894},
{4628},
{4569},
{5340},
{5449},
{5599},
{5010},
{5694},
{5792},
{6126},
{5025},
{5924},
{5657},
{6019},
{6141}
};
Matrix Y = new Matrix(y);
Matrix Xtrans = X.transpose();
Xtrans.times(X).inverse().times(Xtrans).times(Y).print(1, 8);
}
}