概述
线性回归本来是是统计学里的概念,现在经常被用在机器学习中。是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。如果 2 个或者多个变量之间存在“线性关系”,那么我们就可以通过历史数据,摸清变量之间的“套路”,建立一个有效的模型,来预测未来的变量结果。
公式表达,其中y bar 就是我们的预测值。
我们可以使用平方误差来评估实际y值和预测值之间的误差,也就是:
我们的目标就是使该值尽可能的小,将y bar 带入后,可以得到这个式子:
这个函数,我们称之为损失函数,所以最终,我们的目标就是求出合适的a,b来让该式子的值最小。
为了求出这里的a,b 我们可以使用最小二乘法,关于最小二乘法,维基百科上讲的比较全面了:https://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95
通过最小二乘法,我们就可以得到a,b的最终取值了:
相关代码
def fit(self, x_train, y_train):
assert x_train.ndim == 1, \
"Simple Linear Regressor can only solve single feature training data."
assert len(x_train) == len(y_train), \
"the size of x_train must be equal to the size of y_train"
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
num = 0.0
d = 0.0
for x, y in zip(x_train, y_train):
num += (x - x_mean) * (y - y_mean)
d += (x - x_mean) ** 2
self.a_ = num / d
self.b_ = y_mean - self.a_ * x_mean
return self
该fit方法就是计算a与b的过程。当然,为了更好的性能,我们可以使用向量化的写法:
def fit(self, x_train, y_train):
assert x_train.ndim == 1, \
"Simple Linear Regressor can only solve single feature training data."
assert len(x_train) == len(y_train), \
"the size of x_train must be equal to the size of y_train"
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)
self.b_ = y_mean - self.a_ * x_mean
return self