夜星辰:为什么线性回归也是神经网络zhuanlan.zhihu.com
之前写过一篇关于线性回归的文章,是和神经网络一起讲解的。
这次就来仔细探究一下一元线性回归的细节(多元线性回归下回讲)
上面公式不难,初中生都知道,代表的是一条在平面上的线。
而我们的目标是找出最佳的参数a,b使损失函数尽可能小。
上篇文章说了什么是损失函数,这里先将它贴出来
解释一下公式,
是标签,也就是真实值,后面的
其实就是我们预测出来的
。(
)
公式其实还可以写成这样
。
如何找出最佳参数
?
数学家使用的是最小二乘法,直接解出最优参数。(其实还可以用梯度下降法解,梯度下降会专门有一章来讲解,这次重点就是最小二乘法)
最优参数a,b的求解
为了防止你们看推导看睡过去,我就先把结论放上来。
最优的参数a,b计算方法是:
(注释:
是样本的均值)
推导过程
说真的,我懒得打LaTeX,附上手写的丑字。(不想看的直接记住结论就行了,这个可以跳过)
用代码实现一元线性回归
这次使用波士顿房价预测这个数据集。
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
查看数据
boston = load_boston()
x = boston.data[:,5] #RM average number of rooms per dwelling选取房间数目的多少做为一元线性回归的特征
y = boston.target
划分训练集测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2,random_state=666666)
记住公式
计算均值
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
计算参数a,b
a_up = 0.0 #看公式除号上面的部分
a_down = 0.0 #看公式除号下面的部分
for x_data, y_data in zip(x_train,y_train):
a_up += (x_data - x_mean) * (y_data - y_mean)
a_down += (x_data - x_mean)**2
a = a_up / a_down
a
b = y_mean - a * x_mean
b
预测
a * x_test[0] + b
使用sklearn验证一下我们的结果
我们的结果和sklearn一模一样
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x_train.reshape(-1,1),y_train)
lr.predict(x_test.reshape(-1,1))[0]
以上就是一元线性回归的一般过程,下面给出封装好了的代码,你可以跟使用sklearn一样调用它。
import numpy as np
class LinearRegression_1:
def __init__(self):
self._x_train = None
self._y_train = None
self.a_ = None
self.b_ = None
def fit(self,x_train,y_train):
self._x_train = x_train
self._y_train = y_train
x_mean = np.mean(self._x_train)
y_mean = np.mean(self._y_train)
a_up = 0.0
a_down = 0.0
for x, y in zip(self._x_train,self._y_train):
a_up += (x - x_mean) * (y - y_mean)
a_down += (x - x_mean)**2
self.a_ = a_up / a_down
self.b_ = y_mean - self.a_ * x_mean
return self
def predict(self,x_data):
return np.array([self._predict(x) for x in x_data])
def _predict(self,x):
return self.a_ * x + self.b_
def __repr__(self):
return "LinearRegression_1()"