线性回归:简单线性回归详解

2018 年 3 月 10 日 专知 专知内容组

【导读】本文是一篇专门介绍线性回归的技术文章,讨论了机器学习中线性回归的技术细节。线性回归核心思想是获得最能够拟合数据的直线。文中将线性回归的两种类型:一元线性回归和多元线性回归,本文主要介绍了一元线性回归的技术细节:误差最小化、标准方程系数、使用梯度下降进行优化、残差分析、模型评估等。在文末给出了相关的GitHub地址。



Linear Regression — Detailed View

详细解释线性回归


线性回归用于发现目标与一个或多个预测变量之间的线性关系。 有两种类型的线性回归 – 一元线性回归(Simple)和多元线性回归(Multiple)。


一元线性回归




一元线性回归对于寻找两个连续变量之间的关系很有用。一个是预测变量或自变量,另一个是响应或因变量。它寻找统计关系而不是确定性关系。如果一个变量可以被另一个变量精确地表达,那么两个变量之间的关系被认为是确定性的。例如,使用摄氏度的温度,可以准确地预测华氏温度。统计关系在确定两个变量之间的关系时并不准确,例如,身高和体重之间的关系。


线性回归核心思想是获得最能够拟合数据的直线。拟合度最高的直线是总预测误差(所有数据点)尽可能小的直线。误差是用在原始点以及预测点之间的距离来衡量。


完整代码:

https://github.com/SSaishruthi/Linear_Regression_Detailed_Implementation


实例




我们有一个数据集,其中包含有关“学习小时数”与“获得的分数”之间关系的信息。已经观察到许多学生,并记录他们的学习时间和成绩。这将是我们的训练数据。目标是设计一个模型,给定学习时间可以预测成绩。使用训练数据,获得将会给出最小误差的回归线。然后这个线性方程可以用于任何新的数据。也就是说,如果我们将学习时间作为输入,我们的模型应该以最小误差预测它们的分数。


Y(pred)= alpha + beta * x


为了使误差最小化,必须确定alpha和beta。如果平方误差和被用作评估模型的度量,目标是获得最小化这个误差的直线。

如果我们不对这个错误进行平方,那么正面和负面的样本误差就会相互抵消。

为了估计模型的参数alpha和beta,我们已知一组样本(yi, xi)(其中i=1,2,…,n),其计算的目标为最小化残差平方和:

使用微分法求极值:将上式分别对alpha 和 beta 做一阶偏微分,并令其等于0:

此二元一次线性方程组可用克莱姆法则求解,得解

探索

• 如果> 0,则x(预测变量)和y(目标)具有正相关关系,y随x的增加而增加。

• 如果 <0,则x(自变量)和y(目标)具有负相关关系,y随x的增加而减少。

 

探索

• 如果没有这个项,那么拟合线将超过原点。 回归系数和预测都会有偏差。偏置补偿了目标值y的平均值(在训练集)与自变量x平均值和的乘积之间的偏差。


标准方程系数(Co-efficient from Normal equations)



 

除了上述方程外,模型的系数也可以用标准方程计算。

Theta包含所有预测因子的系数,包括常数项。 标准方程通过对输入矩阵取逆来执行计算。 随着函数数量的增加,计算的复杂性将会增加。 当样本特征维数变大时,求逆会比较耗时。


下面是方程的python实现。

def theta_calc(x_train, y_train):
#Initializing all variables
   n_data = x_train.shape[0]
bias = np.ones((n_data,1))
x_train_b = np.append(bias, x_train, axis=1)
#
   theta_1 = np.linalg.inv(np.dot(x_train_b.T,x_train_b))
theta_2 = np.dot(theta_1, x_train_b.T)
theta = np.dot(theta_2,y_train)
#
   return theta


使用梯度下降进行优化




标准方程的复杂性使其难以使用,可以使用梯度下降进行优化。 对损失函数求偏导数,并给出参数的最优系数值。


梯度下降的Python代码


#gradient descent
def grad_descent(s_slope, s_intercept, l_rate, iter_val, x_train, y_train):

for i in range(iter_val):
int_slope = 0
       int_intercept = 0
       n_pt = float(len(x_train))


for i in range(len(x_train)):
int_intercept = - (2/n_pt) * (y_train[i] - ((s_slope * x_train[i]) +
s_intercept))
int_slope = - (2/n_pt) * x_train[i] * (y_train[i] - ((s_slope * x_train[i]) +
s_intercept))

final_slope = s_slope - (l_rate * int_slope)
final_intercept = s_intercept - (l_rate * int_intercept)
s_slope = final_slope
s_intercept = final_intercept


return  s_slope, s_intercept


残差分析




随机性和不可预测性是回归模型的两个主要组成部分。

预测=确定性+统计(Prediction = Deterministic + Statistic)

确定性部分由模型中的预测变量覆盖。随机部分揭示了预期和观测值不可预测的事实。总会有一些信息被忽略。这些信息可以从残差信息中获得。


我们通过一个例子来解释残差的概念。考虑一下,我们有一个数据集,可以预测给定当天气温,其果汁的销售量。从回归方程预测的值总会与实际值有一些差异。销售额与实际产出值不完全匹配。这种差异称为residue


残差示意图有助于使用残差值分析模型。它在预测值和residue之间进行绘制。它们的值是标准化的,该点与0的距离指定了该值的预测有多糟糕。如果该值为正值,则预测值较低。如果该值是负值,那么预测值很高。 0值表示完美的预测。检测残差模式可以改善模型。


残差的特征

• 残差不代表任何模式

