接下来将分为3篇文章完成线性回归算法的相关内容,这是3个文章的整体大纲。python
拿波士顿的房价为例,如今有这么一张图,x轴是房子的面积,y轴是房子的价格,咱们假设房子面积和房屋价格之间呈现线性关系,那么咱们就能够经过线性回归算法对房价进行预测。算法
注意: 这里的图跟以前的KNN算法之间的图是不同的。机器学习
咱们中学学过都知道,一条直线能够表示成:y = ax +b 的形式。函数
线性回归算法就是假设有一条直线能够尽量地拟合咱们的数据,从而经过这么一条直线来进行预测。性能
如今假设咱们找到了最佳拟合的直线方程:学习
y = ax+ b测试
则对于每个样本点优化
根据咱们的直线方程,预测值为: spa
真值为:.net
那么此时,若是此时这条方程是最佳拟合方程,那么:
必然是最小的。
可是咱们通常不采用绝对值的方式,而是采用平方的方式,因此咱们上面的公式能够写成:
拿咱们如今 目标,就是使得:
尽量地小。
又由于
因此,如今,线性回归法的目标就是,找到a和b使得
到这里咱们能够总结一下学习算法的基本思路,就是最优化原理,本质都是经过找到某些参数,让这个损失(其实就是偏差)尽量的小,尽量的拟合全部数据点。
对于这类思想,有一门专门的学科,叫“最优化原理”,还有另一种方法,叫“凸原理”。但愿深耕的朋友能够了解一下。
在求解a和b的以前,咱们要了解一下最小二乘法。
如今咱们要求一个函数的最小值,其实就是这个这个函数的极值。学太高数的朋友都知道, 求函数极值最简单的方法就是对函数中的各个变量进行求导,导数为0的地方就是极值的地方。
敲黑板,敲黑板,这是推导的核心。
so,如今咱们把
简写成
,对它求极值也就是:
好了,先对b求导:
第一步:求导
第三步 : 求出b
求出b后,咱们接下来对a求导:
如今要整理一下这个式子,让a能够单独提取出来:
以后提取出a:
整理后就获得a的表达式:
a求解出来了,可是不够简单,如今咱们要对它再进行变形。
有了这个结论后,咱们就能够对式子进行变形:
最终咱们获得了稍微好看一点的a了:
最终a和b的方程以下:
接下来,要用代码实现一下简单线性回归算法。
这里定义成
SimpleLinearRegression1
是有缘由的,由于后面会进行优化这个算法~这个只是第一版。
class SimpleLinearRegression1:
def __init(self):
self.a_ = None
self.b_ = None
def fit(self,x_train,y_train):
assert x_train.ndim == 1, "Simple Linear Regressor can only solve single 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_i, y_i in zip(x_train, y_train):
num += (x_i - x_mean) * (y_i - y_mean)
d += (x_i - x_mean) ** 2
self.a_ = num / d
self.b_ = y_mean - self.a_ * x_mean
return self
def predict(self,x_predict):
assert x_predict.ndim == 1,\
"Simple Linear Regressor can only solve single feature data"
assert self.a_ is not None and self.b_ is not None,\
"must fit before predict"
return np.array([self._predict(x) for x in x_predict])
def _predict(self,x_single):
return self.a_ * x_single + self.b_
复制代码
只要你把上面看懂了,这个代码没什么难度。 如今咱们测试一下:
因为采用for循环效率是比较低的,因此咱们要把for循环转成采用向量的计算。
能够当作是下面的向量相乘:
而咱们知道,若是把w和v两个向量定义成下图中的样子:
那么此时,公式能够转化成:
这样咱们就可使用numpy
中的向量操做了。
如今咱们也明白了,以前为何必定要把a
简化成这种形式,由于这种形式方便转化成向量。
接下来咱们改造一下以前采用for循环写的线性回归算法:
只要把for循环变成乘就能够了。
接下来,咱们进行两个线性回归算法的性能测试。
对于一个10万的计算量,采用for循环的每一次计算耗时1.1s,而向量才20ms。差距很大。
下一篇,将完成回归算法衡量指标相关内容,加油~
前路漫漫