• 相邻的残差不应该是相同的,因为它们表明系统漏掉了一些信息。

残差示意图的实现和细节

#Residual plot
plt.scatter(prediction, prediction - y_test, c='g', s = 40)
plt.hlines(y=0, xmin=0, xmax=100)
plt.title('Residual plot')
plt.ylabel('Residual')

模型评估




  • 方差分析

该值的范围从0到1。值“1”表示预测变量完全考虑了Y中的所有变化。值“0”表示预测变量“x”在“y”中没有变化。


总平方和SST (sum of squares for total) 是:

其中

2,回归平方和SSR (sum of squares for regression)

 

 3,残差平方和SSE (sum of squares for error) 是:

 

4,总平方和SST又可写做SSReg和SSE的和:


Python 实现


def rsq(prediction, y_test):
#
   total_data = len(prediction)
#Average of total prediction
   y_avg = np.sum(y_test)/total_data
#total sum of square error
   tot_err = np.sum((y_test-y_avg)**2)
#total sum of squared error of residuals
   res_err = np.sum((y_test-prediction)**2)
#
   r2 = 1 - (res_err / tot_err)
return r2 


#defining slope and intercept value as 0
learning_rate = 0.001
start_slope = 0
start_intercept = 0
iteration = 102
#intial run
grad_slope, grad_intercept = grad_descent(start_slope, start_intercept, learning_rate,
iteration, x_train, y_train)
final_e_value, prediction = mse_calc(grad_slope, grad_intercept, x_test, y_test)
#
print('Slope of the model', grad_slope)
print('Intercept of the model', grad_intercept)
print('Error value of the model', final_e_value)
r2_val = rsq(prediction, y_test)
print('R squared value', r2_val)
#Graph
plt.scatter(x_test, y_test)
plt.plot(x_test, prediction, color='blue', linewidth = 3)
plt.xlabel("Input")
plt.ylabel("Output")
plt.show()


获得回归线:

完整代码:

https://github.com/SSaishruthi/Linear_Regression_Detailed_Implementation


参考链接:https://towardsdatascience.com/linear-regression-detailed-view-ea73175f6e86

-END-

专 · 知

人工智能领域主题知识资料查看获取【专知荟萃】人工智能领域26个主题知识资料全集(入门/进阶/论文/综述/视频/专家等)

同时欢迎各位用户进行专知投稿,详情请点击

诚邀】专知诚挚邀请各位专业者加入AI创作者计划了解使用专知!

请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料

请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!

请加专知小助手微信(Rancho_Fang),加入专知主题人工智能群交流!

点击“阅读原文”,使用专知

登录查看更多
12

相关内容

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。

知识荟萃

精品入门和进阶教程、论文和代码整理等

更多

查看相关VIP内容、论文、资讯等
【哈佛大学】机器学习的黑盒解释性,52页ppt
专知会员服务
168+阅读 · 2020年5月27日
【经典书】机器学习高斯过程,266页pdf
专知会员服务
228+阅读 · 2020年5月2日
《深度学习》圣经花书的数学推导、原理与Python代码实现
专知会员服务
159+阅读 · 2020年1月16日
一文读懂线性回归、岭回归和Lasso回归
CSDN
34+阅读 · 2019年10月13日
sklearn 与分类算法
人工智能头条
7+阅读 · 2019年3月12日
详解常见的损失函数
七月在线实验室
20+阅读 · 2018年7月12日
用Python实现线性回归,8种方法哪个最高效?
七月在线实验室
7+阅读 · 2018年4月19日
概率论之概念解析:极大似然估计
专知
9+阅读 · 2018年1月6日
干货:10 种机器学习算法的要点(附 Python代码)
全球人工智能
4+阅读 · 2018年1月5日
【直观详解】支持向量机SVM
机器学习研究会
18+阅读 · 2017年11月8日
机器学习(13)之最大熵模型详解
机器学习算法与Python学习
7+阅读 · 2017年8月24日
利用TensorFlow实现多元逻辑回归和多元线性回归
数据挖掘入门与实战
5+阅读 · 2017年7月4日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
How to Fine-Tune BERT for Text Classification?
Arxiv
13+阅读 · 2019年5月14日
Arxiv
8+阅读 · 2019年3月21日
Arxiv
3+阅读 · 2017年7月6日
VIP会员
相关资讯
一文读懂线性回归、岭回归和Lasso回归
CSDN
34+阅读 · 2019年10月13日
sklearn 与分类算法
人工智能头条
7+阅读 · 2019年3月12日
详解常见的损失函数
七月在线实验室
20+阅读 · 2018年7月12日
用Python实现线性回归,8种方法哪个最高效?
七月在线实验室
7+阅读 · 2018年4月19日
概率论之概念解析:极大似然估计
专知
9+阅读 · 2018年1月6日
干货:10 种机器学习算法的要点(附 Python代码)
全球人工智能
4+阅读 · 2018年1月5日
【直观详解】支持向量机SVM
机器学习研究会
18+阅读 · 2017年11月8日
机器学习(13)之最大熵模型详解
机器学习算法与Python学习
7+阅读 · 2017年8月24日
利用TensorFlow实现多元逻辑回归和多元线性回归
数据挖掘入门与实战
5+阅读 · 2017年7月4日
相关论文
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
How to Fine-Tune BERT for Text Classification?
Arxiv
13+阅读 · 2019年5月14日
Arxiv
8+阅读 · 2019年3月21日
Arxiv
3+阅读 · 2017年7月6日
Top
微信扫码咨询专知VIP会员